V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeeReamond
V2EX  ›  程序员

好用的曲线平滑算法?

  •  
  •   LeeReamond · 2022-07-18 08:36:44 +08:00 · 3374 次点击
    这是一个创建于 855 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    实际需求:搜峰。

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

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