利用奇異值分解SVD給大數(shù)據(jù)降維

大數(shù)據(jù)的理解

大數(shù)據(jù)定義
數(shù)據(jù)被定義為過于巨大的數(shù)據(jù)集合,以至于變得難以使用傳統(tǒng)技術來處理。大數(shù)據(jù)的大體現(xiàn)在三個方面:

  • 樣例比較大
    比如統(tǒng)計了10人的樣本數(shù)據(jù),比如有100萬個圖像數(shù)據(jù)。
  • 時間維度大
    就是可能我們采集的樣本很少,但是每個樣本所采集的時間非常就,從時間這個維度看,數(shù)據(jù)量也是巨大的。
  • 數(shù)據(jù)維度大
    就是一個應用跟蹤了樣例的多個方面。高緯度數(shù)據(jù)就是提供了許多特征(變量),經(jīng)常事數(shù)以百計或千計的。這可能轉(zhuǎn)變?yōu)橐粋€很現(xiàn)實的問題,即使你觀察的少數(shù)樣例,但是處理太多的特征也會讓大部分分析變得難以駕馭。

使用如此之多的維度進行工作的復雜性驅(qū)動了各種各樣的數(shù)據(jù)技術的需求來過濾信息,讓數(shù)據(jù)看起來能更好的解決問題。過濾器通過移除高緯度數(shù)據(jù)集中的冗余信息來降低維度。

我們可以把將為理解為對數(shù)據(jù)的信息壓縮,類似于壓縮10001000的圖像到6464分辨率,同樣也是能夠理解圖片的意思的。

理解奇異值分解SVD

在大數(shù)據(jù)降維的核心算法SVD,我們稱之為奇異值分解。SVD的公式是:

M = U * s * Vh

這個公式的含義是,原始數(shù)據(jù)矩陣M被分解為三個矩陣的乘積。

U:包含有關行的信息
Vh: Vh包攬有關列的所有信息
s: 記錄SVD過程

最關鍵的是要理解s所代表的意思,比如s所有元素的和事100,s的第一個值是99,這就意味99%的信息儲存在了U和Vh的第一列中。因此你可以愉快的拋棄第一列之后的所有剩余列,而又不會丟失數(shù)據(jù)的重要信息,只丟失了1%的信息,對數(shù)據(jù)來說并不太重要。

舉例說明

import numpy as np
M = np.array([[1, 3, 4], [2, 3, 5], [1, 2, 3], [5, 4, 6]])
print(M)
[[1 3 4]
 [2 3 5]
 [1 2 3]
 [5 4 6]]

這個例子中需要降維的數(shù)據(jù)M,包含4個樣例,每個樣例包括3個特征值。下面我們就使用linalg模塊的svd函數(shù),進行分解矩陣:

U, s, Vh = np.linalg.svd(M, full_matrices=False)
print(U.shape, s.shape, Vh.shape)
(4, 3) (3,) (3, 3)
print(s)
[12.26362747  2.11085464  0.38436189]

通過s里的值可以看出第一列包含了大部分信息(超過80%)。第二列有些值(大約14%),第三列則包含了參與的信息。

當然svd公式是可逆的,就是分解出來的這三個矩陣還能通過點乘還原原始的矩陣。注意,矩陣s實際上是對角矩陣,還原的時候要使用對角矩陣參與運算。

# s轉(zhuǎn)換為對角矩陣
print(np.diag(s))
array([[12.26362747,  0.        ,  0.        ],
       [ 0.        ,  2.11085464,  0.        ],
       [ 0.        ,  0.        ,  0.38436189]])
back_M = np.dot(np.dot(U, np.diag(s)), Vh)
print(back_M)
[[1. 3. 4.]
 [2. 3. 5.]
 [1. 2. 3.]
 [5. 4. 6.]]

可以看出還原之后的back_M和之前的M矩陣是一樣的。

如何利用SVD進行降維(壓縮特征維度)

SVD輸出的三個矩陣入手,想辦法去除第三列的內(nèi)容。U取U[:,:2],變成(4,2),s取s[:2],變成了(2,),Vh取Vh[:2,:],變成了(2,3)

back_M1 = np.dot(np.dot(U[:,:2],np.diag(s[:2])), Vh[:2,:])
print(np.round(back_M1,1))
[[1.  2.8 4.1]
 [2.  3.2 4.8]
 [1.  2.  3. ]
 [5.  3.9 6. ]]

可以看出即使丟失最后一列的數(shù)值,還原之后和過去相比有一些差別,但是并不是很大。也是就是說可以用更少的維度取保存過去的值。

到底哪里降維了呢?

看到這里你可能都有點疑惑,到底是哪里降維了呢?從過去的(4,3)矩陣,變成現(xiàn)在三個矩陣(4,3)(3,)(3,3),不但維度沒有降,而且還增加一些數(shù)據(jù)。
假如說我們忽略最后一列的信息,變成三個矩陣(4,1),(1,),(1,3),從過去的4x3=12個數(shù)字,變成現(xiàn)在的4+1+3個數(shù)字,確實是降了。但是我們應該如何利用這三個矩陣參與機器學習中呢?

如何利用SVD降維的三個矩陣

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容