gpt4 book ai didi

python - 拟合分段线性函数时的曲线拟合优化误差

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:10 25 4
gpt4 key购买 nike

我在两个数组中有一些数据,其中似乎有中断。我想让我的代码找出在 scipy 中使用 piecewise 的突破点。这是我所拥有的:

from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.array([7228,7620,7730,7901,8139,8370,8448,8737,8824,9089,9233,9321,9509,9568,9642,9756,9915,10601,10942], dtype=np.float)
y= np.array([.874,.893,.8905,.8916,.9095,.9142,.9109,.9185,.9169,.9251,.9290,.9304,.9467,.9378,0.9464,0.9508,0.9583,0.9857,0.9975],dtype=np.float)

def piecewise_linear(x, x0, y0, k1, k2):
return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])

p , e = optimize.curve_fit(piecewise_linear, x, y)
perr = np.sqrt(np.diag(e))
xd = np.linspace(7228, 11000, 3000)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))

我的问题是,如果我运行它,我会得到一个错误,“OptimizeWarning:无法估计参数的协方差 category=OptimizeWarning)”。不确定如何解决这个问题?有没有办法将初始参数输入此函数以帮助它收敛或类似?

请注意,我确实意识到我可以使用的另一种方法是插值并找到我的数据的二阶导数。我已经这样做了,但是因为我的数据不是均匀分布的/y 轴数据有一些错误我有兴趣让它以这种方式工作以及用于统计目的。所以,要清楚,我在这里想要的是两条线的参数(斜率/截距)和拐点。 (理想情况下,我也希望在这些问题上也出现错误,但不确定这种方法是否可行。)提前致谢!

最佳答案

代码运行良好,只有初始值导致问题。

默认 curve_fit 以所有参数设置为 1 开始。因此,x0 开始时超出数据中 x 的范围,优化器无法计算合理的梯度.这个小修改将解决这个问题:

# make sure initial x0 and y0 are in range of the data
p0 = [np.mean(x), np.mean(y), 1, 1]

p , e = optimize.curve_fit(piecewise_linear, x, y, p0) # set initial parameter estimates
perr = np.sqrt(np.diag(e))
xd = np.linspace(7228, 11000, 3000)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))

print(p) # [ 9.32099947e+03 9.32965835e-01 2.58225121e-05 4.05400820e-05]
print(np.diag(e)) # [ 4.56978067e+04 5.52060368e-05 3.88418404e-12 7.05010755e-12]

enter image description here

关于python - 拟合分段线性函数时的曲线拟合优化误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45091604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com