大數(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ù)字,確實是降了。但是我們應該如何利用這三個矩陣參與機器學習中呢?