機器學習——奇異值分解python實現

import numpy as np

data = np.array([[3, 4, 1, 6, 4],
                [2, 3, 5, 4, 0],
                [3, 3, 1, 0, 0],
                [5, 5, 6, 2, 2],
                [0, 2, 3, 3, 3],
                [0, 0, 0, 6, 6]])
U,sigma,Vt = np.linalg.svd(data)
# 6*6
print('U\n', U)
# 5*1需要進行處理
print('sigma\n', sigma)
# 5*5
print('Vt\n', Vt)

# 先用三行3列拼接來還原原矩陣
sig3 = np.mat([[sigma[0], 0, 0],
            [0, sigma[1], 0],
            [0, 0, sigma[2]]])
# 原矩陣A
print('原矩陣\n', U[:, :3] * sig3 * Vt[:3, :])

結果如下

U
 [[-0.52185334 -0.24812789  0.48984775  0.4264698  -0.25322737 -0.42444109]
 [-0.41008428  0.25126051 -0.56167383  0.61120633  0.18603982  0.21222054]
 [-0.17980752  0.30425963  0.52454643  0.01925764 -0.15280032  0.75909656]
 [-0.54015341  0.50153948  0.04913253 -0.52105767  0.31806198 -0.2856815 ]
 [-0.32134159 -0.1172619  -0.40642164 -0.344323   -0.76680699  0.10611027]
 [-0.36351493 -0.71932926 -0.04278063 -0.23263719  0.43446606  0.32513276]]
sigma
 [ 15.89637219   8.57020627   3.81154183   2.44766976   1.15670966]
Vt
 [[-0.35391208 -0.45296744 -0.43764876 -0.56597054 -0.39712423]
 [ 0.37089115  0.34389166  0.46321936 -0.48404991 -0.54341678]
 [ 0.56814214  0.33603938 -0.71321392 -0.17979403  0.15261733]
 [-0.01866811  0.12392879 -0.26864569  0.62620239 -0.72110555]
 [ 0.64346873 -0.74045811  0.11422254  0.14462956 -0.06087104]]
原矩陣
 [[  3.20796562e+00   3.65374805e+00   1.31388473e+00   5.38869763e+00
    4.73490147e+00]
 [  1.88945744e+00   2.97394084e+00   5.37732233e+00   3.03205824e+00
    1.09189553e+00]
 [  3.11461021e+00   2.86328574e+00   1.03285130e+00  -3.95424704e-03
    2.32315836e-02]
 [  4.73945551e+00   5.43047445e+00   5.61535236e+00   2.74543419e+00
    1.10271328e+00]
 [  5.55006143e-01   1.44767943e+00   2.87490069e+00   3.65603900e+00
    2.33826920e+00]
 [ -3.34005890e-01   4.42685438e-01  -2.10374623e-01   6.28388780e+00
    5.61997960e+00]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章