首页 > 人工智能 > 机器学习 > 数据科学家的傅里叶变换 - KDnuggets
本文包含傅里叶变换的数学简介及其在 AI 中的应用。

傅里叶变换是数学史上最深刻的洞见之一,但遗憾的是,其含义深埋在那些看似荒谬的公式之中。
傅里叶变换是一种将事物分解为一组正弦波的方法。顾名思义,这个名字来自很久以前一位名叫傅里叶的人。
用数学术语来说,傅里叶变换是一种将信号分解为其组成成分和频率的技术。
傅里叶变换不仅广泛应用于信号(无线电、声学等)处理,还应用于图像分析,例如边缘检测、图像滤波、图像重建和图像压缩。一个例子:透射电子显微镜图像的傅里叶变换有助于检查样品的周期性。周期性——即图案。对数据进行傅里叶变换可以扩展关于所分析样品的可获取信息。
为了更好地理解,考虑一个信号 x(t):

如果我们对另一个信号做同样的处理,并选择同一时刻来测量其振幅。考虑另一个信号 y(t):

当我们同时发出这两个信号,或者将它们相加时,会发生什么?
当我们在同一时刻发出这两个信号时,我们得到一个新信号,它是这两个信号振幅之和。这是因为这两个信号被加在了一起。
将两个信号相加:z(t) = x(t) + y(t)

如果我们只得到一个信号(即信号 x(t) 和 y(t) 的和),我们能否恢复原始信号 x(t) 和 y(t)?
可以。这正是傅里叶变换所做的。它接收一个信号,并将其分解为构成该信号的频率。
在我们的例子中,傅里叶变换会将信号 z(t) 分解为构成它的频率,如信号 x(t) 和 y(t)。
傅里叶变换的作用是将我们从时域转移到频域。

如果有人想知道,如果我们想从频域回到时域该怎么办?
我们可以通过使用逆傅里叶变换(IFT)来实现。
“时域中的任何连续信号都可以由无限正弦波序列唯一且明确地表示。”
这是什么意思?
这意味着,如果我们有一个由某个函数 x(t) 生成的信号,那么我们可以提出另一个函数 f(t),使得:

因此,无论信号有多强,我们都能找到一个像 f(t) 这样的函数,它是无限正弦波序列的和,能够完美地表示该信号。
现在,出现的问题是,我们如何在上面的方程中找到系数,因为这些值将决定输出的形状,从而决定信号。

因此,为了得到这些系数,我们使用傅里叶变换,傅里叶变换的结果是一组系数。我们用 X(w) 来表示傅里叶系数,它是频率的函数,我们通过求解积分得到,如下所示:
傅里叶变换表示为不定积分:
X(w):傅里叶变换
x(t):逆傅里叶变换


傅里叶变换与逆傅里叶变换
此外,当我们实际求解上述积分时,我们会得到这些复数,其中 a 和 b 对应我们所要寻找的系数。
连续傅里叶变换将无限持续时间的时间域信号转换为由无限数量的正弦波组成的连续频谱。在实践中,我们处理的是离散采样的信号,通常以恒定间隔采样,并且具有有限持续时间或周期性。为此,经典傅里叶变换算法可以表示为离散傅里叶变换(DFT),它将函数的有限等间隔采样序列转换为离散时间傅里叶变换的相同长度等间隔采样序列:

所以,这本质上就是离散傅里叶变换。我们可以进行这种计算,它将产生一个形式为 a + i b 的复数,其中我们有两个傅里叶级数的系数。
现在,我们知道如何采样信号以及如何应用离散傅里叶变换。我们最后想要做的是,我们想要摆脱复数 i,因为 mllib 或 systemML 不支持它,通过使用所谓的欧拉公式,该公式表述为:

所以,如果我们将欧拉公式代入傅里叶变换方程并求解,它将产生实部和虚部。

如你所见,X 由格式为 a+ib 或 a-ib 的复数组成。因此,如果你求解上述方程,你将得到傅里叶系数 a 和 b。


现在,如果你将 a 和 b 的值代入 f(t) 的方程中,那么你就可以用频率来定义信号。
在实际应用中,我们使用快速傅里叶变换(FFT)算法,它递归地将 DFT 分解为更小的 DFT,从而大幅降低所需的计算时间。DFT 的时间复杂度为 2N²,而 FFT 的时间复杂度为 2NlogN。
虽然正弦和余弦函数最初是基于直角三角形定义的,但在当前场景下从那个角度来看并不是最好的方式。你可能曾被教导将正弦函数识别为“对边比斜边”,但现在是时候换一个稍微不同的视角了。
考虑单位圆:

在笛卡尔平面上。假设一条过原点的直线以逆时针方向与 ???? 轴成 θ 角,该直线与圆的交点坐标为 (cosθ, sinθ)。

想一想。这个视角与之前的视角是否相关?两种定义是相同的。
假设我们开始旋转这条直线,让 θ 线性增加。你会得到类似这样的结果:

正弦和余弦函数可以说是若干情况下最重要的周期函数:
在简谐振子中,位移、速度和加速度随时间变化的周期函数是正弦函数。
每个粒子都具有波的性质,反之亦然。这就是德布罗意的波粒二象性。波始终是某些物理量(例如电磁波的电场、声波的压强)的正弦函数。
声音本身是一种压力扰动,通过能够压缩和膨胀的介质传播。沿声波某一点的压力随时间呈正弦变化。
如果一个点以恒定速度绕圆运动,它离地面的高度会形成一条正弦函数曲线。点运动的速度对应频率,圆的半径对应振幅。




几乎是一个离散波形。
由于傅里叶定理,我们可以用适当频率和半径的圆来生成任何信号。
我使用了 Dan Shiffman 在 coding challenge #125 中的代码来制作这些动画。你可以从他的 GitHub 获取 JavaScript 代码并自己尝试。
傅里叶变换是一个线性函数,为了引入非线性,使用了卷积。
两个信号乘积的傅里叶变换是这两个信号的卷积。
设 x(t) 和 y(t) 为两个函数,其卷积为 X(t)*Y(t),F 表示傅里叶变换,则
F{x(t).y(t)} = X(t)*Y(t)
记住这个事实:时域中的卷积是频域中的乘法。这就是傅里叶变换在机器学习,尤其是深度学习算法中最常用的方式。
我以卷积神经网络(CNN)为例;
CNN 中 90% 的计算是卷积,已有许多方法来降低此类计算的强度,其中之一是快速傅里叶变换(FFT)。
与卷积不同,输入矩阵和滤波器矩阵通过 FFT 转换到频域进行乘法运算。然后,输出通过逆 FFT(IFFT)转换回时域。

FFT 的另一个用途是可用于降维或特征提取。
当数据集中的每个样本是一个信号(时间序列或图像等)时,它可能包含数千个采样点。但它们实际上可能只对应傅里叶域中的几个点(特别是在存在某种周期性的情况下)。这大大简化了问题。
或者有时使用傅里叶域可以提供平移不变性。也就是说,即使信号之间存在滞后,这些差异也不会影响它们在傅里叶域中的表示。
FFT 最简单的实现可以使用 numpy 和 scipy Python 库来完成。
%matplotlib inline import numpy as np import matplotlib.pyplot as plt import scipy.fftpack # Number of samplepoints N = 600 # sample spacing T = 1.0 / 800.0 x = np.linspace(0.0, N*T, N) y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x) yf = scipy.fftpack.fft(y) xf = np.linspace(0.0, 1.0/(2.0*T), N/2) fig, ax = plt.subplots() ax.plot(xf, 2.0/N * np.abs(yf[:N//2])) plt.show()

FFT 被用于数字录音、采样、加法合成和音高校正软件中。
FFT 的重要性源于这样一个事实:它使得在频域中工作与在时域或空域中工作具有同等的计算可行性。FFT 的一些重要应用包括:
快速大整数和多项式乘法
用于 Toeplitz、循环和其他结构化矩阵的高效矩阵-向量乘法
滤波算法
离散余弦或正弦变换的快速算法(例如用于 JPEG 和 MPEG / MP3 编解码的快速离散余弦变换)。
快速 Chebyshev 逼近。
求解差分方程。
同位素分布的计算。
好了,这就是本文的全部内容,希望你们喜欢阅读,如果这篇文章能有所帮助,我会很高兴。欢迎在评论区分享你的评论/想法/反馈。
感谢阅读!!!
简介:Nagesh Singh Chauhan 是一名数据科学爱好者。对大数据、Python、机器学习感兴趣。
原文。经许可转载。
转载声明:本文为转载整理,原文版权归原作者及原站点所有。
原文来源:KDnuggets
原创地址:https://www.kdnuggets.com/2020/02/fourier-transformation-data-scientist.html#comment-184744
原文作者:https://www.facebook.com/kdnuggets;如有侵权,请联系管理员删除。