最近在做机器学习相关的事情,但遇到了如下问题,导致训练出来的模型识别准确度一般
数据波形图如上图所示,我目前是通过滑动窗口来进行截取的,我的预期是截取下来的数据是红色框框的这种(两边平缓、中间波动较大),我目前的截取条件是超过阈值就自动截取
注:窗口大小是固定的
但由于条件可能过于单一,也有一定的概率截取到黑色框框的这种类型的数据
本人在数据分析和机器学习上,基本上是小白,问题描述可能也比较不专业,所以在此请教一下 V 友,这种时间序列的数据,应该如何进行特征提取
![]() |
1
ipwx 45 天前
不懂,红框和黑框有啥区别。
你先想办法把你的场景讲清楚 |
![]() |
3
ipwx 45 天前
@AlwaysBee 哦,你是一个实时序列从左往右跑,然后检测是吧。。。这句话也是我看你上面这句话猜出来的,猜测你 “跑到末尾” 是这个意思。
你的描述太不清晰了,我其实还是知之甚少,比如你的数据是什么、有什么性质。。。 |
![]() |
4
AlwaysBee OP ![]( https://s3.bmp.ovh/imgs/2024/07/24/1dafb7fdb9997217.png)
https://s3.bmp.ovh/imgs/2024/07/24/1dafb7fdb9997217.png @ipwx 帖子无法 append ,在这里补充一个图 黑色框不是我想要的(由于达到阈值就开始截取了,但实际上是提前了),红色虚线框才是我想要截取的 |
![]() |
6
ipwx 45 天前
另外你还是没有描述清楚。
你这边有好几条序列,设为 S1[t] ... Sk[t] 这 k 条序列。 所以你每一时刻 t 的波动大,这个波动到底指的是以下哪种定义: 1. max(Si[t] - Sj[t]) 两两之差的最大值 2. max(abs(Si[t] - Sj[t])) 两两之差的绝对值的最大值 3. max(abs(Si[t])) 每条序列的绝对值的最大值 到底是哪个啊? ---- 所以你真的还没描述清楚啊(心累 |
![]() |
7
AlwaysBee OP @ipwx 不好意思,因为在这方面确实不是专业的,所以描述也比较直白
前面说的波动大,就是如图红框中间的波形图波动陡峭起伏大的意思 X 轴是时间,然后 Y 轴有三个数据(体现在波形图就是有三条不同颜色的折线图),随着时间会变化,并且是随着时间不断产生数据 我需要做的是,将红框内这样的数据提取出来,作为特征样本,但由于算法实现的问题,有一定概率截取到黑色框这样的样本,这样对最终的训练结果会有影响 不知道这样描述是否理解了 |
![]() |
8
ipwx 45 天前
@AlwaysBee 不理解。
“前面说的波动大,就是如图红框中间的波形图波动陡峭起伏大的意思” 你这描述,每个人都有每个人不同的看法啊。你还是得形式化啊 ---- 我用 t 表示时间,y1 y2 y3 表示序列。 如果认为 y1 在 t 时刻起伏大,是绝对值大? abs(y1[t]) 很大? 什么叫大?比 80% 的其他点大? ---- 如果时刻 t 只有一条线的绝对值大,那算不算你 t 时刻这三条线大? 还是需要三条线都起伏大? ---- 如果 t 时刻,三条线的绝对值都不算很大,但是加起来比其他时刻绝对值加起来大,那算不算? ---- 我感觉你这个根本不是机器学习的范畴,只是你自己没有把问题描述清楚。你写清楚了就写出来了。 |
![]() |
9
AlwaysBee OP @ipwx #8
其实问题简化一下就是:如何截取到红色框框这这种类型的数据样本(两边平缓、中间起伏大) 波动大小的判断就是这个问题的关键,怎么判断也是我想问的,我不知道如何通过数学的方式去判断(只能通过波形图判断这个波动大) 特征数据提取之后,是需要把特征数据扔进去训练模型的,算是数据预处理的步骤 |
![]() |
10
ipwx 45 天前
|
![]() |
11
ipwx 45 天前
你要不给个 csv 数据,我给你 python 随便写一段。你就能体会为啥我上面要问你那么依托东西了。
|
![]() |
12
AlwaysBee OP |
13
SiWXie 45 天前 via iPhone
你这和建模没太大关系,是数据预处理的范涛。我建议是可以使用傅里叶变换,从时域信号变为频域信号,进行频域分析,抹点你不想要的波形后,再转换回来进行提取
|
![]() |
14
sillydaddy 45 天前 via Android
感觉特征还是很明显的,应该就是 @ipwx 说的,用这个简单的卷积就可以提取特征。
如果我来做的话,我会在滑动窗口区域,假设为 Ta ~ Tb ,采样 100 个点,然后中间的 40 个点的绝对值,都乘以 1.0 ,然后加总得到一个值。不停滑动窗口的位置,就会得到不同的值。你想要的那种红色框框的滑动窗口,最后得到的值肯定有一个特征,那就是它比它附近的滑动窗口的值都要大。为什么,因为只有波动最大的区域位于滑动窗口中间位置时,采样得到的 40 个点的绝对值加起来才最大。这个特征不会受到简单阈值的影响,因为它统计的是一个区域范围的特征。 这个特征在你发的图里面是很明显的,之所以说 40 个点是相对于 100 个点的滑动窗口宽度,也是根据你的图形里面大概看出来了的,你可以自己确定采样窗口中间多少个点。 |
15
w16311 45 天前
要不做个短时傅里叶变换(STFT)看看,红色部分应该都是高频?或者看一下失败的 case 调一下阈值多加一些条件。再或者考虑 window 内 std 的大小,如果是框大小一定。
|
![]() |
16
ipwx 45 天前
看了一下你的数据,三个信号都不是白噪声,而是周期性信号。
那可能确实得上小波分析之类的。 ---- 楼主说的什么信号时延根本不是问题的关键。要让尖峰延迟若干个点用卷积求平均就行了 |
![]() |
18
ipwx 45 天前
画了 200 个的片段,以及用卷积时延过的信号。
楼主你真要把检出时间点放在窗口中间,检测卷积后的信号出现异常的时间(是右边界),然后框到左边就行了。 但正确检测“异常”反而可能要上模型。 |
![]() |
19
ipwx 45 天前
然后你这个周期性信号的异常检测我觉得和
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 |
![]() |
20
AlwaysBee OP @ipwx 谢谢大佬
这份数据是为了提取特征而做了大量的、相同的动作产生的,波形就是该动作的体现,所以出现周期性 现实操作中,动作的出现是没有周期性的规律的,并且会出现不同的动作,不同动作有不一样的波形,但都具有中间波动大、两侧平缓的特征 |
![]() |
21
AlwaysBee OP @sillydaddy #14
请教一下,这里的乘以 1.0 是有什么作用吗? |
![]() |
22
ipwx 45 天前 ![]() |
![]() |
23
sillydaddy 45 天前 via Android ![]() @AlwaysBee 40 个点乘以 1.0 加总,其实隐含的就是两侧的 60 个点乘以 0.0 ,取 1.0 是对比 0.0 来说的。这里对每个点乘以一个加权数然后加总的过程就是 ipwx 提到的卷积。具体加权的数字怎么定义,怎么分布,就是所谓的卷积核。它是根据待提取的特征决定的。比如为了突出中间数值特别大的特征,也可以取中间 10 个点乘以 3.0 ,周围 30 个点乘以 1.0 ,再周围 60 个点乘以 0.0 。卷积核怎么定义,都是自己定的。
在这个例子里,特征就是中间波动大(数值绝对值也大),两边波动小(数值绝对值也小)。假设想要提取一个满足中间值比较大,两侧值比较小这个特征的滑动窗口,那就对于连续的每个滑动窗口,都用滑动窗口的中间区域乘以一个大的数值,两侧区域乘以一个小的数值,加总后的值得到该滑动窗口对应的特征值。如果某个滑动窗口的这个特征值比周围滑动窗口的特征值都大,即极大值,那我们就找到它了。 |
![]() |
24
AlwaysBee OP |
![]() |
25
sillydaddy 45 天前 via Android
如果你要提取波动大的特征,而不是数值绝对值大的特征,也可以类似比照着做,只是需要先计算一下相邻两个点的变化率,通过卷积,对一个窗口的变化率加权加总,来计算出一个特征值。
甚至也可以将数值大小与变化率大小结合起来,计算出一个特征值。单看数据的特征了。 我是看你发的图形的特征,用数值计算特征值好像就足够了。 |
![]() |
26
Sawyerhou 45 天前 via Android
直接要求最小值在窗口中间行不?
|
27
SiWXie 45 天前 via iPhone
@Sawyerhou 这个是最简单的,先把所有数据用窗口扫一遍,判断极值是不是在窗口的中间,不再的先过滤掉。
这样不仅能保证样本具有一致性操作也简单。op 需要做的就是设置最小值的阈值,超过这个阈值才能称作最小值。 至于上面讨论的核函数方法,我们就算求出了特征值,也需要设置阈值做判断,还不如这个直接。 |
![]() |
28
Sawyerhou 45 天前
倒也不一定删掉,我就觉着把那个黑框挪一下,把最值放窗口中间,就跟红框差不多。
|
![]() |
29
TY233 45 天前 via iPhone
感觉都不用 ai ,opencv 就可以搞定,从左到右检测蓝线的值,低于阈值就以这个点为中心画框
|