Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 检测数据集中线性行为的算法_Matlab - Fatal编程技术网

Matlab 检测数据集中线性行为的算法

Matlab 检测数据集中线性行为的算法,matlab,Matlab,不久前,我发布了一个关于的问题,并收到了一些关于做我想做的事情的建议。但我现在面临另一个问题,我试图运用答案中提出的想法。 我的目标是找到数据集的最佳线性拟合,其中只有一部分是线性的 以下是我必须做的一个例子: 我们有这两个数据集,我必须对虚线左侧的数据的线性部分做一个线性趋势。在红色中,我们有一个理想的数据集,从开始到虚线都有一个线性部分。在蓝色中,我们有一个“有问题”的数据集,它有一个平台。粗体部分是我用来做数据线性拟合的部分 我的问题是,我试图按照上面链接的问题中提到的那样做:我找到了平滑

不久前,我发布了一个关于的问题,并收到了一些关于做我想做的事情的建议。但我现在面临另一个问题,我试图运用答案中提出的想法。 我的目标是找到数据集的最佳线性拟合,其中只有一部分是线性的

以下是我必须做的一个例子:

我们有这两个数据集,我必须对虚线左侧的数据的线性部分做一个线性趋势。在红色中,我们有一个理想的数据集,从开始到虚线都有一个线性部分。在蓝色中,我们有一个“有问题”的数据集,它有一个平台。粗体部分是我用来做数据线性拟合的部分

我的问题是,我试图按照上面链接的问题中提到的那样做:我找到了平滑数据的二阶导数,并在其“不够接近”0时进行了查看。但以下是我对有问题的数据集(第一幅图像)和理想数据集(第二幅图像)的结果:

(抱歉质量问题,我不知道为什么它这么模糊) 在这两幅图像上,我分别绘制了一阶导数和红色的二阶导数。在第一幅图像上,我们看到了二阶导数的峰值。但问题是峰值不是很“高”,因此很难建立一个阈值来判断集合是否为线性。。。相反,一阶导数的峰值相当高,因此很容易在视觉上看到

我认为计算一阶导数值的平均值,看看值与平均值相差太大就足够了。。。但是,当我取一阶导数的平均值,以查看值与平均值的差异时,由于峰值的存在,有一种偏移


如何去除该偏移量,以便仅获取峰值右侧数据的平均值(图像1上显示的不连续点左侧的数据可能是非线性或线性的,但与右侧的值不同!)

平均值操作符(正如您所注意到的)对异常值(峰值)非常敏感。您可能希望使用更稳健的估计值,例如
中值
或值的x百分位数(这应该更适合您的情况)。

您如何计算导数?数字微分如果做得不正确,会增加很多噪音。我首先平滑原始数据(使用合适的低通滤波器),然后使用样条曲线插值,然后取样条曲线的导数。这会给你一个更平滑的导数近似值,在这个近似值中,你的峰值应该更容易检测到。@FlorianBrucker,我可以用两种方法来实现它。第一种方法(我用来绘制这些图的方法)是用类似于
dy=diff(平滑(y))的方法来估计导数;dx=diff(x);dydx=dy./dx;dx2=(dx(1:end-1)+dx(2:end))/2;d2ydx2=diff(dydx)。/dx2第二个是您刚才提到的方法。奇怪的是,第一种方法给出了更好的结果……似乎你知道你感兴趣的终点。因此,最好只取端点而不是平均值。在获取端点之前,可能会稍微平滑数据。--此外,还要确保您的算法以正确的方式处理具有趋势的线性区域。