当前位置: 首页 > 知识库问答 >
问题:

我如何将两个线性函数拟合到一组数据点?

严瑞
2023-03-14

我有一组数据点,看起来有点像一条线,在开始附近有一条曲线。请看下面的图像,它显示了具有最佳拟合线的点(拟合到整个数据集)。

相反,它们可以用两个线性函数来描述(一条线穿过最左边的一组点,另一条线穿过其余的数据点)。这些点实际上对应的是中子衰变,它包含两种不同的同位素。

我不知道哪个点对应哪个同位素,所以我需要以某种方式做出最好的猜测。一种同位素的曲线将是一条直线,另一种同位素的曲线将是一条不同的直线。我如何将两条不同的最佳拟合线(线性)拟合到数据点集,以便对两者的拟合都是优化的?

我的一个想法是选择一个“截断点”,例如在t=100(x轴)处,并将左边的点与一条线相匹配,将右边的点与另一条线相匹配。然后,我可以计算两条线的chi^2,以便得到合适的“好”。然后,我可以用稍微不同的截止点重复做同样的事情很多次,直到我找到一对给出最佳整体匹配的线。

另一个似乎更受关注的想法是将这些数据点描述为两条线的组合,y=m1*t+m2*t+b1+b2,其中ms是斜率,bs是y截取。然后,取总曲线的导数,得到dy/dt=m1+m2。然后,我也许可以循环不同的“截断点”,并拟合到行,直到得到一个导数最接近m1+m2的组合。但我不确定如何做到这一点,因为我最初不是处理一条曲线,而是一堆离散的数据点。

在Python中对两个合适的对象进行优化的最佳方法是什么?

共有1个答案

柯波峻
2023-03-14

这可以解释为一个结合线性回归的时间序列分割问题。有多种方法来解决这个问题。其中一个是您已经提到的:手动选择的数据分段点,另一个是试图最小化错误。

首先,我尝试重新创建数据:

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)))

然后,我使用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]

绘制如下图:

plt.scatter(x, y)
plt.plot(x1, m1 * x1 + c1, 'r')
plt.plot(x2, m2 * x2 + c2, 'r')
plt.show()

您现在可以使用像SWAB这样的自动分割算法来替换[100:][:100]切片,但是如果您能够手动决定在哪一点分割数据,我建议您不要这样做。如果您正在寻找实现,请查看提供的链接。

 类似资料:
  • 问题内容: 有没有一种快速的方法来将一个数组的值组合为另一个数组的键? 输入: 预期产量: 我该怎么办? 问题答案: 会完全按照您的意愿做。 引用手册: 通过将keys数组中的值用作键,并将values数组中的值用作对应值来创建数组。 对于您的情况,您必须执行以下操作: 当然,您也可以使用各种循环组合来做到这一点,这可能是最简单的解决方案。

  • 我有一个初始数据帧 。我从中提取两个数据帧,如下所示: 我想将< code>A和< code>B组合成一个数据帧。数据的顺序并不重要。但是,当我们对来自< code>D的< code>A和< code>B进行采样时,它们会保留来自< code>D的索引。

  • 我试着在谷歌上搜索,但无法找到解决方案。合并两个< code >数组 投入- 预期产出- 谁能解释一下如何使用Java在Spark中实现这一点?

  • 问题内容: 我有两个像 我希望它们合并成单个数组 问题答案: 您需要该方法。

  • 问题内容: 对于一个学校项目,我试图证明经济遵循相对正弦曲线的增长方式。除了它的经济性(公认的 狡猾)之外,我还在构建一个python模拟程序,以显示即使我们让某种程度的随机性成立,我们仍然可以产生相对 正弦的东西。我对自己生成的数据感到满意,但现在我想找到某种方法来获取与数据非常匹配的正弦图。我知道您 可以进行多项式拟合,但是您可以进行正弦拟合吗? 感谢您的帮助。让我知道您是否想查看代码的任何部

  • 问题内容: 这是在采访中问我的,这是我提供的解决方案: 有没有更有效的方法可以做到这一点? 编辑:更正的长度方法。 问题答案: 稍有改进,但是在主循环之后,当到达另一个输入数组的末尾时,可以用来复制其中一个输入数组的结尾。但是,那不会改变你解决方案的性能特征。

  • 我建立了一个连接到两个集合并将其存储在两个数组中,但我无法访问它,因为它是异步的。 此外,我还想执行类似于从学生中选择滚动的操作 db.student.find({},{roll:1,_id:0}); 但实现这一点并不奏效,它只是从集合中获取所有内容。 我试过使用Async/Await,但它不起作用。 我尝试实现async(npm模块),并使用async.Series方法,但没有成功。 对cons

  • 问题内容: 我需要一个将所有元​​素组合在一起的新数组,即 做这个的最好方式是什么? 对不起,我忘了,这些ID永远不会匹配,但是从技术上讲,这些名称可能会出现,但不可能出现,它们都必须列在一个数组中。我查看了array_merge,但不确定这是否是最佳方法。另外,您将如何对此进行单元测试? 问题答案: 效率更高,但有两种选择: