ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

共轭家族通识:从复数、矩阵、梯度到分布与频谱对称

共轭家族通识:从复数、矩阵、梯度到分布与频谱对称 “共轭”这个词我学生时代被它折磨过很多次。高中复数课学共轭复数线性代数课遇到共轭矩阵数值分析课上又冒出共轭梯度法后来做贝叶斯统计看到共轭分布学凸优化碰到共轭函数做信号处理更是天天跟傅里叶变换的共轭对称打交道。当时的真实感受是这些玩意儿名字里都带“共轭”但好像各玩各的谁跟谁都不挨着。直到后来把几个方向的项目都做过一遍才慢慢意识到这其实是同一种数学直觉在反复出现。共轭的本质是给某个“带方向、带形变”的对象配一个镜像伙伴这个镜像伙伴能让我们在计算里把复杂问题拉直、把交叉项消掉、把高维结构变对称。这篇文章我想把这几个“共轭”放在一起串一遍讲清楚它们各自在干什么、背后的直觉是什么、实操里有哪些坑。适合正在学和用过其中某几个概念、但还没把它们打通的人也适合想在具体项目里快速回忆关键公式和注意点的朋友。1. 先把直觉搭起来共轭复数与共轭根式1.1 共轭复数复平面里的镜像计算里的有理化利器共轭复数的定义非常简单给定复数 (zabi)它的共轭记作 (\bar{z}a-bi)。在复平面上看这就是把点 ((a,b)) 沿实轴做一次镜像翻转虚部取反而已。这个“沿实轴镜像”的操作是后面所有“共轭”概念的原始直觉保持一个方向不变把另一个方向翻转。它最有用的三个性质我建议无论做不做数学都要刻在脑子里。第一模长可以通过乘积拿到(z\bar{z}a^2b^2|z|^2)。这等于把一个带方向的复数问题转化成两个标量相乘的问题。第二共轭跟加减乘除是可以交换的(\overline{z_1\pm z_2}\bar{z}_1\pm\bar{z}_2)(\overline{z_1 z_2}\bar{z}_1\bar{z}_2)(\overline{(z_1/z_2)}\bar{z}_1/\bar{z}_2)。所以如果你对一整块复杂表达式取共轭可以逐步拆进去算。第三如果某个实系数多项式的根是复数那么它的共轭一定也是根。这个成对出现的性质在信号处理里直接导出了“实信号的频谱共轭对称”这一件事后面我会单独讲。实际操作里共轭复数最常用的场景是化简分式。比如[ \frac{1}{abi}\frac{a-bi}{(abi)(a-bi)}\frac{a-bi}{a^2b^2}. ]这就是把分母里的复数“拉直”成实数。只要分母是个复数你第一反应就应该是乘它的共轭这是复数的分母有理化操作跟中学分母里有根号时乘共轭根式是同一个套路。1.2 共轭根式换了个马甲的共轭如果说共轭复数是在复数域里取镜像那么共轭根式就是在实数域里玩同样游戏。形如 (ab\sqrt{c}) 和 (a-b\sqrt{c}) 的两个式子互为共轭根式它们的乘积是[ (ab\sqrt{c})(a-b\sqrt{c})a^2-b^2 c. ]根号被消掉了无理成分被“配平”了。这个操作最经典的用途就是分母有理化比如[ \frac{1}{\sqrt{2}1}\frac{\sqrt{2}-1}{(\sqrt{2}1)(\sqrt{2}-1)}\sqrt{2}-1. ]另一个容易被忽视的场景是极限计算里的分子有理化。碰到 (\lim_{x\to 0}\frac{\sqrt{1x}-1}{x}) 这种形式直接带分母会得到 0/0而分子有理化后[ \frac{\sqrt{1x}-1}{x} \frac{(1x)-1}{x(\sqrt{1x}1)} \frac{1}{\sqrt{1x}1}\to\frac12. ]这里乘的 (\sqrt{1x}1) 就是 (\sqrt{1x}-1) 的共轭根式。同样是用一个镜像表达式把交叉项消掉只是从复数域换成了实数域。1.3 一条连起来的线索把共轭复数和共轭根式放一起看本质上都是“找一对式子相乘之后不再含有某个讨厌的项”。复数里的讨厌项是虚部根式里的讨厌项是根号。这背后其实是一种降维思路把二维方向问题变成一维标量问题。我后来做优化和信号处理时经常发现这类“配对消元”的技巧会以各种形式重新出现。可以这么说共轭复数讲的是复数域里的配对共轭根式是实数域里的配对共轭矩阵是线性变换空间里的配对共轭方向是向量空间里的配对。规律一旦建立后面就一通百通了。2. 线性代数里的共轭共轭矩阵与共轭转置2.1 三个“共轭”容易混共轭矩阵、转置、共轭转置矩阵层面的“共轭”其实有三个相似又不同的运算很多人一开始都有点分不清。第一个是共轭矩阵也叫共轭复数矩阵记作 (\bar{A})操作是把矩阵的每个元素替换成它的共轭复数。这个操作在实矩阵里没有任何变化只有在复矩阵里才有意义。第二个是转置矩阵 (A^T)把行列互换。第三个是共轭转置 (A^)通常定义成 (A^\overline{A^T}(\bar{A})^T)也可以写作 (A^{H})。操作顺序是先转置再逐元素取共轭或者先取共轭再转置结果一样。日常交流里不少人习惯把 (A^*) 直接叫“共轭矩阵”严格讲这是有点偷懒的但大家听得懂就行。正式写法里建议叫共轭转置避免混淆。2.2 为什么复矩阵离不开共轭转置实数矩阵里面向量的内积是 (\langle x,y\rangley^T x)。复向量可不行因为如果 (z) 是复数向量(z^T z\sum z_i^2) 可能不是正实数模长定义就崩了。所以复向量的内积必须带共轭(\langle x,y\rangley^{*}x)。这个细节直接决定了复矩阵的“转置”必须升级成“共轭转置”。典型例子是 Hermite 矩阵它满足[ A^*A, ]也就是矩阵的共轭转置等于它自己。实矩阵里的对称矩阵就是 Hermite 矩阵的特例。Hermite 矩阵的所有特征值都是实数特征向量可以做成标准正交基这让它在量子力学、信号处理、统计协方差矩阵里无处不在。另一种常见矩阵是酉矩阵满足 (U^UI)也就是 (U^{-1}U^)。实矩阵里的正交矩阵就是酉矩阵的特例。2.3 实操中怎么识别和验证做数值计算时判断一个复矩阵是不是 Hermite 矩阵不要靠肉眼直接比较元素对角线元素必须是实数对任意 (i\neq j)(A_{ij}\overline{A_{ji}})。在 NumPy 里可以用np.allclose(A, A.conj().T)快速验证。很多初学者写复数矩阵相关代码时忘记.conj()只做转置结果求出的“特征值”带虚部而且误差极大。这类问题在对称复结构里特别常见属于那种能让你调一晚上 bug 的低级错误。共轭转置在机器学习里还有个很实际的应用线性回归的正规方程 (A^T A xA^T b)如果是复数域的线性系统就必须换成 (A^*A xA^*b)。如果你处理的是复数基带的通信信号忘了共轭转置求出来的最小二乘解基本不能看。3. 优化算法里的共轭共轭方向法与共轭梯度法3.1 最速下降法为什么慢锯齿问题先从一个非常基础的问题出发求解[ \min_{x\in\mathbb{R}^n} \quad f(x)\frac12 x^T A x-b^T x, ]其中 (A) 是正定对称矩阵。这是二次型优化问题也是牛顿法和各类梯度法的基本测试平台。最速下降法每次沿负梯度方向走听上去很合理但实际跑起来有一个著名问题当目标函数的等高线是狭长椭圆时迭代路径会形成严重锯齿沿着山谷两侧来回震荡收敛极慢。原因是相邻两步的搜索方向是正交的但正交不等于“对问题有效”——在椭圆等高线下每个方向都被拉伸或压缩正交方向之间仍然存在耦合。3.2 共轭方向法的思路沿“A-共轭方向”一次到位共轭方向法想解决的问题就是怎么在二次型问题里避免这种锯齿。给定正定对称矩阵 (A)如果两个非零向量 (d_i,d_j) 满足[ d_i^T A d_j0,\qquad i\neq j, ]就称它们关于 (A) 相互共轭或称 (A)-共轭。注意这里的“共轭”跟复数的共轭不是一回事它是借助矩阵 (A) 定义的一种广义正交关系。几何直觉是这样的在椭圆等高线里普通正交方向并不是“独立”的而 (A)-共轭方向才是。如果沿一组共轭方向依次做精确一维搜索对于上面的 n 元正定二次函数最多 n 步就能到达最优点不存在锯齿。相当于你把一个椭圆坐标系换成了它的主轴坐标系问题被“拉直”了。3.3 共轭梯度法用梯度自动生成共轭方向共轭方向法理论上很漂亮但工程上有个问题要预先找出一组 (A)-共轭方向代价往往不低。共轭梯度法Conjugate GradientCG的精妙之处在于它不需要预先知道所有共轭方向而是每步根据当前梯度信息自动生成新的共轭方向并且天然保证与之前所有方向关于 (A) 共轭。经典 CG 算法求解 (Axb)等价于极小化上面那个二次函数的伪代码如下x0 初始点 r0 b - A*x0 d0 r0 for k 0, 1, 2, ...: alpha_k (r_k * r_k) / (d_k * A * d_k) x_{k1} x_k alpha_k * d_k r_{k1} r_k - alpha_k * A * d_k beta_k (r_{k1} * r_{k1}) / (r_k * r_k) d_{k1} r_{k1} beta_k * d_k if norm(r_{k1}) tol: break这里有几个关键点第 k 步的 (r_kb-Ax_k) 是残差也就是目标函数的负梯度。(\alpha_k) 是精确一维搜索的步长对二次函数可以直接解析算出来。(\beta_k) 是方向矫正系数最常见的版本是 Fletcher-Reeves 公式也有 Polak-Ribière 公式。整个算法过程中只需要做一次矩阵向量乘 (A d_k)不需要存储 (A) 的逆或分解结果这是它能处理超大规模稀疏系统的最重要原因。理论上CG 在精确算术下 n 步收敛于精确解实际中加上舍入误差往往需要超过 n 步但依然远快于最速下降法。3.4 实战注意事项预处理与重启用 CG 时间久了有几个坑是必须记住的。第一收敛速度严重依赖矩阵条件数 (\kappa(A)\lambda_{\max}/\lambda_{\min})。条件数越大CG 收敛越慢。所以工业级使用几乎都要配合预处理也就是求解 (M^{-1}AxM^{-1}b)其中 (M) 是 (A) 的一个近似要求容易求逆又能在谱意义上让条件数变小。常见的预处理是 Jacobi 预处理取对角线、不完全 Cholesky 分解、SSOR 预处理等。第二数值稳定性问题。跑了几步之后方向之间可能因为舍入误差失去理论上的共轭性导致收敛变慢。这时候可以每做一定迭代步数就“重启”一次即把当前残差当成新的初始方向重新开始。在我的实际项目里一般迭代超过 50 步不收敛就会考虑重启或者换预处理方式。第三CG 只适用于对称正定矩阵。如果你手里的矩阵不对称直接用 CG 会出现收敛不稳定甚至发散。解决方法是转用 GMRES、BiCGStab 等或者把原问题转成正常的对称正定形式再交给 CG。4. 贝叶斯统计里的共轭共轭分布4.1 共轭分布解决什么问题贝叶斯统计最核心的操作是计算后验分布[ p(\theta|x)\frac{p(x|\theta)p(\theta)}{p(x)}. ]这个式子看着简单但分母 (p(x)\int p(x|\theta)p(\theta),d\theta) 一积分就麻烦。除了极少数简单模型这个积分常常没有解析解只能靠 MCMC 之类的数值采样。MCMC 好用但在线更新、大规模批量处理时太慢。共轭分布就是来救场的如果先验分布 (p(\theta)) 和似然函数 (p(x|\theta)) 搭配起来后验分布 (p(\theta|x)) 与先验属于同一个分布族那这种先验就叫做该似然的共轭先验。此时后验分布的参数可以写成解析更新的形式完全不用跑采样直接套公式更新即可。4.2 四对最常用的共轭组合实际项目里最常用的几组我整理下来基本就是这些似然分布共轭先验后验形式二项分布 Binomial(n, y)Beta(α, β)Beta(αy, βn-y)多项分布 Multinomial(y)Dirichlet(α)Dirichlet(αcounts)泊松分布 Poisson(y)Gamma(α, β)Gamma(αΣy, βn)正态分布方差已知正态 N(μ0, σ0²)正态均值是样本均值与先验均值的加权平均Beta-Binomial 是最简单的模型很适合第一次理解共轭。你观察一批二分类实验的成功次数 y先验觉得成功率 θ 大概在 α/(αβ) 附近于是把先验设为 Beta(α,β)。看到数据后后验直接把成功次数加到 α 里、失败次数加到 β 里分布黏贴在一起一步更新。Dirichlet-Multinomial 是 Beta-Binomial 的多类别推广做文本主题模型、多分类在线学习时非常有用。Gamma-Poisson 组合适合做事件发生率估计比如客服请求量、系统故障次数。先验 Gamma(α,β) 可以直观理解成“过去的 α 次事件发生在长度为 β 的时间窗里”后验就是“把新观察到的事件次数和时间窗口加进去”解释性很强。4.3 实操心得先验到底怎么选关于共轭先验我有几点实际体会。首先共轭先验是为了计算方便但不是说选了共轭先验就万事大吉。先验信息太强、数据量少的时候共轭先验会严重主导后验。比如 Beta(0.1, 0.1) 这种弱信息先验和 Beta(100, 100) 这种强先验在只有几条数据时结论差别巨大。其次建模时不要为了“凑共轭”硬选不合适的分布。比如某些场景下对数正态分布先验比 Gamma 更符合物理直觉但为了让后验可解析而强行用 Gamma这属于本末倒置。共轭先验只是工具不是目标。最后在线 A/B 测试和强化学习里的 Thompson 采样很喜欢用 Beta-Binomial 共轭结构因为每次用户点击数据落袋可以毫秒级更新后验参数不需要重跑 MCMC。我在做转化率预估时也用过这套数据流的更新就是对 α、β 各加几行代码的事非常顺滑。5. 凸优化里的共轭共轭函数5.1 共轭函数的几何直觉凸优化里的共轭函数定义如下对函数 (f:\mathbb{R}^n\to\mathbb{R}\cup{\infty})其共轭函数为[ f^*(y)\sup_{x\in\mathrm{dom} f}\left(y^T x-f(x)\right). ]第一次看到这个式子的人多半会觉得莫名其妙。我当时琢磨了很久找到一个比较易懂的几何图像。想象函数 (yf(x)) 是一条曲线。对于固定的斜率 (y)(f^*(y)) 衡量的是在所有的 x 中直线 (y x) 比曲线 (f(x)) 高出多少的最大值。换句话说它是斜率为 y 的支撑线的截距的相反数。如果 f 是凸函数那么在每一点附近用不同斜率去“顶”曲线所有支撑线的包络就能完整描述函数本身。更妙的是大多数情况下 (f^{**}f)也就是说共轭操作像一种“反射”把函数空间映射回自身。这正是“共轭”一词在凸分析里的含义它是对偶空间里的镜像配对。这也是 Legendre 变换的推广。物理里从拉格朗日量到哈密顿量的变换就是共轭函数思想的应用场景。5.2 常见函数的共轭表做优化的朋友手里值得有一张常用共轭函数表我把自己常用的几个放出来原函数 (f(x))定义域共轭函数 (f^*(y))定义域(\frac12 x^2)(\mathbb{R})(\frac12 y^2)(\mathbb{R})(e^x)(\mathbb{R})(y\log y-y)(y\ge 0)(-\log x)(x0)(-\log(-y)-1)(y0)(x\log x)(x\ge 0)(e^{y-1})(\mathbb{R})二次型 (\frac12 x^T Qx)(\mathbb{R}^n)(\frac12 y^T Q^{-1}y)(\mathbb{R}^n)0 常数零全空间(0) 当且仅当 (y0)否则 (\infty)指示函数的对偶表中最后一行有点微妙常数函数的共轭是“在 y0 处为 0、其余为无穷”的指示函数。这种对偶关系在推导对偶问题时非常关键。5.3 共轭函数在机器学习里的用处共轭函数最常见的工程应用是把原问题转成对偶问题。比如 SVM 的原始问题拉格朗日对偶之后得到的对偶形式本质上就是在处理原目标函数的共轭。逻辑回归的正则化项同理L1 正则项 (|x|_1) 的共轭是指示函数的形式这引出很多近端梯度算法与对偶加速方法。做算法实现时我遇到最多的情况是目标函数分解成多个部分之和每一部分单独取共轭很方便但合在一起很难。这时可以用 Fenchel 对偶把问题拆开配合近端算子迭代求解。这类方法在图像去噪、稀疏恢复里非常普适。还有一个很多人忽略的点共轭函数算出来的对偶问题有时能给出原问题的下界这对评价近似解质量很有用。调超参数时我最喜欢用对偶间隙判断优化器到底收敛到多好。6. 信号处理里的共轭傅里叶变换的共轭对称6.1 共轭对称的数学表达连续时间傅里叶变换的定义是[ X(f)\int_{-\infty}^{\infty}x(t)e^{-j2\pi ft},dt. ]如果 (x(t)) 是实信号那么取共轭之后有[ X^*(f)X(-f). ]这就是傅里叶变换的共轭对称性。展开来看幅度谱是偶函数(|X(f)||X(-f)|)相位谱是奇函数(\angle X(f)-\angle X(-f))实部是偶函数虚部是奇函数。放到离散傅里叶变换DFT的语境下对长度为 N 的实序列 (x[n])频域满足[ X[k]X^*[N-k]. ]也就是说频谱只需要存储一半另外一半可以通过共轭对称关系完全恢复。6.2 工程应用频谱只需存一半共轭对称最直接的工程影响是处理实信号时频谱只需存一半。在 Python 的 NumPy 中直接对应np.fft.rfft。它返回的是从直流分量到奈奎斯特频率的 (\lfloor N/2\rfloor1) 个点另一半负频率部分全靠共轭对称关系隐式补齐。做语音处理、音频分析、实值传感器信号处理时用rfft而不是fft内存直接省近一半而且语义上更清晰。画频谱图时很多新手第一次看到完整fft结果会疑惑为什么对称的为什么有一半是冗余原因就在这里。用rfft就没这个困惑了画图时直接取幅值的一半频率范围即可。我在给同事做培训时常说只要你的信号是采集来的物理量电压、温度、麦克风输出绝大多数都是实信号那么频域天然共轭对称不要画冗长的双边谱去吓自己用rfft就够了。6.3 操作细节FFT 的对称轴和相位展开实际用 DFT 做频谱分析时有几个关于共轭对称的细节最容易踩坑。第一fft结果里索引 0 是直流索引 1 到 N/2 是正频率索引 N/21 到 N-1 是负频率。共轭对称轴在 N/2 附近。如果你想看完整的双边频谱需要用fftshift把零频搬到中间。不要忘了先对结果取模再画模值图。第二相位谱受数值噪声影响可能不再严格满足奇对称。画相位图时如果发现高频段相位图上出现大量“±π 掩蔽”往往是数值误差导致的不是物理现象。处理办法是设一个幅度阈值幅度太低的频率点不显示相位。第三如果信号本身是复信号共轭对称性就不一定成立。通信里的基带复信号就是如此只有实信号的基带等效建模才会考虑单边谱。搞清“我的信号是实还是复”是所有频谱分析的第一步。7. 一张表把共轭家族联系起来 踩坑速查7.1 共轭五兄弟对比表写到这里把全文提到的“共轭”放在一张表里做对照方便随时查阅名称领域核心定义解决的关键问题实际应用共轭复数复分析(\bar{z}a-bi)消去虚部得到模长平方分式化简、模长计算、谐波分析共轭根式初等代数((\sqrt{a}\sqrt{b})(\sqrt{a}-\sqrt{b})a-b)消去根号分母有理化、极限分子有理化共轭转置线性代数(A^*\overline{A^T})定义复数域内积、正交、对称Hermite 矩阵、酉矩阵、复数最小二乘共轭方向数值优化(d_i^T A d_j0)消除迭代方向之间的耦合共轭方向法、共轭梯度法共轭分布贝叶斯统计(后验与先验同分布族)解析更新后验免采样在线 A/B、点击率预估、主题模型共轭函数凸优化(f^*(y)\sup_x(y^T x-f(x)))原始问题转对偶问题SVM 对偶、近端梯度算法共轭对称信号处理实信号 (X^*(f)X(-f))去掉频域一半冗余rfft、单边谱分析、调制解调共同点一眼就能看出来都是通过配对、翻转、取逆或转置让原本不对称或耦合严重的问题变得对称、解耦、可计算。7.2 常见问题速查表再整理几个实操中反复出现的问题直接给出排查方向现象可能原因解决办法复数矩阵求特征值有虚部明显不对忘记用共轭转置判断 Hermite 结构用A.conj().T对比检查是否是 Hermite 矩阵CG 迭代迟迟不收敛矩阵条件数太高或矩阵不对称做预处理确认矩阵是对称正定必要时重启迭代贝叶斯后验更新结果偏得离谱先验参数设置过强数据量太少了使用弱信息先验或用模拟数据先验证更新公式对偶问题推导不出来忘了先判断原函数是否闭凸或定义域没注意检查 (\mathrm{dom}f) 是否有限制必要时扩展为广义实数取值实信号 FFT 画出来对称但不理解没意识到共轭对称性改用rfft只取正频率部分分析用复信号傅里叶分析时频谱不对称正常现象复信号没有共轭对称约束修改系统模型确认信号到底是实还是复最后分享一点个人体会。我在学校的时候总觉得这些“共轭”是不同课程各自独立的考点背完就忘。直到工作后亲自实现一个有预处理共轭梯度求解器又在贝叶斯模型里用共轭分布做在线更新才突然意识到它们骨子里是同一种东西找一个合适的“镜像配对”把纠缠在一起的变量解耦把复杂的计算变成简单的组合。这个思想在数学里来回出现不是巧合而是人类处理复杂系统时最顺手的那把钥匙。如果你正在学其中某个共轭概念觉得头大我的建议很朴素先不要背公式先画一张图或者拿笔算个二维的小例子。比如手算一个 2×2 矩阵的 CG 迭代或者手推一次 Beta-Binomial 的后验更新你会立刻比死记硬背多懂一倍。等你把这些“共轭”都亲手用过一遍就会发现它们不再是几个生疏名词而是一整套能迁移的思考方式。
返回列表