有一个名为cftool的曲线拟合工具箱的工具箱功能,可以让曲线拟合到一维数据.二维数据有什么用吗?
我试图拟合一个函数,它将输入2个独立变量x,y和3个参数作为输入a,b,c.这是我的测试代码:
import numpy as np
from scipy.optimize import curve_fit
def func(x,y, a, b, c):
return a*np.exp(-b*(x+y)) + c
y= x = np.linspace(0,4,50)
z = func(x,y, 2.5, 1.3, 0.5) #works ok
#generate data to be fitted
zn = z + 0.2*np.random.normal(size=len(x))
popt, pcov = curve_fit(func, x,y, zn) #<--------Problem here!!!!!
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:"func()正好接受5个参数(给定51个)".怎么能正确地传递我的论证x,y?
我正在尝试使用Scipy拟合对数正态分布.我之前已经使用Matlab完成了它,但由于需要将应用程序扩展到统计分析之外,我正在尝试在Scipy中重现拟合值.
下面是我用来拟合数据的Matlab代码:
% Read input data (one value per line)
x = [];
fid = fopen(file_path, 'r'); % reading is default action for fopen
disp('Reading network degree data...');
if fid == -1
disp('[ERROR] Unable to open data file.')
else
while ~feof(fid)
[x] = [x fscanf(fid, '%f', [1])];
end
c = fclose(fid);
if c == 0
disp('File closed successfully.');
else
disp('[ERROR] There was a problem with closing the file.');
end
end
[f,xx] = ecdf(x);
y = 1-f;
parmhat = lognfit(x); % …Run Code Online (Sandbox Code Playgroud) 当我将数据放入nlme中时,我第一次尝试都没有成功,而且nlme(fit.model)习惯了以下情况:
Error in nlme.formula(model = mass ~ SSbgf(day, w.max, t.e, t.m), random = list( :
step halving factor reduced below minimum in PNLS step
Error in MEestimate(nlmeSt, grpShrunk) :
Singularity in backsolve at level 0, block 1
Run Code Online (Sandbox Code Playgroud)
所以我回去
1)更改x轴的单位(例如,从年到天,或者从天到成长度天)。
2)在我的数据集中进行ax = 0,y = 0的测量
3)添加一个 random=pdDiag()
4)缺乏随机性和固定性
5)整理我的数据集,并尝试在不同时间拟合不同的部分
6)实现非常简单的拟合,然后使用update来使模型正确
最终似乎有些工作。还有其他人要添加到此列表吗?什么可以帮助您使nlme处理数据?
我意识到这个问题可能会结束,但是如果对如何改写SO可以接受的任何建议,我将不胜感激。
这是一个示例,其中我尝试了其中一些操作,但到目前为止还没有成功:
数据:https : //www.dropbox.com/s/4inldx7617fip01/proots.csv。这只是整个集合的一部分。
代码:
roots<-read.table("proots.csv", header = TRUE)
#roots$day[roots$year == 2007] <- 0 #when I use a dataset with time=0, mass=0
roots$day[roots$year …Run Code Online (Sandbox Code Playgroud) 我有一个理论上用二次多项式描述的数据集.我想要适应这些数据,我已经习惯numpy.polyfit了.但是,缺点是返回系数的误差不可用.因此我决定使用适合的数据scipy.odr.奇怪的是,多项式的系数彼此偏离.
我不明白这一点,因此决定在我生成自己的一组数据上测试两个拟合例程:
import numpy
import scipy.odr
import matplotlib.pyplot as plt
x = numpy.arange(-20, 20, 0.1)
y = 1.8 * x**2 -2.1 * x + 0.6 + numpy.random.normal(scale = 100, size = len(x))
#Define function for scipy.odr
def fit_func(p, t):
return p[0] * t**2 + p[1] * t + p[2]
#Fit the data using numpy.polyfit
fit_np = numpy.polyfit(x, y, 2)
#Fit the data using scipy.odr
Model = scipy.odr.Model(fit_func)
Data = scipy.odr.RealData(x, y)
Odr = scipy.odr.ODR(Data, Model, [1.5, …Run Code Online (Sandbox Code Playgroud) 我知道有与此相关的线程,但是我对我想要将数据适合的位置感到困惑。
我的数据就这样导入并绘制了。
import matplotlib.pyplot as plt
%matplotlib inline
import pylab as plb
import numpy as np
import scipy as sp
import csv
FreqTime1 = []
DecayCount1 = []
with open('Half_Life.csv', 'r') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
FreqTime1.append(row[0])
DecayCount1.append(row[3])
FreqTime1 = np.array(FreqTime1)
DecayCount1 = np.array(DecayCount1)
fig1 = plt.figure(figsize=(15,6))
ax1 = fig1.add_subplot(111)
ax1.plot(FreqTime1,DecayCount1, ".", label = 'Run 1')
ax1.set_xlabel('Time (sec)')
ax1.set_ylabel('Count')
plt.legend()
Run Code Online (Sandbox Code Playgroud)
问题是,我在设置一般指数衰减时遇到困难,其中我不确定如何从数据集中计算参数值。
如果可能的话,我也想让拟合衰减方程的方程与图形一起显示。但是,如果能够产生配合,则可以很容易地应用它。
编辑 ------------------------------------------------- ------------
所以当使用Stanely R提到的拟合函数时
def model_func(x, a, k, b):
return a * …Run Code Online (Sandbox Code Playgroud) 我有一个模型方程式,我们称它为eq_m:
我知道我的数据集如下,因此我试图将数据拟合到eq_m,以便可以使用拟合的参数来预测新数据。
但是,此eq_m是非线性的,因此我使用scipy的curve_fit来获取lambda,mu,sigma参数值,并使用以下代码段:
opt_parms, parm_cov = o.curve_fit(eq_m, x, y,maxfev=50000)
lamb , mu, sigm = opt_parms
Run Code Online (Sandbox Code Playgroud)
我在应该遵循该模型的各种数据组上运行此模型,而55/60则给了我很好的结果,但是其余5组非常适合,并且预测的参数具有高正值。有没有办法使用scipy / numpy或scikit-learn来规范曲线拟合并惩罚高幅值参数值?
我的主管建议使用共轭先验,但我不知道如何在此处这样做。
谁能帮我这个忙吗?如果我必须提供解决这个问题的猜测,是否可以有人告诉我如何计算这些猜测?
python curve-fitting scipy scikit-learn non-linear-regression
我想用积分函数拟合数据(截断的伽玛分布).我尝试了以下代码,但发生了错误.如果你能帮助我,我感激不尽.非常感谢你提前.
%matplotlib inline
import numpy as np
from scipy import integrate
import scipy.optimize
import matplotlib.pyplot as plt
xlist=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14]
ylist=[1.0, 0.7028985507246377, 0.4782608695652174, 0.36231884057971014,
0.2536231884057971, 0.1811594202898551, 0.12318840579710147,
0.08695652173913046, 0.057971014492753645, 0.04347826086956524,
0.02173913043478263, 0.007246376811594223]
xdata=np.array(xlist)
ydata=np.array(ylist)
parameter_initial=np.array([0.0,0.0,0.0])#a,b,c
def func(x,a,b,c):
return integrate.quad(lambda t:t^(a-1)*np.exp(-t),x/c,b/c)/integrate.quad(lambda t:t^(a-1)*np.exp(-t),0.0,b/c)
parameter_optimal,cov=scipy.optimize.curve_fit(func,xdata,ydata,p0=parameter_initial)
print "paramater =", paramater_optimal
y = func(xdata,paramater_optimal[0],paramater_optimal[1],paramater_optimal[2])
plt.plot(xdata, ydata, 'o')
plt.plot(xdata, y, '-')
plt.show()
Run Code Online (Sandbox Code Playgroud)
发生以下错误.
ValueError: The truth value of an array with more than one element is ambiguous. …Run Code Online (Sandbox Code Playgroud) 我有一组尺寸标注N点,k作为size的矩阵N X k。
如何通过这些点找到最佳拟合线?该线的k尺寸将是一个平面(曲面)。它将具有k系数和一个偏差项。
现有的函数fit似乎仅可用于2维或3维点。
我有一些数据点,想找到一个拟合函数,我想一个累积的高斯S型函数就可以拟合,但是我真的不知道如何实现。
这就是我现在所拥有的:
import numpy as np
import pylab
from scipy.optimize
import curve_fit
def sigmoid(x, a, b):
y = 1 / (1 + np.exp(-b*(x-a)))
return y
xdata = np.array([400, 600, 800, 1000, 1200, 1400, 1600])
ydata = np.array([0, 0, 0.13, 0.35, 0.75, 0.89, 0.91])
popt, pcov = curve_fit(sigmoid, xdata, ydata)
print(popt)
x = np.linspace(-1, 2000, 50)
y = sigmoid(x, *popt)
pylab.plot(xdata, ydata, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 1.05)
pylab.legend(loc='best')
pylab.show()
Run Code Online (Sandbox Code Playgroud)
但是我收到以下警告:
... / scipy / optimize / minpack.py:779:OptimizeWarning:无法估计参数的协方差category = OptimizeWarning)
有人可以帮忙吗?我也愿意尝试其他任何方式!我只需要一条曲线以任何方式拟合此数据。
curve-fitting ×10
python ×7
scipy ×7
numpy ×4
matlab ×3
data-fitting ×1
integrate ×1
matplotlib ×1
nlme ×1
r ×1
scikit-learn ×1
statistics ×1