1. 程式人生 > 實用技巧 >奇異值分解(SVD和TruncatedSVD)

奇異值分解(SVD和TruncatedSVD)

1.兩者概念理解

2.SVD的使用

np.linalg.svd(a, full_matrices=True, compute_uv=True)

引數:

  • a: 是一個形如(M,N)矩陣

  • full_matrices:的取值是為0或者1,預設值為1,這時u的大小為(M,M),v的大小為(N,N) 。否則u的大小為(M,K),v的大小為(K,N) ,K=min(M,N)。

  • compute_uv:取值是為0或者1,預設值為1,表示計算u,s,v。為0的時候只計算s。

返回值:

  • 總共有三個返回值u,s,v,其中s是對矩陣a的奇異值分解。s除了對角元素不為0,其他元素都為0,並且對角元素從大到小排列。s中有n個奇異值,一般排在後面的比較接近0,所以僅保留比較大的r個奇異值。

Corpus(window_size=1):

I like learning.

I like NLP.

I enjoy flying.

 1 import numpy as np
 2 
 3 import matplotlib.pyplot as plt
 4 plt.style.use('ggplot')
 5 
 6 
 7 words =['I', 'like', 'enjoy',
 8         'deep', 'learning', 'NLP', 'flying','.']
 9 
10 X = np.array([[0,2,1,0,0,0,0,0],        #X是共現矩陣
11
[2,0,0,1,0,1,0,0], 12 [1,0,0,0,0,0,1,0], 13 [0,1,0,0,1,0,0,0], 14 [0,0,0,1,0,0,0,1], 15 [0,1,0,0,0,0,0,1], 16 [0,0,1,0,0,0,0,1], 17 [0,0,0,0,1,1,1,0]]) 18 U, s, Vh = np.linalg.svd(X, full_matrices=False) 19 print(U.shape) #
(8, 8) 20 print(s.shape) #(8,) 21 print(Vh.shape) #(8, 8) 22 print(np.allclose(X, np.dot(U * s, Vh))) #True,allclose比較兩個array是不是每一元素都相等,預設在1e-05的誤差範圍內 23 24 plt.xlim([-0.8, 0.2]) 25 plt.ylim([-0.8, 0.8]) 26 for i in range(len(words)): 27 plt.text(U[i,0], U[i,1], words[i])

3.TruncatedSVD的使用

TruncatedSVD 的建立必須指定所需的特徵數或所要選擇的成分數,比如 2。一旦建立完成,你就可以通過呼叫 fit() 函式來擬合該變換,然後再通過呼叫 transform() 函式將其應用於原始矩陣。

1 from sklearn.decomposition import TruncatedSVD
2 svd = TruncatedSVD(n_components=2)
3 X_reduced = svd.fit_transform(X)               #X是上面的共現矩陣,兩步合一步
4 print(X_reduced)

[[ 1.44515015 -1.53425886]
[ 1.63902195 1.68761941]
[ 0.70661477 0.73388691]
[ 0.78757738 -0.66397017]
[ 0.53253583 0.09065737]
[ 0.8413365 -0.78737543]
[ 0.50317243 -0.4312723 ]
[ 0.68076383 0.42116725]]

手動計算得到的值與上面呼叫函式的結果一致,但某些值的符號不一樣。由於所涉及的計算的性質以及所用的基礎庫和方法的差異,可以預見在符號方面會存在一些不穩定性:

1 Vh = Vh[:2, :]
2 print(X.dot(Vh.T))

[[-1.44515015 -1.53425886]
[-1.63902195 1.68761941]
[-0.70661477 0.73388691]
[-0.78757738 -0.66397017]
[-0.53253583 0.09065737]
[-0.8413365 -0.78737543]
[-0.50317243 -0.4312723 ]
[-0.68076383 0.42116725]]

參考:https://zhuanlan.zhihu.com/p/134512367