cur*_*smo 5 python curve-fitting data-fitting
我有一组数据点,它们看起来有点像一条在开头附近带有曲线的线。请参阅下图,其中显示了具有最佳拟合线(适合整个数据集)的点。
相反,它们可以用两个线性函数来描述(一条穿过最左边的一组点的线和一条穿过其余数据点的单独的线)。这些点实际上对应的是中子衰变,其中包含两种不同的同位素。
我不知道哪些点对应于哪种同位素,所以我需要以某种方式做出最好的猜测。一种同位素的曲线将是一条直线,而另一种同位素的曲线将是不同的直线。如何将两条不同的最佳拟合线(线性)拟合到数据点集,以便优化两者的拟合?
我的一个想法是选择一个“截止点”,例如在t=100(x 轴)处,并将左侧的点拟合为一条线,将右侧的点拟合为另一条线。然后我可以计算两条线的 chi^2 以获得拟合的“优点”。然后,我可以继续用略有不同的截止点多次做同样的事情,直到我找到提供最佳整体拟合的那对线。
另一个似乎更复杂的想法是将这些数据点描述为两条线的组合y= m1*t + m2*t + b1 + b2,其中ms 是斜率,bs 是 y 截距。然后,取总曲线的导数,我会有dy/dt = m1+m2. 然后也许我可以循环通过不同的“截止点”,并拟合线,直到我得到一个组合,其中导数最接近m1+m2. 但我不确定如何做到这一点,因为我最初没有使用一条曲线,只是一堆离散数据点。
在 Python 中优化两个拟合的最佳方法是什么?
这可以解释为时间序列分割问题与线性回归的结合。有多种方法可以解决这个问题。您已经提到过其中之一:手动选择对数据进行分段的点,另一个是尝试最小化错误。
首先我尝试重新创建数据:
import numpy as np; import matplotlib.pyplot as plt
y1 = np.linspace(5.5, 3.7, num=100)
y1 = y1 + np.random.rand(y1.shape[0]) * np.linspace(0, .3, num=y1.shape[0])
y2 = np.linspace(3.7, 1.1, num=500)
y2 = y2 + np.random.rand(y2.shape[0]) * np.linspace(0.3, 1.9, num=y2.shape[0])
y = np.append(y1, y2)
x = np.array(range(len(y)))
Run Code Online (Sandbox Code Playgroud)
然后我使用numpy.linalg.lstsq它本身基于最小二乘法进行两次线性拟合:
x1 = x[:100]
y1 = y[:100]
A1 = np.vstack([x1, np.ones(len(x1))]).T
m1, c1 = np.linalg.lstsq(A1, y1, rcond=None)[0]
x2 = x[100:]
y2 = y[100:]
A2 = np.vstack([x2, np.ones(len(x2))]).T
m2, c2 = np.linalg.lstsq(A2, y2, rcond=None)[0]
Run Code Online (Sandbox Code Playgroud)
绘制结果如下图所示:
plt.scatter(x, y)
plt.plot(x1, m1 * x1 + c1, 'r')
plt.plot(x2, m2 * x2 + c2, 'r')
plt.show()
Run Code Online (Sandbox Code Playgroud)
您现在可以使用像SWAB这样的自动分割算法来替换[100:]和[:100]切片,但如果您能够手动决定何时分割数据,我建议您不要这样做。如果您正在寻找实现,请查看提供的链接。
从形式上讲,您提到的第二种方法本质上是尝试将数据拟合到圆锥曲线上。本质上,一对直线(POSL)是一种圆锥曲线,因此可以用一般圆锥曲线方程来表示ax^2 + by^2 + 2hxy + 2gx + 2fy + c = 0(而不是您在问题中提到的方程,它最终会成为一条斜率直线)米1+米2)。为了澄清,肯定会有一个上面形式的方程,绘制时给出适合您的数据的 POSL。你的算法是否能够收敛到它是另一回事。
您可以尝试使用方法来求系数 a、b、h、g、f 和 c。理想情况下,您获得的圆锥曲线系数将形成 POSL,它非常适合您的数据集。
如果你决定实现这个,你必须记住这个一般方程可以表示很多形状,如抛物线、双曲线等。训练后你可能会发现回归被卡住了,或者没有。 t 收敛并呈现不同的形状,如抛物线。您可以尝试通过奖励遵守回归方法中圆锥曲线成为 POSL 所需的这些条件来将回归推向 POSL 形状。但这可能会使事情变得过于复杂。
这种方法在数学上非常简洁,但我敢打赌,尝试让训练好的模型收敛到 POSL 相当于在刀刃上平衡某些东西(POSL 的条件本质上非常狭窄)。最有可能的是,它最终会为您提供抛物线、椭圆或双曲线的方程(这可能最终足以充分拟合您的数据集,甚至使非最佳二次曲线回归解决方案也值得)。
不过,如果您对结果不满意,那么更好的方法可能就是停止担心形状并使用神经网络进行这种形式的非线性回归。或者您可以关注肘点并按照第一种方法中的建议划分数据集。
| 归档时间: |
|
| 查看次数: |
3060 次 |
| 最近记录: |