資料預處理系列 (十二)用截斷奇異值分解降維

2021-07-14 02:06:32 字數 4111 閱讀 7368

博主簡介:風雪夜歸子(英文名: allen),機器學習演算法攻城獅,喜愛鑽研machine learning的黑科技,對deep learning和artificial intelligence充滿興趣,經常關注kaggle資料探勘競賽平台,對資料、machine learning和artificial intelligence有興趣的各位童鞋可以一起**哦,個人csdn部落格: 

截斷奇異值分解(truncated singular value decomposition,tsvd)是一種矩陣因式分解(factorization)技術,將矩陣m

分解成u

,σ σ

和v

。它與pca很像,只是svd分解是在資料矩陣上進行,而pca是在資料的協方差矩陣上進行。通常,svd用於發現矩陣的主成份。

tsvd與一般svd不同的是它可以產生乙個指定維度的分解矩陣。例如,有乙個n×n

矩陣,通過svd分解後仍然是乙個n×n

矩陣,而tsvd可以生成指定維度的矩陣。這樣就可以實現降維了。

這裡我們還用iris資料集來演示tsvd:

in [1]:

from

sklearn.datasets

import

load_iris

iris

=load_iris

()iris_data

=iris

.data

tsvd物件的用法和其他物件類似。首先匯入需要的類,初始化,然後擬合:

in [5]:

from

sklearn.decomposition

import

truncatedsvd

in [6]:

svd=

truncatedsvd(2

)iris_transformed

=svd

.fit_transform

(iris_data

)iris_data[:5

]

array([[ 5.1,  3.5,  1.4,  0.2],

[ 4.9, 3. , 1.4, 0.2],

[ 4.7, 3.2, 1.3, 0.2],

[ 4.6, 3.1, 1.5, 0.2],

[ 5. , 3.6, 1.4, 0.2]])

in [7]:

iris_transformed[:5

]

array([[ 5.91220352, -2.30344211],

[ 5.57207573, -1.97383104],

[ 5.4464847 , -2.09653267],

[ 5.43601924, -1.87168085],

[ 5.87506555, -2.32934799]])

最終結果如下圖所示:

in [10]:

%matplotlib inline

import

matplotlib.pyplot

aspltf=

plt.

figure

(figsize=(

5,5))

ax=f.

add_subplot

(111)ax

.scatter

(iris_transformed

[:,0

],iris_transformed

[:,1],c

=iris

.target)ax

.set_title

("truncated svd, 2 components"

)

現在我們演示了scikit-learn的truncatedsvd模組,讓我們看看只用scipy學習一些細節。

首先,我們用scipylinalg處理svd:

in [12]:

import

numpy

asnp

from

scipy.linalg

import

svdd=np

.array

([[1,2

],[1,

3],[1

,4]])d

array([[1, 2],

[1, 3],

[1, 4]])

in [13]:

u,

s,v=

svd(d,

full_matrices

=false)u

.shape,s

.shape,v

.shape

((3, 2), (2,), (2, 2))
我們可以根據svd的定義,用

u u,s

s和vv

還原矩陣

d d:

in [15]:

np.

diag(s

)

array([[ 5.64015854,  0.        ],

[ 0. , 0.43429448]])

in [16]:

np.

dot(u.

dot(np.

diag(s

)),v

)

array([[ 1.,  2.],

[ 1., 3.],

[ 1., 4.]])

truncatedsvd返回的矩陣是

u u和s

s的點積。如果我們想模擬tsvd,我們就去掉最新奇異值和對於

u u

的列向量。例如,我們想要乙個主成份,可以這樣:

in [17]:

new_s=s

[0]new_u=u

[:,0

]new_u

.dot

(new_s

)

array([-2.20719466, -3.16170819, -4.11622173])
一般情況下,如果我們想要截斷維度

t t

,那麼我們就去掉n−

t n−t

個奇異值。

truncatedsvd還有一些細節需要注意。

符號翻轉(sign flipping)

truncatedsvd有個「陷阱」。隨著隨機數生成器狀態的變化,truncatedsvd連續地擬合會改變輸出的符合。為了避免這個問題,建議只用truncatedsvd擬合一次,然後用其他變換。這正是管線命令的另乙個用處。

要避免這種情況,可以這樣:

in [23]:

tsvd

=truncatedsvd(2

)tsvd

.fit

(iris_data

)tsvd

.transform

(iris_data

)[:5

]

array([[ 5.91220352, -2.30344211],

[ 5.57207573, -1.97383104],

[ 5.4464847 , -2.09653267],

[ 5.43601924, -1.87168085],

[ 5.87506555, -2.32934799]])

稀疏矩陣

truncatedsvd相比pda的乙個優勢是truncatedsvd可以操作pda處理不了的矩陣。這是因為pca必須計算協方差矩陣,需要在整個矩陣上操作,如果矩陣太大,計算資源可能會不夠用。

系列二 資料預處理

旨在對資料探勘有個系統的認識,這部分僅僅是對於資料預處理!對於常規的資料預處理主要分為以下4步驟 1 資料清洗 解決缺失值 異常值 離群點的問題 2 資料整合 解決樣本重複 指標構建 屬性高度相似的問題 2 資料規約 解決資料規模過大的問題 4 資料變換 將資料轉化為更方便分析的資料 1 填充缺失值...

資料預處理系列 (五)分類變數處理

博主簡介 風雪夜歸子 英文名 allen 機器學習演算法攻城獅,喜愛鑽研machine learning的黑科技,對deep learning和artificial intelligence充滿興趣,經常關注kaggle資料探勘競賽平台,對資料 machine learning和artificial...

資料預處理系列 (十)用因子分析降維

博主簡介 風雪夜歸子 英文名 allen 機器學習演算法攻城獅,喜愛鑽研machine learning的黑科技,對deep learning和artificial intelligence充滿興趣,經常關注kaggle資料探勘競賽平台,對資料 machine learning和artificial...