我正在尝试为我的脚本生成的一些数据找到最适合的线。这就是我所拥有的:
import numpy as np
import scipy as sp
.
.
.
def func(x, a, b, c):
return a*np.exp(-b*x) + c
popt, pcov = sp.optimize.curve_fit(func, numgelt, turnsG)
Run Code Online (Sandbox Code Playgroud)
我不断收到此错误:
ValueError: operands could not be broadcast together with shapes (0) (26)
Run Code Online (Sandbox Code Playgroud)
我已经检查过,两个数组(numgelt 和turnsG)的大小绝对相同。我还确保条目是浮动的。谢谢你!
我有一个深色图像(原始格式),并绘制了图像和图像的分布。正如您所看到的,16 处有一个峰值,请忽略它。我想通过这个直方图拟合高斯曲线。我使用这种方法来拟合:
Un-normalized Gaussian curve on histogram。然而; 我的高斯拟合从来没有接近它应该的样子。我在将图像转换为正确的绘图格式时是否做错了什么,或者还有其他问题吗?

这是我用来生成此数据的当前代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def fitGaussian(x,a,mean,sigma):
return (a*np.exp(-((x-mean)**2/(2*sigma))))
fname = 'filepath.raw'
im = np.fromfile(fname,np.int16)
im.resize([3056,4064])
plt.figure()
plt.set_cmap(viridis)
plt.imshow(im, interpolation='none', vmin=16, vmax=np.percentile(im.ravel(),99))
plt.colorbar()
print 'Saving: ' + fname[:-4] + '.pdf'
plt.savefig(fname[:-4]+'.pdf')
plt.figure()
data = plt.hist(im.ravel(), bins=4096, range=(0,4095))
x = [0.5 * (data[1][i] + data[1][i+1]) for i in xrange(len(data[1])-1)]
y = data[0]
popt, pcov = curve_fit(fitGaussian, x, y, [500000,80,10])
x_fit = py.linspace(x[0], x[-1], 1000) …Run Code Online (Sandbox Code Playgroud) 我有一个代码并使用 curve_fit 将洛伦兹曲线和高斯曲线拟合到数据。我需要获得输出的每个参数的错误估计,因此打印了 popt 和 pcov 我知道 scipy 参考指南说明了如何使用 pcov 矩阵来查找错误,但这对我来说不清楚,因为我是编程新手。谢谢
对于我的学士论文,我正在研究一个项目,我想对一些数据进行拟合。问题有点复杂,但我试图在这里最小化问题:
我们有三个数据点(可用的理论数据很少),但这些点高度相关。
使用 curve_fit 来拟合这些点,我们得到了一个可怕的拟合结果,正如您在这张图中看到的那样。(通过手动更改拟合参数可以轻松改善拟合)。
我们的拟合结果具有相关性(蓝色)和被忽略的相关性(橙色):
当我们使用更多参数时,结果会更好(因为那时拟合的行为本质上就像求解一样)。
我的问题:为什么会出现这种行为?(我们使用自己的最小二乘算法来解决我们的特定问题,但它也遇到了同样的问题)。这是一个数值问题,还是有什么充分的理由让 curve_fit 显示这个解决方案?
我很高兴能有一个很好的解释来说明为什么我们不能使用“仅 2 个”参数来拟合这三个高度相关的数据点。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
plt.rcParams['lines.linewidth'] = 1
y = np.array([1.1994, 1.0941, 1.0047])
w = np.array([1, 1.08, 1.16])
cor = np.array([[1, 0.9674, 0.8812],[0.9674, 1, 0.9523], [0.8812, 0.9523, 1]])
s = np.array([0.0095, 0.0104, 0.0072])
def f(x, a, b):
return a + b*x
cov = np.zeros((3,3))
for i in range(3):
for j in range(3):
cov[i,j] = cor[i,j] * s[i] * s[j]
A1, …Run Code Online (Sandbox Code Playgroud) 我无法让这个棚车适合工作......我得到“ OptimizeWarning:无法估计参数的协方差类别= OptimizeWarning)”,并且输出系数没有改善超出起始猜测。
import numpy as np
from scipy.optimize import curve_fit
def box(x, *p):
height, center, width = p
return height*(center-width/2 < x)*(x < center+width/2)
x = np.linspace(-5,5)
y = (-2.5<x)*(x<2.5) + np.random.random(len(x))*.1
coeff, var_matrix = curve_fit(box, x, y, p0=[1,0,2])
Run Code Online (Sandbox Code Playgroud)
输出系数是[ 1.04499699, 0., 2.],并不是说第三个系数没有改变。
我怀疑这个函数形式不适合 curve_fit 使用的 levenberg-marquardt 算法,这有点烦人,因为我喜欢这个函数。相反,在 mathematica 中指定蒙特卡罗优化是微不足道的。
当尝试绘制一组数据的指数曲线时:
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
from matplotlib import pylab
import numpy as np
from scipy.optimize import curve_fit
x = np.array([30,40,50,60])
y = np.array([0.027679854,0.055639098,0.114814815,0.240740741])
def exponenial_func(x, a, b, c):
return a*np.exp(-b*x)+c
popt, pcov = curve_fit(exponenial_func, x, y, p0=(1, 1e-6, 1))
xx = np.linspace(10,60,1000)
yy = exponenial_func(xx, *popt)
plt.plot(x,y,'o', xx, yy)
pylab.title('Exponential Fit')
ax = plt.gca()
fig = plt.gcf()
plt.xlabel(r'Temperature, C')
plt.ylabel(r'1/Time, $s^-$$^1$')
plt.show()
Run Code Online (Sandbox Code Playgroud)
上述代码的图表:
但是,当我添加数据点20(x) 和0.015162344(y) 时:
import matplotlib
import matplotlib.pyplot …Run Code Online (Sandbox Code Playgroud) 我试图将一些数据拟合到具有两个自变量的非线性模型中,但是两个自变量的向量长度xdat小于ydat.
这是密切相关的这样一个问题:Python的curve_fit具有多个独立变量,但要求是xdat和ydat不同的尺寸似乎打破东西。
让我们以 xnx 的示例解决方案为例,但更改其中一个数组的长度:
import numpy as np
from scipy.optimize import curve_fit
def func(X, a, b, c):
x,y = X
return np.log(a) + b*np.log(x) + c*np.log(y)
# some artificially noisy data to fit
x = np.linspace(0.1,1.1,101)
y = np.linspace(1.,2., 90) #I have changed the length of one of these arrays
a, b, c = 10., 4., 6.
z = func((x,y), a, b, c) * 1 + np.random.random(101) / 100 …Run Code Online (Sandbox Code Playgroud) 我有一组数据点(代码中的 x 和 y)。我想绘制这些点,并为它们拟合一条曲线,显示使 y = 100.0 所需的 x 值(y 值是百分比)。这是我尝试过的,但我的曲线是 3 次多项式(我知道这是错误的)。对我来说,数据看起来是对数的,但我现在知道如何将对数曲线与我的数据进行多重拟合。
import numpy as np
import matplotlib.pyplot as plt
x = np.array([4,8,15,29,58,116,231,462,924,1848])
y = np.array([1.05,2.11,3.95,7.37,13.88,25.46,43.03,64.28,81.97,87.43])
for x1, y1 in zip(x,y):
plt.plot(x1, y1, 'ro')
z = np.polyfit(x, y, 3)
f = np.poly1d(z)
for x1 in np.linspace(0, 1848, 110):
plt.plot(x1, f(x1), 'b+')
plt.show()
Run Code Online (Sandbox Code Playgroud)
我是 Python 新手(以及一般编程),想使用 进行多项式拟合curve_fit,其中多项式的顺序(或拟合参数的数量)是可变的。
我制作了这段代码,它适用于固定数量的 3 个参数 a,b,c
# fit function
def fit_func(x, a,b,c):
p = np.polyval([a,b,c], x)
return p
# do the fitting
popt, pcov = curve_fit(fit_func, x_data, y_data)
Run Code Online (Sandbox Code Playgroud)
但是现在我想让我的 fit 函数只依赖于一些N参数而不是a,b,c,....
我猜这不是一件很难的事情,但由于我的知识有限,我无法让它发挥作用。
我已经看过这个问题,但我无法将它应用于我的问题。
我正在尝试使用scipy.optimize.curve_fit. 我已经阅读了文档和这篇 StackOverflow 帖子,但似乎都没有回答我的问题。
我有一些简单的 2D 数据,它们看起来近似于一个三角函数。我想使用scipy.
我的方法如下:
from __future__ import division
import numpy as np
from scipy.optimize import curve_fit
#Load the data
data = np.loadtxt('example_data.txt')
t = data[:,0]
y = data[:,1]
#define the function to fit
def func_cos(t,A,omega,dphi,C):
# A is the amplitude, omega the frequency, dphi and C the horizontal/vertical shifts
return A*np.cos(omega*t + dphi) + C
#do a scipy fit
popt, pcov = curve_fit(func_cos, t,y)
#Plot fit …Run Code Online (Sandbox Code Playgroud) curve-fitting ×10
python ×8
scipy ×5
matplotlib ×2
data-fitting ×1
data-science ×1
numpy ×1
physics ×1
python-3.x ×1