1. 程式人生 > >【機器學習筆記14】奇異值分解(SVD)

【機器學習筆記14】奇異值分解(SVD)

奇異值分解

定義: 假設A是一個m×nm \times n的矩陣,則存在如下一種分解: Am×n=Um×mm×nVn×nTA_{m \times n}=U_{m \times m} \sum_{m \times n} V_{n \times n}^T,其中\sum對角線上的元素稱為矩陣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()

在這裡插入圖片描述