gpt4 book ai didi

python - SciPy medfilt 错误结果

转载 作者:太空狗 更新时间:2023-10-29 22:11:15 28 4
gpt4 key购买 nike

嗨,Python 爱好者!

我目前正在研究信号过滤,并决定使用 SciPy。没什么特别的,只是日常工作的自动化。

所以,这是代码

from scipy.signal import medfilt
print(medfilt([2,6,5,4,0,3,5,7,9,2,0,1], 5))

但问题是返回的序列计算错误

SciPy: [ 2. 4. 4. 4. 4. 4. 5. 5. 5. 2. 1. 0.]
Me : [ 5. 4.5 4. 4. 4. 4. 5. 5. 5. 2. 1.5 1.]

似乎是,包的开发人员搞砸了一个细节。当孔径(SciPy 中的内核)大于要分析的窗口时,还有另一种过滤规则。

例如,kernel=5 过滤后的 [2, 6, 5] 子序列的中位数为 5 而不是 2,因为 SciPy 计算出来的不是吗?同样,如果子序列 [2,6,5,4]kernel=5 中位数是 5 和 4,我们需要在它们之间取平均值,所以,中位数是 4.5。

谁能告诉我在这种情况下谁的结果是正确的?

最佳答案

我相信您和 SciPy 的结果都是正确的。不同之处在于边界处发生的事情,但我相信您和 SciPy 都做出了正确的选择。

问题是当您的滑动窗口位于边缘并且没有有效数据可用于填充您的滑动窗口时会发生什么

您选择取滑动窗口有效部分的中值,这是有道理的,但可能会增加一些偏差,因为与所有其他点相比,您的边缘点过多。

SciPy 相反选择通过填充零来扩展任一边缘的信号。所以,在边界上,SciPy 本质上是在计算

>>> np.median([0, 0, 2, 6, 5])
2.0
>>> np.median([0, 2, 6, 5, 4])
4.0
>>> np.median([9, 2, 0, 1, 0])
1.0
>>> np.median([2, 0, 1, 0, 0])
0.0

SciPy 这样做的原因几乎肯定与速度有关:它针对多次重复做同样的事情进行了优化,并且为一大堆 5 元素优化 median 要容易得多数组,而不是针对一大堆 5 元素数组以及两个 4 元素数组和两个 3 元素数组进行优化。肯定有人认为它不应该用零填充,而应该用边界值填充,但应该注意的是,没有边界策略是完美的;处理边界问题的理想方法将取决于您的特定信号。

如果您看到 Wikipedia's description of median filters ,它们通过用边缘处的值填充信号来扩展任一边缘处的信号,这似乎也是合理的。他们还注意到处理边界问题的其他三种方法:

  • 避免处理边界,之后裁剪或不裁剪信号边界。
  • 从信号中的其他地方获取条目。以图像为例,可能会选择远离水平或垂直边界的条目。
  • 缩小边界附近的窗口,使每个窗口都充满(正如您所做的那样。)

最后,您确实需要尝试不同的选项,看看哪种选项最适合您的信号。这种过滤的一个核心假设是您的信号将非常大,并且边界问题永远不会那么关键(因为大部分信号不存在于边界上)。不过,如果 SciPy 允许您选择它在边界处应该做什么,那就太好了!

关于python - SciPy medfilt 错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585706/

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