gpt4 book ai didi

python - 在 Numpy 数组中找到高原

转载 作者:行者123 更新时间:2023-12-03 23:14:37 24 4
gpt4 key购买 nike

我正在寻找一种有效的方法来检测原本非常嘈杂的数据中的平稳期。高原总是相对广泛的这个数据可能是什么样子的一个简单例子:

test=np.random.uniform(0.9,1,100)
test[10:20]=0
plt.plot(test)

enter image description here

请注意,可能存在多个具有不同值的平台(应全部检测到)。

我试过使用 scipy.signal.argrelextrema,但它似乎没有做我想要的:
peaks=argrelextrema(test,np.less,order=25)
plt.vlines(peaks,ymin=0, ymax=1)

enter image description here

我不需要高原的确切间隔 - 粗略的范围估计就足够了,只要该估计大于或等于实际的高原范围。然而,它应该是相对有效的。

最佳答案

这实际上只是一个“愚蠢”的机器学习任务。您需要编写一个自定义函数来筛选它们。高原有两个关键特征:

  • 它们是相同值的连续出现(或非常接近)。
  • 第一个和最后一个点分别与向前和向后移动平均线有很大的偏差。 (如果您期望加性噪声,请尝试根据标准偏差对此进行量化,对于几何噪声,您也必须考虑信号的幅度。)

  • 然后,一个简单的循环应该足以计算正向移动平均线、该正向移动平均线中的点的 stdev、反向移动平均线以及该反向移动平均线中的点的 stdev。
  • 阅读直到找到一个远离常规噪声的点(与方差相比)。开始将这些索引缓冲到列表中。
  • 当它们具有相同的值(或几乎相同,如果您的平台可能有点粗糙;您需要使用一些容差加上您的平台的标准偏差,或者只是一些容差,如果你希望他们都表现得相似)。
  • 如果缓冲区中点的方差太高,则不是平稳状态,而是太粗糙;扔掉它,然后从您当前的位置重新开始扫描。
  • 如果最后一个值与前一个值非常不同(按照触发您的代码开始缓冲索引的更改顺序)并且与原始冲动的方向相反,请在此处限制您的缓冲区;你那里有一个高原。
  • 现在对这些索引处的点做任何你想做的事情。删除它们,用两个边界点之间的线性插值替换它们,无论如何。

  • 我可以产生一些噪音并给你一些示例代码,但这确实是你必须适应你的应用程序的东西。 (例如,这种方法有一个缺点,即捕获“悬崖边缘”中间点的高原在移除高原的其余部分时可能会离开该点。如果这是你担心的事情,你在识别高原后,我必须做更多的探索。)您应该能够在一次遍历数据中完成此操作,但首先获取整个集合的一些统计数据以智能地调整阈值可能是明智的。

    如果你对什么构成高原有一个准确的定义,你可以让它不那么笨拙和看起来像机器学习,但只要你试图识别模糊模式,你就必须进行统计——基于方法。

    关于python - 在 Numpy 数组中找到高原,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53492508/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com