分段拟合不起作用 - 大型数据集

时间:2018-03-27 17:04:23

标签: python numpy scipy

我一直在使用在堆栈溢出的几个地方找到的解决方案来拟合分段函数:

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

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15], dtype=float)
y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03])

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)
xd = np.linspace(-5, 30, 100)
plt.plot(x, y, ".")
plt.plot(xd, piecewise_linear(xd, *p))
plt.show()

(例如,这里:How to apply piecewise linear fit in Python?

我第一次在控制台中尝试使用OptimizeWarning。

OptimizeWarning: Covariance of the parameters could not be estimated
  category=OptimizeWarning)

在那之后我只是为了我的健康得到一条直线。似乎数据显然没有跟随,但我无法弄清楚原因。

My data and the fitted trend line

对于我使用的数据集,每个x和y大约有3200个点,这是问题的一部分吗?

以下是一些模拟我的假数据(同样的问题出现在哪里不是分段):

x = np.append(np.random.uniform(low=10.0, high=40.2, size=(1500,)), np.random.uniform(low=-10.0, high=20.2, size=(1500,)))
y = np.append(np.random.uniform(low=-3000, high=0, size=(1500,)), np.random.uniform(low=-2000, high=1000, size=(1500,)))

2 个答案:

答案 0 :(得分:0)

只需通过上述评论中提供的答案完成问题:

问题不在于大量的积分,而是因为我在y轴上有如此大的值。由于默认初始值为1,因此我的大约1000的值太大。为了解决这个问题,将线条拟合的初始猜测用于参数p0。从scipy.optimize.curve_fit的文档看起来像:

p0:无,标量或N长度序列,可选 参数的初始猜测。如果为None,则初始值将全为1(如果可以使用内省确定函数的参数数量,否则会引发ValueError。)

所以我的最终代码最终看起来像这样:

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

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15], dtype=float)
y = np.array([500, 700, 900, 1100, 1300, 1500, 2892, 4281, 5670, 7059, 8447, 9836, 11225, 12614, 14003])

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, p0=(10, -2500, 0, -500))
xd = np.linspace(-5, 30, 100)
plt.plot(x, y, ".")
plt.plot(xd, piecewise_linear(xd, *p))
plt.show()

答案 1 :(得分:0)

只是为了好玩(非常分散的情况):

enter image description here

由于原始数据不可用,由于图形扫描和蓝色像素的记录,点的坐标是从Rachel W问题中公布的图中获得的。由于直线和网格在扫描后呈现白色,因此它们是一些人工制品。

在上图中,分段回归(两段)的结果用红色绘制。

拟合函数的等式是: enter image description here

使用的回归方法不是迭代的,不需要初始猜测。代码非常简单:本文第12-13页https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf