有没有想过 Netflix 如何压缩大量视频、Spotify 如何创建清晰的音乐流,甚至如何实时分析股票价格趋势?
这些技术背后的秘密在于信号处理,特别是傅里叶变换——这是每个数据科学从业者最终都必须掌握的工具。
傅里叶变换将复杂的信号分解为简单、可操作的见解(insights),对于任何认真对待数据科学的人来说,这都是不可或缺的。
在音频处理中,傅里叶变换有助于识别音频信号中存在的各种频率,从而实现语音识别、音乐分类和降噪等任务。
在图像分析中,傅里叶变换可用于从图像中提取纹理和图案信息。通过将图像转换为频域,可以更轻松地检测边缘、形状和其他视觉特征。这对于图像识别、对象检测和图像压缩等任务至关重要。
让我们研究一下傅里叶变换背后的数学原理。
傅里叶变换:数学
以下是 Wolfram Mathworld 中关于傅里叶变换的摘录,它会让你头晕目眩——
参考:https://mathworld.wolfram.com/FourierTransform.html
如果这没有意义,那也没关系。当我在大学里刚开始学习它时,我几乎不明白它有什么意义。
我也从未真正理解作为一名计算机科学毕业生学习如此复杂的数学的必要性。
让我们将其分解为更简单的术语——
F(k) — 随时间变化的函数或信号,如几秒、几分钟等,为连续值
e−2πikx 是什么?
这是一个表示波的复指数函数。它结合了两部分——
▪️余弦波(cosine wave)
▪️正弦波(sine wave)
如果我们进一步将其分解为欧拉公式,则可以更好地表示为:
参考:维基百科 — https://en.wikipedia.org/wiki/Euler%27s_formula
e ~ 2.718(自然对数底数)
i ~ 虚数单位,使得 i(平方) = -1;它使我们能够处理波的相位
k ~ 波的频率
x ~ 时间范围
2π ~ 将频率转换为一个完整周期(一个圆 = 2π2\pi2π 弧度)
dk ~ 这代表一小段时间。这是我们在积分过程中加起来的。
当然,要理解傅里叶变换,我们必须假设您理解数学中的积分概念。
从该公式推导,傅里叶变换的基本公式如下-
目的是获取随时间变化的信号并将其转换为基于频率的表示形式,以便进行分析并用于了解信号中的关键成分。
因此,该公式充当一种频率检测器(或预测器),从而将基于时间的信号表示转换为基于频率的表示。
机器学习中的应用
傅里叶变换最适合用于随时间推移呈现周期性(重复)模式或显示某种趋势(随时间推移)的数据。重点是,如果某些模式似乎在特定间隔内重复出现,那么这就是将傅里叶变换应用于数据并训练 ML 模型以理解这些模式的绝佳用例。
基于此,傅里叶变换可用于以下用例中的预测分析
1.数据降噪
在许多数据集中,噪声(随机波动)会掩盖有意义的模式。傅里叶变换有助于:
隔离高频噪声(快速、随机变化)。
关注低频趋势(较慢、更有意义的变化)。
去除噪音后,清理后的数据对于预测来说更可靠。
2.时间序列数据的特征提取
傅里叶变换可以从原始数据中提取有用的基于频率的特征,供机器学习模型使用。例如:
将时间序列数据转换为其频率分量。
使用这些分量的振幅和相位作为特征。
这在以下领域尤其有用:
信号处理(例如语音识别)。
故障检测(例如机械振动分析)。
3.预测(天气、销售等)
通过识别使用傅里叶分析转换的数据中的周期性模式,可以:
将这些模式投射到未来以进行预测。
与其他预测模型(例如 ARIMA、神经网络)相结合以提高准确性。
4.异常检测
傅里叶变换可以突出显示频率数据中表示异常的不寻常模式。
例如:如果通常平滑的模式在特定频率下出现意外的峰值或下降,则可能表示存在问题。
示例:通过识别异常频率模式来检测金融交易中的欺诈行为。
鉴于这些用例,傅里叶变换在以下领域有明显的应用:
- 金融
- 卫生保健
- 零售与营销
- 制造业
- 科学研究
应用
让我们看一个FT在数据科学领域的应用示例。
我们将编写工作代码,将傅里叶变换应用于来自 Kaggle 的 EEG 分析——睡眠模式检测数据集。
脑电图分析数据集
https://www.kaggle.com/datasets/jbouv27/eeg/data
该数据集包含脑电图 (EEG) 波内的某种类型的模式(称为“纺锤体”)。
它们是从单个 EEG 中提取的,主要来自 C3-A1 和 C4-A1 电极
有两种输入可以读取这些波:
每个捕获者测量到的电位的原始差异
GeneCycle 包周期图函数对电位差的快速傅里叶变换结果应用后得到的频率和功率谱密度
原始电位差 -> FFT -> 周期图 -> 频率和功率谱密度
为了应用傅里叶变换,我们使用 Numpy 函数-
— np.fft.fft(signal)
— np.fft.fftfreq(len(signal), d=1/100)
以下是使用快速傅里叶变换处理数据集的一些工作代码:-
导入
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
2. extrait_wSleepPage01数据集的数据集规范化
# Load the data
df1 = pd.read_csv('extrait_wSleepPage01.csv', delimiter=";")
df2 = pd.read_csv('spindles.csv', delimiter=";")# Add time column to df1
df1['Time (s)'] = np.arange(0, len(df1) * 0.005, 0.005)# Extract and clean relevant features in df1
features = ["EOG Left", "EEG C3-A1", "EEG O1-A1", "EEG C4-A1", "EEG O2-A1"]
df1_new = df1[['Time (s)'] + features].copy()
for x in features:
df1_new[x] = pd.to_numeric(df1_new[x].str.replace(',', '.'), errors='coerce')
3. 绘制数据集(垂直堆叠)
# Plot the cleaned features in df1
fig, axs = plt.subplots(5, sharex=True, sharey=True, figsize=(18, 24))labels = featurescolors = ["r", "g", "b", "y", "k"]
fig.suptitle('Vertically Stacked Subplots of extrait_wSleepPage01', fontsize=20)
for i, ax in enumerate(axs):
ax.plot(df1_new['Time (s)'], df1_new[labels[i]], color=colors[i], label=labels[i])
ax.legend(loc="upper right")
plt.xlabel('Time (s)', fontsize=20)
plt.show()
4.主轴数据集的数据集规范化
# Add time column to df2
df2['Time (s)'] = np.arange(0, len(df2) * 0.005, 0.005)# Extract and clean relevant features in df2
features2 = ["EOG Left[uV]", "EEG C3-A1[uV]", "EEG O1-A1[uV]", "EEG C4-A1[uV]", "EEG O2-A1[uV]"]
df2_new = df2[['Time (s)'] + features2].copy()
for x in features2:
df2_new[x] = pd.to_numeric(df2_new[x].str.replace(',', '.'), errors='coerce')
5. 绘制主轴数据集
# Plot the cleaned features in df2
fig, axs = plt.subplots(5, sharex=True, sharey=True, figsize=(18, 24))labels = features2fig.suptitle('Vertically Stacked Subplots of Spindles', fontsize=20)
for i, ax in enumerate(axs):
ax.plot(df2_new['Time (s)'], df2_new[labels[i]], color=colors[i], label=labels[i])
ax.legend(loc="upper right")
plt.xlabel('Time (s)', fontsize=20)
plt.show()
6. 现在对数据应用快速傅里叶变换
# Apply FFT using numpydf3 = df2_new.copy()labels = features2sampling_rate = 200 # Assuming 200 Hz sampling rate (5ms interval)
for label in labels:
# Perform FFT and calculate frequencies
fft_result = np.fft.fft(df3[label].fillna(0).to_numpy())
frequencies = np.fft.fftfreq(len(fft_result), d=1 / sampling_rate)
df3[label] = np.abs(fft_result) # Store magnitudes
df3['frequency (Hz)'] = frequencies
7. 在周期图中绘制 FFT 转换后的频率
# Plot FFT features
fig, axs = plt.subplots(5, sharex=True, sharey=True, figsize=(18, 24))
fig.suptitle('Periodogram using FFT', fontsize=20)
for i, ax in enumerate(axs):
ax.plot(df3['frequency (Hz)'][1:], df3[labels[i]][1:], color=colors[i], label=labels[i])
ax.legend(loc="upper right")
plt.xlabel('Frequency (Hz)', fontsize=20)
plt.show()
以下是代码的详细说明
1.数据集
— 数据集包含不同通道的原始 EEG 读数(例如“EEG C3-A1”、“EEG O1-A1”)。
— 它还包括“EOG 左”(眼电图)读数和时间戳。
— 数据以高频率(5 毫秒间隔)采样。
2.数据处理
— 通过转换成数值来清理数据
— 转换时间戳
— 提取相关特征
这为进一步的预测分析做好了数据准备。
3.分析
— 绘制不同通道的原始 EEG 和 EOG 信号,以直观地了解模式和趋势
— 检查 EEG 子图以确定可能发生主轴的活动时期
— FFT 将时域信号(EEG 数据)转换为频域表示。它揭示了信号中不同频率分量的功率
— 主轴波出现在特定频率范围内(通常为 12–16 Hz,称为sigma 频带)
— 通过分析频谱,我们可以检测和分离主轴模式
4.应用 FFT
— 对每个 EEG 通道应用 FFT
— 计算每个信号的频谱
— 可视化频谱以观察主要频率并识别主轴
5.频率分析和主轴检测
— 绘制信号功率与频率的关系图,以识别主轴范围内的峰值(12-16 Hz)
— 通过分析此范围内的 FFT 幅度来检测主轴
— 计算与 FFT 结果对应的频率值
— 使用这些值来分析特定波段(例如,theta、spindle、delta)
可以通过应用机器学习模型检测脑电图数据中的纺锤波来进一步发现纺锤波。
希望本文能帮助您对傅里叶变换及其用途有一个基本的了解。傅里叶变换是理解如何处理时间数据或具有重复模式或趋势的数据的一个必不可少的主题。
傅里叶变换通过揭示周期、消除噪音和提取基于频率的特征来帮助预测分析,使得数据模式更易于理解并可用于预测和异常检测以及其他类似的应用。
内容中包含的图片若涉及版权问题,请及时与我们联系删除