【发布时间】:2022-01-18 23:59:35
【问题描述】:
我正在尝试制作由 3 个部分组成的分段线性拟合,其中第一个和最后一个部分是恒定的。正如你在这张图中看到的
没有得到预期的拟合,因为拟合没有从原始数据点清晰地捕捉到 3 个线性部分。
我已经尝试关注this question 并将其扩展为 3 件和两个常数件的情况,但我一定做错了什么。
这是我的代码:
from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
plt.rcParams['figure.figsize'] = [16, 6]
x = np.arange(0, 50, dtype=float)
y = np.array([50 for i in range(10)]
+ [50 - (50-5)/31 * i for i in range(1, 31)]
+ [5 for i in range(10)],
dtype=float)
def piecewise_linear(x, x0, y0, x1, y1):
return np.piecewise(x,
[x < x0, (x >= x0) & (x < x1), x >= x1],
[lambda x:y0, lambda x:(y1-y0)/(x1-x0)*(x-x0)+y0, lambda x:y1])
p , e = optimize.curve_fit(piecewise_linear, x, y)
xd = np.linspace(0, 50, 101)
plt.plot(x, y, "o", label='original data')
plt.plot(xd, piecewise_linear(xd, *p), label='piecewise linear fit')
plt.legend()
对前面提到的question 的公认答案建议查看segments_fit.ipynb 对于 N 部分的情况,但之后我似乎无法指定第一个和最后一个部分应该是恒定的。
此外,我确实收到以下警告:
OptimizeWarning: Covariance of the parameters could not be estimated
我做错了什么?
【问题讨论】:
-
请提供您的情节中的“原始数据”。
-
“原始数据”是存储在我提供的代码中的变量 x 和 y 中的值。运行代码应该会产生情节。
-
有噪音吗?如果是这样,可以在第 16 页上找到一个不错的解决方案 here
-
是的,我真正想要拟合的数据中有噪音,但我在代码中提供的模拟数据中没有。也许在模拟数据中不包括噪声是一个糟糕的选择。我只是想在拟合真实数据之前让它工作。
标签: python numpy scipy curve-fitting piecewise