前段时间我发布了一个关于 Algorithm to make a polynomial fit of a part of a data set 的问题,并收到了一些建议来做我想做的事。但是我现在面临另一个问题,我尝试应用答案中建议的想法。
我的目标是找到数据集的最佳线性拟合,其中只有一部分是线性的。
这是我必须做的一个例子:
我们有这两个数据集,我必须对虚线左侧的数据的线性部分进行线性趋势。红色,我们有理想的数据集,从头到虚线都有一个线性部分。在蓝色中,我们有“有问题”的数据集,它有一个平台期。粗体部分是我必须用来对数据进行线性拟合的部分。
我的问题是,我试图按照上面链接的问题中提到的那样做:我找到了平滑数据的二阶导数,并查看了它何时不是“足够接近”的 0。但这是我对有问题的数据集的结果(第一张图片)和理想数据集(第二张图片):
(对不起质量,我不知道为什么它这么模糊)
在这两个图像上,我绘制了一阶导数和红色的二阶导数。在第一张图像上,我们看到二阶导数值的峰值。但问题是峰值不是很高,因此很难建立一个阈值来判断集合是否是线性的......相反,一阶导数的峰值非常高,使得它容易在视觉上看到。
我认为计算一阶导数值的平均值并查看该值何时与平均值相差太大就足够了......但是当我取一阶导数值的平均值以查看哪里值与平均值不同,由于峰值存在某种偏移。
如何去除此偏移量以仅取右侧数据的平均值(在图像 1 上看到的不连续性左侧的数据可能是非线性的,也可能是线性的,但与以下位置的值具有不同的值正确的!)的高峰有效?
最佳答案
mean
运算符(如您所见)是 对异常值(峰值)非常敏感的 。您可能希望使用更强大的估计器,例如 median
或值的 x 百分位数(这应该更适合您的情况)。
关于matlab - 检测数据集中线性行为的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17652128/