好用的曲线平滑算法?

2022-07-18 08:36:44 +08:00
 LeeReamond

联动上一贴:https://www.v2ex.com/t/866781

实际需求:搜峰。

衍生需求:根据楼里老哥回复,大概是需要对曲线进行平滑以后才好进行搜峰。但是通常来说的平滑算法,比如以一个 1*3 的[1,1,1]卷积核做平滑,感觉平滑效果上不是很好,另外如果要大量计算的话速度也需要考虑在内。请问有什么性能和效果都比较好的搜峰算法么?直接算邻域平均感觉太原始了,这么多年算法发展应该有更好的选择吧。。

3412 次点击
所在节点    程序员
10 条回复
tcp
2022-07-18 08:39:49 +08:00
可以参照 p5.js 的 peak detection
secsilm
2022-07-18 08:45:49 +08:00
tensorboard 的平滑算法,有一个平滑系数,可以搜一搜。之前我也挺感兴趣,后来忙的没再研究了。
h272377502
2022-07-18 09:15:32 +08:00
试试 EMA
lingxipaofan
2022-07-18 09:51:12 +08:00
单看你发的曲线,平滑度没啥问题,搜峰就行,找到合适阈值。真想做滤波,看看信号处理相关的。
blueperson
2022-07-18 11:37:07 +08:00
我觉得问题还是在于峰的定义. 以前我也碰到到跟你差不多的需求, X 光衍射图寻峰. 主要问题是, 你是想消除噪声, 还是找出所有的 local maximum. 如果要消除噪声, 就要先确定, 第一, 这个图像是有噪声的, 其次, 定义噪声类型. "消除噪声"后, 一般就平滑了. 然后再找局部极大值.
qwq11
2022-07-18 12:04:15 +08:00
两次 rolling mean 一般就够平滑了,就是你说的卷积
你说的峰值是极大值点?差分之后左右邻域异号,左正右负不就是了,你在这时候做 rolling mean 还更方便,时间上也就 o(n),再把各个极大值点拿出来比较一下就出来了
CFM880
2022-07-18 12:45:09 +08:00
1.算术滑动平均法(平均移动法)
2.重心法
3.多项式最小二乘拟合法,
4.其他
离散函数褶积滑动变换法
傅里叶变换法
necomancer
2022-07-18 13:39:00 +08:00
1.试试其他卷积核,比如钟形窗
2.如果是分布数据,别用 histogram ,试试不同 bw 的 kde
LeeReamond
2022-07-19 01:36:50 +08:00
@necomancer 大佬,bw 不同的 kde 什么意思,看不懂
necomancer
2022-07-19 11:08:43 +08:00
@LeeReamond kernal density estimation ,你就简单理解是和 histogram 差不多的东西就行。我看你引用的帖子里是颜色分布,分布一般用 histogram 直方图,binsize 不一样结果差异很大。kde 也是用来求解分布的,只是他用一个核函数,histogram 可以粗略一点理解是用一个宽度是 binsize 的方波函数当 kernel ,kde 一般用 gauss 当核函数,相比 histogram 求出的分布本身就会更加的连续和平滑,bw 可以理解为 kernel 函数的“binsize”,具体你可以参考一下 scipy 的 gaussian_kde ,一般默认参数的输出结果就会很好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866884

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX