RESEARCH / PRACTICE / NOTES

svd符号随机性问题及解决方案

说明奇异值分解中左右奇异向量的符号不唯一性,并给出在工程处理中统一向量方向的一种判定思路。

#矩阵分解
关键词数学Matlab仿真
折叠曲面以正片与负片叠印,反转明暗仍对齐同一轮廓
本文目录 · 9 个章节
  1. SVD性质
  2. 符号随机性问题介绍
  3. 符号随机性影响
  4. 正数数值影响
  5. 音频影响
  6. 解决方法介绍
  7. 从图上的方向变成可计算的分数
  8. 实际计算时的顺序
  9. 实践及结论

关于工程对点

SVD性质

关于SVD定义,计算,请参考[1]。 奇异值通常按从大到小排列。许多实际数据矩阵的奇异值会快速衰减,因此可用前 kk 个奇异值及其对应的左右奇异向量做低秩近似;具体衰减速度仍取决于矩阵本身的结构。 即也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵:

Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVn×kTA_{m \times n}=U_{m \times m} \Sigma_{m \times n} V_{n \times n}^{T} \approx U_{m \times k} \Sigma_{k \times k} V_{n \times k}^{T}

其中k比𝑛小很多(m>n>k),也就是一个大的矩阵𝐴可以用三个小的矩阵 𝑈𝑚×𝑘 Σ𝑘×𝑘 𝑉𝑘×𝑛𝑇来表示。如下图所示,现在我们的矩阵A只需要灰色的部分的三个小矩阵就可以近似描述了 img 由于这个重要的性质,SVD可以用于PCA降维,来做数据压缩和去噪。同时,介绍这个性质在后面解决符号模糊问题中有重要应用。

符号随机性问题介绍

利用上面推出的SVD性质,即:

Am×n=Um×mΣm×nVn×nT≈Um×kΣk×kVn×kTA_{m \times n}=U_{m \times m} \Sigma_{m \times n} V_{n \times n}^{T} \approx U_{m \times k} \Sigma_{k \times k} V_{n \times k}^{T}

改写成如下向量形式:

Am×n≈∑k=1KσkukvkTA_{m \times n} \approx \sum_{k=1}^{K} \sigma_{k} \mathbf{u}_{k} \mathbf{v}_{k}^{\mathrm{T}}

对每一组奇异向量满足如下:

σkukvkT=σk(−uk)(−vk)T\sigma_{k} \mathbf{u}_{k} \mathbf{v}_{k}^{\mathrm{T}}=\sigma_{k}\left(-\mathbf{u}_{k}\right)\left(-\mathbf{v}_{k}\right)^{\mathrm{T}}

这样 SVD 分解本身不唯一规定每个奇异向量的符号。在实际算法实现时,这种不确定性会被保留,因此单个奇异向量的整体符号可以翻转。具体符号由实现约定与数值过程决定;就分解重构所表示的数据而言,二者没有差别。

符号随机性影响

正数数值影响

虽然上面的问题在数学上没有任何影响,但是在实际应用中有非常大的影响。 下列数据表格为不同国家,三种酒的平均消费量每年,人均预期寿命,心脏病发病率,具体如下: img A矩阵和Matlab结果如下:

A=(2.500063.500040.100078.000061.10000.900058.000025.100078.000094.10001.700046.000065.000078.0000106.40001.200015.7000102.100078.0000173.00001.500012.2000100.000077.0000199.70002.00008.900087.800076.0000176.00003.80002.700017.100069.0000373.60001.00001.7000140.000073.0000283.70002.10001.000055.000079.000034.70000.80000.200050.400073.000036.4000)A=\left(\begin{array}{lcccc} 2.5000 & 63.5000 & 40.1000 & 78.0000 & 61.1000 \\ 0.9000 & 58.0000 & 25.1000 & 78.0000 & 94.1000 \\ 1.7000 & 46.0000 & 65.0000 & 78.0000 & 106.4000 \\ 1.2000 & 15.7000 & 102.1000 & 78.0000 & 173.0000 \\ 1.5000 & 12.2000 & 100.0000 & 77.0000 & 199.7000 \\ 2.0000 & 8.9000 & 87.8000 & 76.0000 & 176.0000 \\ 3.8000 & 2.7000 & 17.1000 & 69.0000 & 373.6000 \\ 1.0000 & 1.7000 & 140.0000 & 73.0000 & 283.7000 \\ 2.1000 & 1.0000 & 55.0000 & 79.0000 & 34.7000 \\ 0.8000 & 0.2000 & 50.4000 & 73.0000 & 36.4000 \end{array}\right)

img 尽管 A 是全正数据,这次计算得到的奇异向量仍全部为负号。SVD 的符号并不由矩阵元素的正负唯一决定;不同实现、版本或数值路径都可能给出整体符号相反而等价的奇异向量。

音频影响

在音频数据处理中,比如使用MVDR做如下对比实验:

  1. 正常使用 Matlab中SVD函数结果生成音频。
  2. 将SVD结果符号全部翻转生成音频。
  3. 随机翻转SVD结果符号生成音频。 1/2对比: img img 1/3对比: img img 从分解本身看,正负两个方向完全等价;若后续处理需要单独使用奇异向量,就要另外指定方向。一个直观的约定是让它尽量朝向数据中贡献较大的那些向量。这是为结果选择一致的表示方式,而不是从矩阵中找到了唯一的“正确符号”。

