SVD算法与python实践

1.前言

SVD算法在气象的分析中经常有用到,主要是用来比较两个场的相关结构关系,做一下说一下该算法的自我体会。

2.计算方法概论

首先作为引入,首先要提到之前将到的EOF和PCA的分解方法。

http://blog.csdn.net/maliang_1993/article/details/51284603

EOF或PCA主要计算步骤是矩阵的特征值和特征向量的计算一样:EOF里面是将m个格点或者是PCA里面m个成分的协方差矩阵进行特征值分解,然后找出相关的特征值及特征向量。

《SVD算法与python实践》
基本的公式在这里。
同样,对于分析两个场的相关性,SVD的本质就是将两个场分别的进行模态分离(我理解,询问老师也是这么理解的,但是还为证实),然后分别两两做相关系数,取前K个相关高的模态对。大概就是这个过程。
所以用SVD判断两个场的相关性的话,需要几个条件都满足,才能说两个场具有较强的相关性。首先,各自分离的模态在各自场中解释方差应该比较大,至少应该排在前几位。说明各自的模态是各场的主模态。其次,在奇异值分解后的中的奇异值矩阵,该模态对所对应的奇异值在奇异值矩阵中占比也应该排名较前。两者之一不满足,都不能说明两个场有很好的相关性。

3.SVD分解定义

《SVD算法与python实践》
《SVD算法与python实践》
《SVD算法与python实践》
下面用到的就是3.19式。
大sigma中的对角线上的每一个小sigma就是对应两个场时间系数序列的协方差。协方差当然越大越好了,对于同一个数据来说。

4.算法具体过程

【来自@李丽平课件】
《SVD算法与python实践》
《SVD算法与python实践》
《SVD算法与python实践》
以上就是EOF用在两个场上的分解方式,各自空间性正交归一,时间系数正交,均值为0。两个场均为时间距平场。
《SVD算法与python实践》
3.2.13式中,左端是分解出的各自分解某个时间序列(主成分)的协方差,右端是对于原始的两个场的协方差矩阵左右各乘以对应的模态场。该式子可以理解为,某两个主成分对应的协方差的值是对原始m1*m2的协方差矩阵左右各乘模态场进行映射的结果。
《SVD算法与python实践》
《SVD算法与python实践》
《SVD算法与python实践》
我们追求的结果就是找到这样两个时间系数(主成分)使得他们最相关,协方差最大。(不明白为什么不除以各自标准差做成相关系数)
《SVD算法与python实践》
《SVD算法与python实践》
后面这18,19式其实就是各自S,Z场的特征向量分解sigma方是对应的特征值。

【在这里又不太明白了,每个场对应的特征值不应该是有限个,且不能伸缩的么?万一两个场没有一样的特征值呢?可能这块我理解错了。】

5.奇异值分解向量的成对关系

《SVD算法与python实践》
《SVD算法与python实践》

可以看出4组正反配对中只有两对是符合奇异值分解条件的。而在不同的奇异值分解内部算法(不是十分严格,但是却能很快求出奇异向量(模态对))中,可能存在将两个错误的配对关系进行配对的情况,这样造成的相关性可能存在问题(应该是正相关,反相关的差异吧?没有验证)。

6.尾语

还有SVD的相关检验方法和之前一些遗留问题并没有理解清楚,并且好像找到老师布置任务的一点点曙光。(一个场能不能被某一系列的正交基不经线型转换得到,使得对于原场的方差解释达到最大)

点赞