SVD演算法與python實踐

2021-07-11 19:49:03 字數 1951 閱讀 5601

svd演算法在氣象的分析中經常有用到,主要是用來比較兩個場的相關結構關係,做一下說一下該演算法的自我體會。

首先作為引入,首先要提到之前將到的eof和pca的分解方法。

eof或pca主要計算步驟是矩陣的特徵值和特徵向量的計算一樣:eof裡面是將m個格點或者是pca裡面m個成分的協方差矩陣進行特徵值分解,然後找出相關的特徵值及特徵向量。

基本的公式在這裡。

同樣,對於分析兩個場的相關性,svd的本質就是將兩個場分別的進行模態分離(我理解,詢問老師也是這麼理解的,但是還為證實),然後分別兩兩做相關係數,取前k個相關高的模態對。大概就是這個過程。

所以用svd判斷兩個場的相關性的話,需要幾個條件都滿足,才能說兩個場具有較強的相關性。首先,各自分離的模態在各自場中解釋方差應該比較大,至少應該排在前幾位。說明各自的模態是各場的主模態。其次,在奇異值分解後的中的奇異值矩陣,該模態對所對應的奇異值在奇異值矩陣中佔比也應該排名較前。兩者之一不滿足,都不能說明兩個場有很好的相關性。

下面用到的就是3.19式。

大sigma中的對角線上的每乙個小sigma就是對應兩個場時間係數序列的協方差。協方差當然越大越好了,對於同乙個資料來說。

【來自@李麗平課件】

以上就是eof用在兩個場上的分解方式,各自空間性正交歸一,時間係數正交,均值為0。兩個場均為時間距平場。

3.2.13式中,左端是分解出的各自分解某個時間序列(主成分)的協方差,右端是對於原始的兩個場的協方差矩陣左右各乘以對應的模態場。該式子可以理解為,某兩個主成分對應的協方差的值是對原始m1*m2的協方差矩陣左右各乘模態場進行對映的結果。

我們追求的結果就是找到這樣兩個時間係數(主成分)使得他們最相關,協方差最大。(不明白為什麼不除以各自標準差做成相關係數)

後面這18,19式其實就是各自s,z場的特徵向量分解sigma方是對應的特徵值。

【在這裡又不太明白了,每個場對應的特徵值不應該是有限個,且不能伸縮的麼?萬一兩個場沒有一樣的特徵值呢?可能這塊我理解錯了。】

可以看出4組正反配對中只有兩對是符合奇異值分解條件的。而在不同的奇異值分解內部演算法(不是十分嚴格,但是卻能很快求出奇異向量(模態對))中,可能存在將兩個錯誤的配對關係進行配對的情況,這樣造成的相關性可能存在問題(應該是正相關,反相關的差異吧?沒有驗證)。

還有svd的相關檢驗方法和之前一些遺留問題並沒有理解清楚,並且好像找到老師布置任務的一點點曙光。(乙個場能不能被某一系列的正交基不經線型轉換得到,使得對於原場的方差解釋達到最大)

推薦 SVD演算法

矩陣作用於向量的意義是 對向量進行旋轉和縮放,更加抽象的說,是將這個向量從一組正交基空間旋轉到另一組正交基空間,並縮放 對於實對稱矩陣,存在 m v i lambda v i即存在一組正交基,m的作用只是拉伸 對應特徵分解 但是對於更加一般的矩陣m m v i lambda u i即不同組正交基之間...

SVD演算法理解

svd是一種強大的降維工具,同時也用於去噪,或壓縮,本質上svd是使用奇異值分解,這是矩陣中的一種解法。svd演算法將原始資料 data,分解為 u 維度 data m,n u m,m 其實u是乙個正交矩陣,也是a at的特徵向量 vt n,n 其它vt也是乙個正交矩陣,也是at a 的特徵向量 如...

用於推薦系統的SVD演算法python實現

svd演算法python實現 之前看到一篇實現svd演算法的blog,但是實現方法沒有用到矩陣。為了更直觀簡便高效的實現svd演算法,在這裡基於numpy重新寫了一遍。這裡用到的演算法是優化下面這個目標函式 如下 引數 mat 輸入矩陣,feature latent factor數量 def svd...