当使用curve_fitfrom scipy.optimize来拟合python中的某些数据时,首先定义拟合函数(例如二阶多项式),如下所示:
def f(x, a, b):
return a*x**2+b*x
popt, pcov = curve_fit(f,x,y)但现在的问题是,如果函数包含一个整数(或一个离散的和),如何在第1点定义函数,例如:

实验数据仍然给出了x和f(x),所以第2点就像我想象的一样,我可以在python中定义f(x).顺便说一下,我忘了说假设g(t)在这里有一个众所周知的形式,并且包含拟合参数,即在多项式例子中给出的像a和b这样的参数.任何帮助深表感谢.问题实际上应该是通用的,而帖子中使用的函数只是随机的例子.
我在3D空间中有一组x,y,z点,另一个变量叫做charge表示在特定的x,y,z坐标中沉积的电荷量.我想对这个数据进行加权(通过检测器中沉积的电荷量加权,这对应于更高的重量以获得更多电荷),使得它通过给定点即顶点.
现在,当我为2D做这个时,我尝试了各种方法(将顶点带到原点并对所有其他点进行相同的变换,并强制拟合穿过原点,给出顶点非常高的权重)但是没有一个像Jaime在这里给出的答案一样好:如何用固定点进行多项式拟合
它使用拉格朗日乘数的方法,我从本科高级多变量课程中模糊地熟悉,但其他并不多,看起来这个代码的转换就像添加az坐标一样简单.(请注意,即使代码没有考虑到沉积的电荷量,它仍然给我最好的结果).我想知道是否有相同算法的版本,但是在3D中.我还在Gmail中联系了答案的作者,但没有收到他的回复.
以下是有关我的数据的更多信息以及我在2D中尝试做的事情:如何权衡散点图中的点以获得拟合?
这是我执行此操作的代码,其中我强制顶点位于原点,然后适合数据设置fit_intercept=False.我目前正在研究2D数据的这种方法,因为我不确定拉格朗日乘数是否有3D版本,但是在3D中有线性回归方法,例如,这里:在3D中拟合一条线:
import numpy as np
import sklearn.linear_model
def plot_best_fit(image_array, vertexX, vertexY):
weights = np.array(image_array)
x = np.where(weights>0)[1]
y = np.where(weights>0)[0]
size = len(image_array) * len(image_array[0])
y = np.zeros((len(image_array), len(image_array[0])))
for i in range(len(np.where(weights>0)[0])):
y[np.where(weights>0)[0][i]][np.where(weights>0)[1][i]] = np.where(weights>0)[0][i]
y = y.reshape(size)
x = np.array(range(len(image_array)) * len(image_array[0]))
weights = weights.reshape((size))
for i in range(len(x)):
x[i] -= vertexX
y[i] -= vertexY
model = sklearn.linear_model.LinearRegression(fit_intercept=False)
model.fit(x.reshape((-1, 1)),y,sample_weight=weights)
line_x = np.linspace(0, 512, 100).reshape((-1,1))
pred …Run Code Online (Sandbox Code Playgroud) 我花了相当多的时间试图找到一种简单的方法来做到这一点 - 理想情况下,一个神奇的图书馆存在于那里,它将采用我的3D数据点并使用正交的最佳拟合线返回2个点回归或最小二乘并且还返回拟合线的误差.这样的事情是否存在,若然,在哪里?
自从我参加Python演讲以来,我想用它来拟合我的数据.虽然我现在已经尝试了一段时间,但我仍然不知道为什么这不起作用.
从子文件夹中获取一个接一个的数据文件(此处称为'Test'),稍微转换数据并使用Lorentzian函数拟合.
当我运行下面发布的代码时,它不适合任何东西,只是在4次函数调用后返回我的初始参数.我想缩放数据,以玩耍ftol和maxfev一遍又一遍地检查Python文档后,但没有好转.我也尝试将列表更改为numpy.arrays明确,以及给出问题的解决方案scipy.optimize.leastsq返回最佳猜测参数,而不是新的最佳拟合,x = x.astype(np.float64).没有得到改善.奇怪的是,对于少数选定的数据文件,这些相同的代码在某些时候起作用,但对于大多数人来说,它从未这样做过.它绝对可以装,因为Levenberg-Marquard装配程序在Origin中给出了相当好的结果.
有人能告诉我出了什么问题或指出替代方案......?
import numpy,math,scipy,pylab
from scipy.optimize import leastsq
import glob,os
for files in glob.glob("*.txt"):
x=[]
y=[]
z=[]
f = open(files, 'r')
raw=f.readlines()
f.close()
del raw[0:8] #delete Header
for columns in ( raw2.strip().split() for raw2 in raw ): #data columns
x.append(float(columns[0]))
y.append(float(columns[1]))
z.append(10**(float(columns[1])*0.1)) #transform data for the fit
def lorentz(p,x):
return (1/(1+(x/p[0] - 1)**4*p[1]**2))*p[2]
def errorfunc(p,x,z):
return lorentz(p,x)-z
p0=[3.,10000.,0.001]
Params,cov_x,infodict,mesg,ier = leastsq(errorfunc,p0,args=(x,z),full_output=True)
print Params
print …Run Code Online (Sandbox Code Playgroud) 我有一些我适合使用scipy.stats的gamma分布.我能够提取形状,位置和比例参数,它们看起来与我期望的数据范围合理.
我的问题是:有没有办法在参数中得到错误?类似于curve_fit的输出.注意:我不直接使用曲线拟合,因为它不能正常工作,并且大多数时间都无法计算伽马分布的参数.另一方面,scipy.stats.gamma.fit工作正常.
这是我正在做的一个例子(没有我的实际数据).
from scipy.stats import gamma
shape = 12; loc = 0.71; scale = 0.0166
data = gamma.rvs(shape, loc=loc, scale=scale, size=1000)
params = gamma.fit(data) # params close to but not the same as (shape, loc, scale)
# HOW TO ESTIMATE/GET ERRORS FOR EACH PARAM?
Run Code Online (Sandbox Code Playgroud)
提前致谢
我的信号分析课程老师给了我一些我必须执行的Matlab代码才能完成一个家庭作业.我一直在使用GNU Octave没有麻烦,但这一次有这个命令令我头疼.
[c8,g8]=fit(time, sin_4_harmonic,’fourier8’)
Run Code Online (Sandbox Code Playgroud)
我找不到GNU Octave中的"fit"函数,它在下面的url http://www.mathworks.se/help/curvefit/fit.html中为Matlab引用
有谁知道我应该加载哪个包,或者是否有任何等价物?
谢谢=)
我想使用lmfit 将椭圆测量数据拟合到复杂模型中.两个测量参数,psi和delta是复杂函数中的变量rho.
我可以尝试用共享参数或picewise方法将问题分离到实部和虚部,但是有没有办法直接用复杂函数来做?仅适合函数的实部工作,但是当我定义复杂的残差函数时,我得到:
TypeError:没有为复数定义排序关系.
下面是我的实际功能拟合代码和我尝试解决复杂的拟合问题:
from __future__ import division
from __future__ import print_function
import numpy as np
from pylab import *
from lmfit import minimize, Parameters, Parameter, report_errors
#=================================================================
# MODEL
def r01_p(eps2, th):
c=cos(th)
s=(sin(th))**2
stev= sqrt(eps2) * c - sqrt(1-(s / eps2))
imen= sqrt(eps2) * c + sqrt(1-(s / eps2))
return stev/imen
def r01_s(eps2, th):
c=cos(th)
s=(sin(th))**2
stev= c - sqrt(eps2) * sqrt(1-(s/eps2))
imen= c + …Run Code Online (Sandbox Code Playgroud) 我正在使用 scipy.optimize 的east_squares 方法来执行约束非线性最小二乘优化。我想知道如何获取拟合参数的协方差矩阵,以便获得拟合参数的误差线?
对于curve_fit和lesssq来说,这似乎非常清楚,但对于 east_squares 方法来说,则不太清楚(至少对我来说)。
我一直在做的一种方法是,因为我知道least_squares返回雅可比矩阵J(这是“jac”返回值),那么我所做的就是用2*J^T J近似Hessian H。最后,协方差矩阵是 H^{-1},因此大约是 (2*J^TJ)^{-1},但我担心这对协方差的近似可能太粗糙?
python curve-fitting scipy data-fitting non-linear-regression
我正在尝试使用python将一些数据拟合到幂律中.问题是我的一些点是上限,我不知道如何包含在拟合例程中.
在数据中,我把上限作为y中的误差等于1,其余的则小得多.您可以将此错误设置为0并更改uplims列表生成器,但随后拟合非常糟糕.
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from scipy.odr import *
# Initiate some data
x = [1.73e-04, 5.21e-04, 1.57e-03, 4.71e-03, 1.41e-02, 4.25e-02, 1.28e-01, 3.84e-01, 1.15e+00]
x_err = [1e-04, 1e-04, 1e-03, 1e-03, 1e-02, 1e-02, 1e-01, 1e-01, 1e-01]
y = [1.26e-05, 8.48e-07, 2.09e-08, 4.11e-09, 8.22e-10, 2.61e-10, 4.46e-11, 1.02e-11, 3.98e-12]
y_err = [1, 1, 2.06e-08, 2.5e-09, 5.21e-10, 1.38e-10, 3.21e-11, 1, 1]
# Define upper limits
uplims = np.ones(len(y_err),dtype='bool')
for i in range(len(y_err)):
if y_err[i]<1:
uplims[i]=0
else:
uplims[i]=1
# …Run Code Online (Sandbox Code Playgroud) 我的 X_test 数据帧的列的名称/顺序是否必须与我用于拟合的 X_train 相同?
下面是一个例子
我正在训练我的模型:
model.fit(X_train,y)
Run Code Online (Sandbox Code Playgroud)
在哪里X_train=data['var1','var2']
但在预测过程中,当我使用:
model.predict(X_test)
Run Code Online (Sandbox Code Playgroud)
X_test定义为:X_test=data['var1','var3']
其中var3可能是与 完全不同的变量var2。
是否predict假设 与中的第二列var3相同?var2X_test
如果什么:
X_live被定义为:X_live=data['var2','var1']
预测会知道重新排序 X 以使它们正确排列吗?