【发布时间】:2015-02-17 05:37:15
【问题描述】:
FFT 将基于时域的特征转换为基于频域的特征(我认为这可能更健壮),然后做一些分类或聚类算法。
但我不确定使用什么描述符作为基于频域的特征,因为信号有幅度谱、功率谱和相位谱,我已经阅读了一些参考资料,但仍然对重要性感到困惑。在基于频域的特征向量(欧几里得距离?余弦距离?高斯函数?Chi-kernel 还是其他什么?)上执行学习算法时,应该使用什么距离(相似度)函数作为度量。
希望哪位大神给点线索或者资料可以参考一下,谢谢~编辑
感谢@DrKoch,我选择了具有最大L-1 范数的空间元素,并在python 中绘制了它的log power spectrum,它确实显示了一些突出的峰值,下面是我的代码和图
import numpy as np
import matplotlib.pyplot as plt
sp = np.fft.fft(signal)
freq = np.fft.fftfreq(signal.shape[-1], d = 1.) # time sloth of histogram is 1 hour
plt.plot(freq, np.log10(np.abs(sp) ** 2))
plt.show()
我有几个小问题要问,以确保我完全理解您的建议:
-
在您的第二个建议中,您说“忽略所有这些值。”
您的意思是水平线代表阈值,低于它的所有值都应分配为零值吗? -
“您可以搜索两个、三个最大的峰,并将它们的位置和可能的宽度用作“特征”以进行进一步分类。”
我对“位置”和“宽度”的含义有点困惑,“位置”是指功率谱(y轴)的对数值,“宽度”是指频率(x轴)吗?如果是这样,如何将它们组合在一起作为一个特征向量,并比较“相似频率和相似宽度”的两个特征向量?
编辑
我将np.fft.fft 替换为np.fft.rfft 以计算正部分并绘制功率谱和对数功率谱。
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()
数字:
如果我错了,请纠正我:
我认为我应该在 first 图中使用power = np.abs(sp) ** 2 和power[power < threshold] = 0 保留最后四个峰值,因为对数功率谱减少了每个组件之间的差异。然后使用新功率的对数谱作为特征向量来输入分类器。
我还看到一些参考建议在执行 fft 之前应用窗口函数(例如汉明窗口)以避免频谱泄漏。我的原始数据每 5 ~ 15 秒采样一次,并且我在采样时间上应用了直方图,该方法是否等同于应用窗口函数,还是我仍需要将其应用于直方图数据?
【问题讨论】:
-
为什么要对原始数据做FFT?你不能只使用原始功能吗?
-
@AbhimanuKumar 理论上是可以的,但是由于轨迹是用民用GPS设备采样的,无法保证高精度,而且我认为频域的特征比时域的特征更可靠~
-
实数(非复数值)系列的谱总是对称的,因此您应该忽略 x 的所有结果
-
x==0 处的结果,例如fft(0) 表示直流分量。您应该删除此分量(从所有 y 值中减去平均值(x[]))或忽略 fft(0) 值。
-
@DrKoch 是的,我已经在更新部分完成了这个,我学到了很多东西,谢谢~ :)
标签: machine-learning fft data-mining similarity feature-extraction