特徵值分解矩陣不能適用於所有矩陣,對於無法進行特徵值分解的矩陣,我們使用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...