在实现分类或聚类算法时,应使用哪些FFT描述符作为特征?

我有一些地理轨迹数据需要分析,我计算了空间和时间维度上的数据直方图,从而为每个空间元素生成一个基于时间域的特征。我想对基于时间域的特征进行离散FFT变换,将其转换为基于频域的特征(我认为这可能更robust),然后进行一些分类或聚类算法。

但我不确定应该使用什么描述符作为频域特征,因为信号有幅度谱、功率谱和相位谱,我读了一些参考资料但仍然对它们的重要性感到困惑。另外,在对基于频域的特征向量执行学习算法时,应该使用什么距离(相似度)函数作为度量(欧几里得距离?余弦距离?高斯函数?Chi核还是其他什么?)

希望有人能给我一些线索或参考资料,谢谢~


编辑

感谢@DrKoch,我选择了L-1范数最大的空间元素,并用python绘制了它的log功率谱,确实显示了一些显著的峰值,以下是我的代码和图形

import numpy as np
import matplotlib.pyplot as plt
sp = np.fft.fft(signal)
freq = np.fft.fftfreq(signal.shape[-1], d = 1.) # 直方图的时间间隔为1小时
plt.plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()

log功率谱

我还有一些小问题要问,以确保我完全理解你的建议:

  • 在你的第二个建议中,你说“忽略所有这些值。”

    你的意思是水平线代表阈值,所有低于它的值都应被赋值为零吗?

  • “你可以搜索两个、三个最大的峰值,并使用它们的位置和可能的宽度作为进一步分类的’特征’。”

    我对”位置”和”宽度”的含义有点困惑,”位置”是指功率谱的对数值(y轴)吗?”宽度”是指频率(x轴)吗?如果是这样,如何将它们组合成一个特征向量,并比较两个具有“相似频率和相似宽度”的特征向量?


编辑

我用np.fft.rfft替换了np.fft.fft来计算正部,并绘制了功率谱和log功率谱。

代码:

f, axarr = plt.subplot(2, sharex = True)
axarr[0].plot(freq, np.abs(sp) ** 2)
axarr[1].plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()

图形:

功率谱和log功率谱如果我错了,请纠正我:

我认为我应该在第一个图中保留最后四个峰值,使用power = np.abs(sp) ** 2power[power < threshold] = 0,因为log功率谱会减少各成分之间的差异。然后使用新功率的log谱作为特征向量来供分类器使用。

我还看到一些参考资料建议在进行fft之前应用一个窗口函数(例如汉明窗)以避免频谱泄漏。我的原始数据每5到15秒采样一次,我已经对采样时间应用了直方图,这种方法是否相当于应用了一个窗口函数,或者我还需要在直方图数据上应用它?


回答:

通常你应该从完整的FFT谱中提取少量的”特征”。

首先:使用log功率谱。复杂数和相位在这种情况下是无用的,因为它们取决于你开始/停止数据采集的位置(以及许多其他因素)。

其次:你会看到一个”噪声水平”,例如,大多数值低于某个阈值,忽略所有这些值。

第三:如果你幸运的话,例如,你的数据有一些谐波内容(周期、重复),你会看到几个显著的峰值。

如果有明显的峰值,检测噪声就更容易了:峰值之间的所有东西都应被视为噪声。

现在你可以搜索两个、三个最大的峰值,并使用它们的位置和可能的宽度作为进一步分类的”特征”。

位置是峰值的x值,即’频率’。它说明了输入数据中周期的”速度”。

如果你的周期在测量间隔内没有恒定频率(或者你在计算FFT之前使用了一个窗口),峰值将比一个bin宽。因此,峰值的宽度说明了周期的’稳定性’。

基于此:如果两个模式的最大峰值具有相似的频率和相似的宽度,那么这两个模式是相似的,依此类推。


编辑

看到你一个例子的对数功率谱非常有趣。

现在很清楚你的输入包含一个单一的谐波(周期性、振荡)成分,频率(重复率、周期持续时间)约为f0=0.04。(这是相对频率,与你的采样频率成比例,即个别测量点之间的时间的倒数)

这不是一个纯正弦波,而是一些”有趣”的波形。这种波形会在1*f0、2*f0、3*f0等处产生峰值。(因此,使用FFT进行进一步分析是一个非常好的主意)

在这一点上,你应该生成几个测量的谱,并看看什么使得测量相似,以及不同测量之间的区别是什么。区分你的测量的”重要”特征是什么?需要注意的方面包括:

  • 绝对幅度:显著峰值(最左侧、最高)的高度。
  • 音高(主要周期率、变化速度):这是第一个峰值的位置,连续峰值之间的距离。
  • 确切波形:前几个峰值的相对幅度。

如果你的最重要特征是绝对幅度,你最好计算输入信号的RMS(均方根)水平。

如果音高重要,你最好计算输入信号的ACF(自相关函数)。

不要关注最左侧的峰值,这些来自于输入中的高频成分,并且往往像噪声底一样变化多端。

窗口

为了进行高质量的分析,在应用FFT之前对输入数据应用一个窗口是重要的。这可以减少输入向量末尾和开始之间的”跳跃”的影响,因为FFT将输入视为一个单一周期。

有几种流行的窗口,它们代表了不可避免的权衡的不同选择:单个峰值的精度与旁瓣水平:

你选择了一个”矩形窗口”(相当于没有窗口,只是开始/停止你的测量)。这提供了你峰值的极佳精度,现在它们的宽度仅为一个样本。你的旁瓣(主峰值左侧和右侧的小峰值)在-21dB,考虑到你的输入数据,这是非常可以接受的。在你的情况下,这是一个极好的选择。

汉宁窗是一个单一的余弦波。它使你的峰值稍微变宽,但减少了旁瓣水平。

汉明窗(余弦波,略高于0.0)产生更宽的峰值,但将旁瓣抑制到-42 dB。如果你期望在主峰值之间有进一步的弱(但重要)的成分,或者一般来说,如果你有复杂的信号如语音、音乐等,这是很好的选择。


编辑:缩放

正确缩放一个谱是一个复杂的事情,因为FFT线的值取决于许多因素,如采样率、FFT长度、窗口,甚至FFT算法的实现细节(存在几种不同的公认惯例)。

毕竟,FFT应该显示底层的能量守恒。输入信号的RMS应该与谱的RMS(能量)相同。

另一方面:如果用于分类,保持相对幅度就足够了。只要上述提到的参数不变,结果就可以在没有进一步缩放的情况下用于分类。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注