关于工程对点
SVD性质
关于SVD定义,计算,请参考[1]。
奇异值通常按从大到小排列。许多实际数据矩阵的奇异值会快速衰减,因此可用前 k 个奇异值及其对应的左右奇异向量做低秩近似;具体衰减速度仍取决于矩阵本身的结构。
即也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵:
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVn×kT
其中k比𝑛小很多(m>n>k),也就是一个大的矩阵𝐴可以用三个小的矩阵 𝑈𝑚×𝑘 Σ𝑘×𝑘 𝑉𝑘×𝑛𝑇来表示。如下图所示,现在我们的矩阵A只需要灰色的部分的三个小矩阵就可以近似描述了
由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。同时,介绍这个性质在后面解决符号模糊问题中有重要应用。
符号随机性问题介绍
利用上面推出的SVD性质,即:
Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVn×kT
改写成如下向量形式:
Am×n≈k=1∑KσkukvkT
对每一组奇异向量满足如下:
σkukvkT=σk(−uk)(−vk)T
这样 SVD 分解本身不唯一规定每个奇异向量的符号。在实际算法实现时,这种不确定性会被保留,因此单个奇异向量的整体符号可以翻转。具体符号由实现约定与数值过程决定;就分解重构所表示的数据而言,二者没有差别。
符号随机性影响
正数数值影响
虽然上面的问题在数学上没有任何影响,但是在实际应用中有非常大的影响。
下列数据表格为不同国家,三种酒的平均消费量每年,人均预期寿命,心脏病发病率,具体如下:
A矩阵和Matlab结果如下:
A=2.50000.90001.70001.20001.50002.00003.80001.00002.10000.800063.500058.000046.000015.700012.20008.90002.70001.70001.00000.200040.100025.100065.0000102.1000100.000087.800017.1000140.000055.000050.400078.000078.000078.000078.000077.000076.000069.000073.000079.000073.000061.100094.1000106.4000173.0000199.7000176.0000373.6000283.700034.700036.4000
尽管 A 是全正数据,这次计算得到的奇异向量仍全部为负号。SVD 的符号并不由矩阵元素的正负唯一决定;不同实现、版本或数值路径都可能给出整体符号相反而等价的奇异向量。
音频影响
在音频数据处理中,比如使用MVDR做如下对比实验:
- 正常使用 Matlab中SVD函数结果生成音频。
- 将SVD结果符号全部翻转生成音频。
- 随机翻转SVD结果符号生成音频。
1/2对比:
1/3对比:
从分解本身看,正负两个方向完全等价;若后续处理需要单独使用奇异向量,就要另外指定方向。一个直观的约定是让它尽量朝向数据中贡献较大的那些向量。这是为结果选择一致的表示方式,而不是从矩阵中找到了唯一的“正确符号”。
解决方法介绍
先看下面四幅二维图。每一幅中的浅色细线都是数据向量,深色粗虚线和粗实线代表同一条奇异向量所允许的两个相反方向。以右奇异向量为例,横、纵轴是两个变量,一行数据就对应平面中的一条浅色细线;粗虚线表示一次 SVD 运算给出的方向,粗实线表示按数据方向统一符号后的结果。

