V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AlwaysBee
V2EX  ›  机器学习

如何截取完整的波形图,请教一下各位(关于机器学习、特征提取、时间序列)

  •  
  •   AlwaysBee · 121 天前 · 2031 次点击
    这是一个创建于 121 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做机器学习相关的事情,但遇到了如下问题,导致训练出来的模型识别准确度一般

    数据波形图如上图所示,我目前是通过滑动窗口来进行截取的,我的预期是截取下来的数据是红色框框的这种(两边平缓、中间波动较大),我目前的截取条件是超过阈值就自动截取

    注:窗口大小是固定的

    但由于条件可能过于单一,也有一定的概率截取到黑色框框的这种类型的数据

    本人在数据分析和机器学习上,基本上是小白,问题描述可能也比较不专业,所以在此请教一下 V 友,这种时间序列的数据,应该如何进行特征提取

    29 条回复    2024-07-24 20:34:12 +08:00
    ipwx
        1
    ipwx  
       121 天前
    不懂,红框和黑框有啥区别。

    你先想办法把你的场景讲清楚
    AlwaysBee
        2
    AlwaysBee  
    OP
       121 天前
    @ipwx 红框部分截取下来的波形图,两边是比较平缓的,中间是波动较大的
    黑框截取的波形图,波动大的那部分,跑到末尾了,没有被完整截取
    ipwx
        3
    ipwx  
       121 天前
    @AlwaysBee 哦,你是一个实时序列从左往右跑,然后检测是吧。。。这句话也是我看你上面这句话猜出来的,猜测你 “跑到末尾” 是这个意思。

    你的描述太不清晰了,我其实还是知之甚少,比如你的数据是什么、有什么性质。。。
    AlwaysBee
        4
    AlwaysBee  
    OP
       121 天前
    ![]( https://s3.bmp.ovh/imgs/2024/07/24/1dafb7fdb9997217.png)

    https://s3.bmp.ovh/imgs/2024/07/24/1dafb7fdb9997217.png
    @ipwx

    帖子无法 append ,在这里补充一个图
    黑色框不是我想要的(由于达到阈值就开始截取了,但实际上是提前了),红色虚线框才是我想要截取的
    ipwx
        5
    ipwx  
       121 天前
    @AlwaysBee 哦好像看懂你在说什么了。

    你加个卷积核吧,两边低中间高的卷积核。
    ipwx
        6
    ipwx  
       121 天前
    另外你还是没有描述清楚。

    你这边有好几条序列,设为 S1[t] ... Sk[t] 这 k 条序列。

    所以你每一时刻 t 的波动大,这个波动到底指的是以下哪种定义:

    1. max(Si[t] - Sj[t]) 两两之差的最大值
    2. max(abs(Si[t] - Sj[t])) 两两之差的绝对值的最大值
    3. max(abs(Si[t])) 每条序列的绝对值的最大值

    到底是哪个啊?
    ----

    所以你真的还没描述清楚啊(心累
    AlwaysBee
        7
    AlwaysBee  
    OP
       121 天前
    @ipwx 不好意思,因为在这方面确实不是专业的,所以描述也比较直白
    前面说的波动大,就是如图红框中间的波形图波动陡峭起伏大的意思

    X 轴是时间,然后 Y 轴有三个数据(体现在波形图就是有三条不同颜色的折线图),随着时间会变化,并且是随着时间不断产生数据

    我需要做的是,将红框内这样的数据提取出来,作为特征样本,但由于算法实现的问题,有一定概率截取到黑色框这样的样本,这样对最终的训练结果会有影响

    不知道这样描述是否理解了
    ipwx
        8
    ipwx  
       120 天前
    @AlwaysBee 不理解。

    “前面说的波动大,就是如图红框中间的波形图波动陡峭起伏大的意思”

    你这描述,每个人都有每个人不同的看法啊。你还是得形式化啊

    ----
    我用 t 表示时间,y1 y2 y3 表示序列。

    如果认为 y1 在 t 时刻起伏大,是绝对值大?

    abs(y1[t]) 很大?

    什么叫大?比 80% 的其他点大?

    ----

    如果时刻 t 只有一条线的绝对值大,那算不算你 t 时刻这三条线大?

    还是需要三条线都起伏大?
    ----


    如果 t 时刻,三条线的绝对值都不算很大,但是加起来比其他时刻绝对值加起来大,那算不算?
    ----

    我感觉你这个根本不是机器学习的范畴,只是你自己没有把问题描述清楚。你写清楚了就写出来了。
    AlwaysBee
        9
    AlwaysBee  
    OP
       120 天前
    @ipwx #8
    其实问题简化一下就是:如何截取到红色框框这这种类型的数据样本(两边平缓、中间起伏大)

    波动大小的判断就是这个问题的关键,怎么判断也是我想问的,我不知道如何通过数学的方式去判断(只能通过波形图判断这个波动大)

    特征数据提取之后,是需要把特征数据扔进去训练模型的,算是数据预处理的步骤
    ipwx
        10
    ipwx  
       120 天前
    @AlwaysBee

    1 、中间大两边小,我上面说了啊,加卷积啊。
    2 、但是加什么卷积、卷积核多宽、然后三个曲线是加起来还是求平均还是求最大值,你得把问题描述清楚才能具体啊。
    ipwx
        11
    ipwx  
       120 天前
    你要不给个 csv 数据,我给你 python 随便写一段。你就能体会为啥我上面要问你那么依托东西了。
    AlwaysBee
        12
    AlwaysBee  
    OP
       120 天前
    https://docs.qq.com/sheet/DY1VPTWRXbXdoUXdx
    你看看能否打开,腾讯文档
    @ipwx #11
    SiWXie
        13
    SiWXie  
       120 天前 via iPhone
    你这和建模没太大关系,是数据预处理的范涛。我建议是可以使用傅里叶变换,从时域信号变为频域信号,进行频域分析,抹点你不想要的波形后,再转换回来进行提取
    sillydaddy
        14
    sillydaddy  
       120 天前 via Android
    感觉特征还是很明显的,应该就是 @ipwx 说的,用这个简单的卷积就可以提取特征。

    如果我来做的话,我会在滑动窗口区域,假设为 Ta ~ Tb ,采样 100 个点,然后中间的 40 个点的绝对值,都乘以 1.0 ,然后加总得到一个值。不停滑动窗口的位置,就会得到不同的值。你想要的那种红色框框的滑动窗口,最后得到的值肯定有一个特征,那就是它比它附近的滑动窗口的值都要大。为什么,因为只有波动最大的区域位于滑动窗口中间位置时,采样得到的 40 个点的绝对值加起来才最大。这个特征不会受到简单阈值的影响,因为它统计的是一个区域范围的特征。
    这个特征在你发的图里面是很明显的,之所以说 40 个点是相对于 100 个点的滑动窗口宽度,也是根据你的图形里面大概看出来了的,你可以自己确定采样窗口中间多少个点。
    w16311
        15
    w16311  
       120 天前
    要不做个短时傅里叶变换(STFT)看看,红色部分应该都是高频?或者看一下失败的 case 调一下阈值多加一些条件。再或者考虑 window 内 std 的大小,如果是框大小一定。
    ipwx
        16
    ipwx  
       120 天前
    看了一下你的数据,三个信号都不是白噪声,而是周期性信号。

    那可能确实得上小波分析之类的。

    ----

    楼主说的什么信号时延根本不是问题的关键。要让尖峰延迟若干个点用卷积求平均就行了
    ipwx
        18
    ipwx  
       120 天前
    画了 200 个的片段,以及用卷积时延过的信号。

    楼主你真要把检出时间点放在窗口中间,检测卷积后的信号出现异常的时间(是右边界),然后框到左边就行了。

    但正确检测“异常”反而可能要上模型。
    ipwx
        19
    ipwx  
       120 天前
    然后你这个周期性信号的异常检测我觉得和

    https://dl.acm.org/doi/abs/10.1145/3178876.3185996

    https://arxiv.org/abs/1802.03903

    这个挺配的。第二个链接不用大学网络就能下。(声明,我是作者)

    论文里面的例子

    https://pic.imge.cc/2024/07/24/66a09d6856838.jpg
    AlwaysBee
        20
    AlwaysBee  
    OP
       120 天前
    @ipwx 谢谢大佬

    这份数据是为了提取特征而做了大量的、相同的动作产生的,波形就是该动作的体现,所以出现周期性

    现实操作中,动作的出现是没有周期性的规律的,并且会出现不同的动作,不同动作有不一样的波形,但都具有中间波动大、两侧平缓的特征
    AlwaysBee
        21
    AlwaysBee  
    OP
       120 天前
    @sillydaddy #14
    请教一下,这里的乘以 1.0 是有什么作用吗?
    ipwx
        22
    ipwx  
       120 天前   ❤️ 1
    @AlwaysBee 你现在总结的信息才是解决你问题的重要信息。

    按照你的说法,我感觉似乎用一个高斯核、一个均匀核进行卷积。如果两者相差太大,就可以认为出现了你要的检测信号。
    sillydaddy
        23
    sillydaddy  
       120 天前 via Android   ❤️ 1
    @AlwaysBee 40 个点乘以 1.0 加总,其实隐含的就是两侧的 60 个点乘以 0.0 ,取 1.0 是对比 0.0 来说的。这里对每个点乘以一个加权数然后加总的过程就是 ipwx 提到的卷积。具体加权的数字怎么定义,怎么分布,就是所谓的卷积核。它是根据待提取的特征决定的。比如为了突出中间数值特别大的特征,也可以取中间 10 个点乘以 3.0 ,周围 30 个点乘以 1.0 ,再周围 60 个点乘以 0.0 。卷积核怎么定义,都是自己定的。

    在这个例子里,特征就是中间波动大(数值绝对值也大),两边波动小(数值绝对值也小)。假设想要提取一个满足中间值比较大,两侧值比较小这个特征的滑动窗口,那就对于连续的每个滑动窗口,都用滑动窗口的中间区域乘以一个大的数值,两侧区域乘以一个小的数值,加总后的值得到该滑动窗口对应的特征值。如果某个滑动窗口的这个特征值比周围滑动窗口的特征值都大,即极大值,那我们就找到它了。
    AlwaysBee
        24
    AlwaysBee  
    OP
       120 天前
    谢谢两位,我这边先消化一下
    @sillydaddy @ipwx
    sillydaddy
        25
    sillydaddy  
       120 天前 via Android
    如果你要提取波动大的特征,而不是数值绝对值大的特征,也可以类似比照着做,只是需要先计算一下相邻两个点的变化率,通过卷积,对一个窗口的变化率加权加总,来计算出一个特征值。

    甚至也可以将数值大小与变化率大小结合起来,计算出一个特征值。单看数据的特征了。

    我是看你发的图形的特征,用数值计算特征值好像就足够了。
    Sawyerhou
        26
    Sawyerhou  
       120 天前 via Android
    直接要求最小值在窗口中间行不?
    SiWXie
        27
    SiWXie  
       120 天前 via iPhone
    @Sawyerhou 这个是最简单的,先把所有数据用窗口扫一遍,判断极值是不是在窗口的中间,不再的先过滤掉。

    这样不仅能保证样本具有一致性操作也简单。op 需要做的就是设置最小值的阈值,超过这个阈值才能称作最小值。

    至于上面讨论的核函数方法,我们就算求出了特征值,也需要设置阈值做判断,还不如这个直接。
    Sawyerhou
        28
    Sawyerhou  
       120 天前
    倒也不一定删掉,我就觉着把那个黑框挪一下,把最值放窗口中间,就跟红框差不多。
    TY233
        29
    TY233  
       120 天前 via iPhone
    感觉都不用 ai ,opencv 就可以搞定,从左到右检测蓝线的值,低于阈值就以这个点为中心画框
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4991 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:49 · PVG 11:49 · LAX 19:49 · JFK 22:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.