解决方法介绍

先看下面四幅二维图。每一幅中的浅色细线都是数据向量,深色粗虚线和粗实线代表同一条奇异向量所允许的两个相反方向。以右奇异向量为例,横、纵轴是两个变量,一行数据就对应平面中的一条浅色细线;粗虚线表示一次 SVD 运算给出的方向,粗实线表示按数据方向统一符号后的结果。

四组二维数据向量、SVD 返回的第一右奇异向量及统一符号后的方向

这四组数据的张开角度和向量长度并不相同,但可以用同一个办法读图:从原点沿着粗虚线观察,图中贡献较大的浅色向量多数落在背后;沿粗实线观察,它们则主要落在前方,于是选择粗实线方向。右下图尤其能说明,“多数”不表示每条细线都必须落在同一侧:其中仍有明显指向另一侧的向量,判定依据是各向量投影后的合计贡献,不是逐条投票。图中的端点位置只是示意,具体数值不能从画出来的线长直接反推。

从图上的方向变成可计算的分数

设 A∈RM×NA\in\mathbb R^{M\times N},第 kk 对左右奇异向量为 uk∈RM\mathbf u_k\in\mathbb R^M、vk∈RN\mathbf v_k\in\mathbb R^N。先拿图中的右奇异向量来说,把 AA 的第 mm 行转置记作 rm∈RN\mathbf r_m\in\mathbb R^N,计算投影

pm=vkTrm.p_m=\mathbf v_k^{\mathsf T}\mathbf r_m.

pm>0p_m>0 表示该数据向量与 vk\mathbf v_k 大致同向,pm<0p_m<0 表示落在反向半平面;∣pm∣|p_m| 越大,说明它在该方向上的投影越强。图中那些接近垂直于粗线的细线,投影接近零,对方向选择的影响也应较小。只数正负个数会把弱投影和强投影看成一样,因此用带符号的平方作汇总:

sright=∑m=1Msign⁡(pm)pm2=∑m=1Mpm∣pm∣.s_{\rm right}=\sum_{m=1}^{M}\operatorname{sign}(p_m)p_m^2 =\sum_{m=1}^{M}p_m|p_m|.

如果 sright>0s_{\rm right}>0,当前右奇异向量朝向加权后占优势的一侧;若 sright<0s_{\rm right}<0,则应取图中与它相反的方向。例如四个投影为 −2,−1,−0.5,0.4-2,-1,-0.5,0.4 时,分数是 −4−1−0.25+0.16=−5.09-4-1-0.25+0.16=-5.09,所以翻转方向。这里的数值只是为了展示计算,并非从图中读取。

左奇异向量同理,只是比较对象换成 AA 的各列 an∈RM\mathbf a_n\in\mathbb R^M:

qn=ukTan,sleft=∑n=1Nqn∣qn∣.q_n=\mathbf u_k^{\mathsf T}\mathbf a_n,\qquad s_{\rm left}=\sum_{n=1}^{N}q_n|q_n|.

两个分数可能都为正、都为负,也可能一正一负。关键限制是 uk\mathbf u_k 和 vk\mathbf v_k 不能各按自己的分数独立翻转,因为

σkukvkT=σk(−uk)(−vk)T,\sigma_k\mathbf u_k\mathbf v_k^{\mathsf T} =\sigma_k(-\mathbf u_k)(-\mathbf v_k)^{\mathsf 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ΣVTU\Sigma V^{\mathsf T} 的重构矩阵,成对翻转不会改变音频;如果把某一个奇异向量单独用作 MVDR 的方向估计,或者逐帧使用它的相位,方向不连续才可能传到输出。单次全局极性翻转通常不改变幅度谱,也不能据此推断音质改善;真正值得检查的是帧间、频点间是否出现不一致,以及它有没有影响后续计算。图中的波形对比可以用来检查输出极性和幅度,但不能单凭截图判断主观听感。

音频处理中统一奇异向量方向前后的波形对比

实践及结论

MATLAB 所使用的 LAPACK Linear Algebra PACKage 会按其实现约定返回奇异向量,但不保证与其他实现采用相同的整体符号。在本次测试音频中,86.75% 的方向一致,其余结果表现为整体符号相反。 符号模糊问题解决算法的意义:

  1. 可以对 SVD 的输出进行校验。该方法可跨平台移植,为不同实现选择一致的方向约定;优化版本的 SVD 函数可以在项目中使用。
  2. 方向约定可以减少单独使用奇异向量时的符号跳变;如果只看成对奇异向量构成的矩阵,重构结果并不会改变。音频是否改善,还要结合后续算法和可复听的结果判断,不能把符号统一率当成音质准确率。

参考文献

[1] 博客

[2] 线性代数及其应用.第三版 David C.Lay 著

[3] Bro、Acar 与 Kolda:Resolving the Sign Ambiguity in the Singular Value Decomposition

交流与讨论

评论加载中…

随便读一篇 →

站内搜索

输入关键词开始搜索。

搜索内容不会上传 Esc 关闭

订阅明月入怀

将下面的网址添加到你的 RSS 阅读器。