【機器學習筆記14】奇異值分解(SVD)
阿新 • • 發佈:2018-12-12
奇異值分解
定義: 假設A是一個的矩陣,則存在如下一種分解: ,其中對角線上的元素稱為矩陣A的奇異值。
在下面的例子中我們計算處矩陣的奇異值,並且通過逐步去掉最小的奇異值,再將其重構,觀察其重構後矩陣的變換。
備註:實時上不精準,因為只是取了矩陣各元素的差,未考慮正負值。
# -*- coding: utf-8 -*- import numpy as np def _test_svd(): a = np.random.randn(9, 6) u, s, vh = np.linalg.svd(a,) print(s) #將重構後的矩陣和原始矩陣相減,並取各個元素之和: b1 = np.around(np.sum(a - np.dot(u[:, :6] * s, vh)), 3) print(s, b1) #將s中最小的奇異值修改為0 s[5] = 0 b2 = np.around(np.sum(a - np.dot(u[:, :6] * s, vh)), 3) print(s, b2) #將s中次小的奇異值修改為0 s[4] = 0 b3 = np.around(np.sum(a - np.dot(u[:, :6] * s, vh)), 3) print(s, b3) pass """ 說明: SVD程式碼實現,對應的筆記《11.奇異值分解(SVD)》 作者:fredric 日期:2018-9-14 """ if __name__ == "__main__": _test_svd()