numpy 矩陣對角線 學習筆記 矩陣SVD分解

2021-10-14 09:54:03 字數 1806 閱讀 8497

特徵值分解矩陣不能適用於所有矩陣,對於無法進行特徵值分解的矩陣,我們使用svd分解的方法。

對任意乙個

其中,矩陣

的每乙個列向量是左奇異向量,對應

的特徵向量,矩陣

的每乙個列向量(也就是矩陣

的每乙個行向量)是右奇異向量,對應

的特徵向量。

另外,矩陣

有可能是「高瘦型」,也有可能是「矮胖型」,這取決於矩陣

的形狀,但是不論形狀如何,矩陣

只有在主對角線上存在非零元素,這些元素是

的特徵值的算數平方根,也是

的特徵值的算數平方根,稱為矩陣

的奇異值。

python中的numpy庫有svd分解方法。

>>> import numpy as np

>>> a = np.array([[1,2,3,4],[5,6,7,8]])

>>> a

array([[1, 2, 3, 4],

[5, 6, 7, 8]])

首先定義乙個2行4列的矩陣,其中元素的值隨意。

>>> u, d, vt = np.linalg.svd(a)

>>> u

array([[-0.37616823, -0.92655138],

[-0.92655138, 0.37616823]])

>>> d

array([14.22740741, 1.25732984])

>>> vt

array([[-0.35206169, -0.44362578, -0.53518987, -0.62675396],

[ 0.75898127, 0.3212416 , -0.11649807, -0.55423774],

[-0.40008743, 0.25463292, 0.69099646, -0.54554195],

[-0.37407225, 0.79697056, -0.47172438, 0.04882607]])

可以看出左右奇異向量所在的矩陣的形狀。特別注意,中間的矩陣

只儲存了主對角線上的非零元素,並且是按照由大到小的順序排列。

矩陣svd分解是為了減少大矩陣在計算機中的儲存,提高矩陣運算速度。我們需要在數學表達上進一步討論。

其中,求和表示式中的

是矩陣

的非零奇異值個數,也是矩陣

的秩,

是奇異值。求和表示式展開後,我們只保留了矩陣

主對角線上的非零奇異值,並按照

降序排列每一項,保留係數大的項,捨去係數小的項,實現近似,減少需要儲存的值。如果只需要保留前

項,則可以寫為

在應用中,例如推薦系統中,由於使用者和商品數量極其龐大,由使用者和商品構成的矩陣也非常龐大,矩陣中每乙個元素表達了某個使用者對某個商品的評價或喜好。對於乙個使用者,使用他對每乙個商品的評價構成的向量作為描述這個使用者的特徵,同樣對乙個商品,我們使用每一使用者對它的評價作為這個商品的特徵。在使用了svd分解並近似後,其實是捨棄了小奇異值所對應的「特徵」向量(這裡的特徵向量是描述使用者或商品特徵的向量),減少了運算量。

在python中,numpy的svd分解方法,返回的奇異值已經降序排序,奇異向量也對應調整過位置,運用矩陣切割就可以實現近似。

矩陣的svd分解主要運用在利用協同過濾方法實現推薦系統中,充分利用奇異值和奇異向量,對沒有直接關聯的使用者和商品,**出使用者對商品的評價,據此選擇是否推薦。

矩陣對角線輸出

題1 二維陣列 n n 沿對角線方向,從右上角列印到左下角如n 4 4 4陣列 寫道 要求列印出 寫道 4 3 8 2 7 12 1 6 11 16 5 10 15 9 14 1303 02 13 01 12 23 00 11 22 33 10 21 32 20 31 30程式 public cla...

python 矩陣按對角線列印

description 將乙個矩陣 二維陣列 按對角線向右進行列印。搜了一下發現好像是美團某次面試要求半小時手撕的題 example input 1,2,3,4 5,1,2,3 9,5,1,2 output 4 3,3 2,2,2 1,1,1 5,5 9 思路 考慮每條對角線開頭元素的index i...

螺旋矩陣,求對角線之和

線代知識 include intmain void scanf d n a x y 1 while n n c for x 0 x printf n 站在數學角度看 會有重複點,但 執行不會有重複點。因為對於 而言方陣中的元素只遍歷了一次,不會有重複點 include intsum int a 10...