【问题标题】:Find areas in discrete data, which can be approximated by lines在离散数据中查找区域,可以用线来近似
【发布时间】:2015-12-20 17:11:55
【问题描述】:

我有一个离散函数 y(n), n=1..8000 有两个区域,可以用几乎水平的直线来近似,如图所示。

我想找到这些区域与功能快速增长部分相交的点的坐标 x1、x2。在 Matlab 中,y(n) 是一维向量。

【问题讨论】:

  • 您可以对数据做出哪些假设?总会有两个平坦的部分吗?平面部分会不会有小尖刺?扁平部件有最小保证尺寸吗?
  • 是的,两个平坦的部分将永远是,没有任何尖峰,并且它们的坡度与陡峭部分的坡度相比会很小。平面部分的最小尺寸约为 600。Here,我将变量 y 保存到 mat 文件中。
  • 你应该看看衍生品 (diff)。在平坦部分它将(大约)为零,并且在 x1 和 x2 处它会突然发生强烈变化。然后您可以使用findpeaks 来定位这些峰。它可能需要一些用户指定的阈值来区分实际峰值与噪声或斜率的微小变化。您也可以自动执行此操作,但我不确定这是否值得。
  • 在这种情况下,我会先做一个 y 值的直方图,以粗略估计平坦部分的截止值,然后执行稳健回归。

标签: matlab math


【解决方案1】:

如果数据集非常平滑,可以使用简单的微分幅度检测器。

如果可能出现一些噪声峰值和小的假前沿,你最好使用更鲁棒的方法,例如

为 x1 选择一些初始值(例如,600)
计算范围 1..x1 的线性回归参数 y = a*x + b
如果斜率参数a足够小,则增加x1并重复计算
如果斜率大于某个合理的阈值,则减小 x1 并重复。

二分搜索算法是达到所需 x1 值的相当快的方法。

对 x2..N 范围执行相同操作。

【讨论】:

  • 我试过这个方法,效果很好。尽管正如 PatronBernard 和 RPM 所提到的,导数比数据更为突出。所以,我计算了梯度(y)的回归参数。
【解决方案2】:

正如@PatronBernard 所提到的,您可以查看跟踪的导数,知道一旦您不再处于平坦位,导数就会偏离零。这将涉及手动选择一个阈值,该阈值可能必须为每个新迹线完成,并且对迹线中的噪声很敏感。这是一个实现,还显示了嘈杂的跟踪可能会遇到的问题:

threshold = 0.2;
y1 = diff(y)/(x(2) - x(1));
y2 = diff(y1)/(x(2) - x(1));

figure;
hold on
plot(x,y, 'b')
xi = find(y1>threshold,1);
line([x(xi) x(xi)], ylim, 'Color', 'r')
xi = find(flipud(y1)>threshold,1);
line([x(length(x) - xi + 1) x(length(x) - xi + 1)], ylim, 'Color', 'r')

或者,如果您有真正嘈杂的数据,我建议您查看 IEC 标准 60469:2013“转换、脉冲和相关波形 - 术语、定义和算法”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多