【发布时间】:2017-12-18 21:13:08
【问题描述】:
我在两个数组中有一些数据,其中似乎有中断。我希望我的代码通过在 scipy 中使用分段来找出中断的位置。这是我所拥有的:
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: Covariance of the parameters could not beested category=OptimizeWarning)"。不知道如何解决这个问题?有没有办法将初始参数输入这个函数以帮助它收敛或类似的?
注意,我确实意识到我可以让它工作的另一种方法是插值并找到我的数据的二阶导数。我已经这样做了,但是因为我的数据间隔不均匀/ y 轴数据有一些错误,所以我有兴趣让它以这种方式工作以及用于统计目的。所以,要清楚,我在这里想要的是两条线的参数(斜率/截距)和拐点。 (理想情况下,我也希望在这些方面也出现错误,但不确定这种方法是否可行。)提前致谢!
【问题讨论】:
标签: python scipy curve-fitting piecewise