这四组数据的张开角度和向量长度并不相同,但可以用同一个办法读图:从原点沿着粗虚线观察,图中贡献较大的浅色向量多数落在背后;沿粗实线观察,它们则主要落在前方,于是选择粗实线方向。右下图尤其能说明,“多数”不表示每条细线都必须落在同一侧:其中仍有明显指向另一侧的向量,判定依据是各向量投影后的合计贡献,不是逐条投票。图中的端点位置只是示意,具体数值不能从画出来的线长直接反推。
从图上的方向变成可计算的分数
设 A∈RM×N,第 k 对左右奇异向量为 uk∈RM、vk∈RN。先拿图中的右奇异向量来说,把 A 的第 m 行转置记作 rm∈RN,计算投影
pm=vkTrm.
pm>0 表示该数据向量与 vk 大致同向,pm<0 表示落在反向半平面;∣pm∣ 越大,说明它在该方向上的投影越强。图中那些接近垂直于粗线的细线,投影接近零,对方向选择的影响也应较小。只数正负个数会把弱投影和强投影看成一样,因此用带符号的平方作汇总:
sright=m=1∑Msign(pm)pm2=m=1∑Mpm∣pm∣.
如果 sright>0,当前右奇异向量朝向加权后占优势的一侧;若 sright<0,则应取图中与它相反的方向。例如四个投影为 −2,−1,−0.5,0.4 时,分数是 −4−1−0.25+0.16=−5.09,所以翻转方向。这里的数值只是为了展示计算,并非从图中读取。
左奇异向量同理,只是比较对象换成 A 的各列 an∈RM:
qn=ukTan,sleft=n=1∑Nqn∣qn∣.
两个分数可能都为正、都为负,也可能一正一负。关键限制是 uk 和 vk 不能各按自己的分数独立翻转,因为
σkukvkT=σk(−uk)(−vk)T,
而只翻转其中一个向量,会把这一项变成负数。两个分数同号时,按共同符号决定是否同时翻转;若它们意见相反,就以绝对值较大的分数决定这一对向量的共同方向。较弱的一侧此时不能被单独“纠正”,它只是让位于另一侧较强的证据。这是一条方向约定,不是让两个分数同时达到最大值的保证。
实际计算时的顺序
下面的 MATLAB 写法对应上述公式。U(:,k)'*A 一次得到左奇异向量对所有数据列的投影,A*V(:,k) 一次得到右奇异向量对所有数据行的投影。选定共同方向后,代码始终成对修改 U 和 V:
[U, S, V] = svd(A, 'econ');
K = min(size(A));
for k = 1:K
p_left = U(:, k)' * A; % 1 × N:投影到各数据列
p_right = A * V(:, k); % M × 1:投影到各数据行
s_left = sum(p_left .* abs(p_left));
s_right = sum(p_right .* abs(p_right));
if abs(s_left) >= abs(s_right)
score = s_left;
else
score = s_right;
end
if score < 0
U(:, k) = -U(:, k);
V(:, k) = -V(:, k);
end
end
relative_error = norm(A - U*S*V', 'fro') / norm(A, 'fro');
relative_error 应保持在浮点计算误差范围内,说明这一步只改变了奇异向量的表示方向,没有改变矩阵重构。若两个分数都很接近零,数据本身不能给出稳定的方向;对连续帧或频点,更合适的做法是拿前一帧或已确定的参考向量作内积,让相邻结果保持同向。若相邻奇异值相等或非常接近,奇异向量还可能在对应子空间内旋转,此时只做正负翻转也不足以完成对齐。
把这个约定用到音频处理时,还需分清究竟使用了什么:如果最终只使用 UΣVT 的重构矩阵,成对翻转不会改变音频;如果把某一个奇异向量单独用作 MVDR 的方向估计,或者逐帧使用它的相位,方向不连续才可能传到输出。单次全局极性翻转通常不改变幅度谱,也不能据此推断音质改善;真正值得检查的是帧间、频点间是否出现不一致,以及它有没有影响后续计算。图中的波形对比可以用来检查输出极性和幅度,但不能单凭截图判断主观听感。

实践及结论
MATLAB 所使用的 LAPACK Linear Algebra PACKage 会按其实现约定返回奇异向量,但不保证与其他实现采用相同的整体符号。在本次测试音频中,86.75% 的方向一致,其余结果表现为整体符号相反。
符号模糊问题解决算法的意义:
- 可以对 SVD 的输出进行校验。该方法可跨平台移植,为不同实现选择一致的方向约定;优化版本的 SVD 函数可以在项目中使用。
- 方向约定可以减少单独使用奇异向量时的符号跳变;如果只看成对奇异向量构成的矩阵,重构结果并不会改变。音频是否改善,还要结合后续算法和可复听的结果判断,不能把符号统一率当成音质准确率。
参考文献
[1] 博客
[2] 线性代数及其应用.第三版 David C.Lay 著
[3] Bro、Acar 与 Kolda:Resolving the Sign Ambiguity in the Singular Value Decomposition
交流与讨论
评论加载中…