PCA降維之前為什麼要先標準化?

2021-10-23 06:58:02 字數 4062 閱讀 1601

pca降維之前為什麼要先標準化?

統計/機器學習 資料預處理 資料降維 瀏覽次數:18547 分享

10當資料維數很高的時候,我們可以用pca降維,但是降維前通常我們要對資料進行標準化,為什麼要這樣做?這有什麼好處?

機器小白 2017-03-21 13:25

4個回答

30pca(主成分分析)所對應的數學理論是svd(矩陣的奇異值分解)。而奇異值分解本身是完全不需要對矩陣中的元素做標準化或者去中心化的。

但是對於機器學習,我們通常會對矩陣(也就是資料)的每一列先進行標準化。

pca通常是用於高維資料的降維,它可以將原來高維的資料投影到某個低維的空間上並使得其方差盡量大。如果資料其中某一特徵(矩陣的某一列)的數值特別大,那麼它在整個誤差計算的比重上就很大,那麼可以想象在投影到低維空間之後,為了使低秩分解逼近原資料,整個投影會去努力逼近最大的那乙個特徵,而忽略數值比較小的特徵。因為在建模前我們並不知道每個特徵的重要性,這很可能導致了大量的資訊缺失。為了「公平」起見,防止過分捕捉某些數值大的特徵,我們會對每個特徵先進行標準化處理,使得它們的大小都在相同的範圍內,然後再進行pca。

此外,從計算的角度講,pca前對資料標準化還有另外乙個好處。因為pca通常是數值近似分解,而非求特徵值、奇異值得到解析解,所以當我們使用梯度下降等演算法進行pca的時候,我們最好先要對資料進行標準化,這是有利於梯度下降法的收斂。

sofasofa資料科學社群ds面試題庫 ds面經

清風 2017-03-23 11:11

這個給力!估計很多人跟我一樣,只注意到第二點。但是我覺得你寫得第一點更重要! - 汪王往望 2017-04-15 11:33

謝謝!學習了! - pg two 2017-09-08 13:09

應該說是資料都需要標準化,讓每個維度的重要性一樣。如果已知某維度比較重要,可以再乘上係數。然後再是pca的問題。 - zealing 2018-03-15 12:47

謝謝分享! - ccc225 2018-05-20 09:43

試了下,有些資料集做不做標準化,pca的結果差距是非常大的。如果不做標準化,數值較大的特徵會對結果產生更大的影響。對於手頭某個資料集: n_components = 14 標準化前 explained_variance_ratio = [0.99708 0.00291 0.00001 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ] 標準化後: explained_variance_ratio = [0.17403 0.11963 0.09637 0.07923 0.07411 0.07285 0.07014 0.06593 0.06344 0.06011 0.05312 0.04306 0.02798 0. - cy1019x 2019-04-29 11:37

4沒做標準化的pca是找covariance matrix的eigenvector,標準化後的pca是找correlation matrix的eigenvector。如清風說的第一點,如果沒有做標準化,eigenvector會偏向方差最大的變數,偏離理論上的最佳值。

舉例說明。假設乙個2維gaussian,correlation matrix是[1 0.4;0.4 1], std(x1)=10,std(x2)=1。理論上最佳的分解向量是橢圓的長軸,如果沒有做標準化,pca算出的向量和長軸會有偏差。標準化後偏差會減到很小。

#standarization of pca

import numpy as np

import matplotlib.pyplot as plt

from sklearn.decomposition import pca

from sklearn.preprocessing import standardscaler

np.set_printoptions(precision=3)

np.random.seed(0)

n=1000000

mu=[0,0]

corr=np.array([[1.,.4],[.4,1.]])

std_vector=[10.,1]

a_ori=np.random.multivariate_normal(mu,corr,n)

a_scaled=np.matmul(a_ori,np.diag(std_vector))

scaler = standardscaler()

scaler.fit(a_scaled)

a_standarized=scaler.transform(a_scaled)

pca = pca()

pca.fit(a_scaled)

pca1 = pca()

pca1.fit(a_standarized)

print(『correlation coefficient matrix is:』)

print(corr)

print(『std vector is:』)

print(std_vector)

print(『covariance matrix is:』)

print(np.cov(a_scaled.t))

print(』—before standarization—』)

print(『components:』)

print(pca.components_)

print(『sigular values:』)

print(pca.explained_variance_)

print(』—after standarization—』)

print(『components:』)

print(pca1.components_)

print(『sigular values:』)

print(pca1.explained_variance_)

t1=np.linspace(-20,20,100)

t2=t1*std_vector[1]/std_vector[0]

plt.figure(figsize=[10,5])

plt.subplot(121)

plt.hist2d(a_scaled[:,0],a_scaled[:,1],100,alpha=0.7)

plt.plot(t1,t2,』–k』)

c=pca.components_

r=np.sqrt(pca.explained_variance_)

plt.arrow(0,0,c[0,0]*r[0],c[0,1]*r[0],color=『red』,head_width=.3)

plt.arrow(0,0,c[1,0]*r[1],c[1,1]*r[1],color=『blue』,head_width=.3)

plt.title(『before standarized』)

t1=np.linspace(-20,20,100)

cov=np.cov(a_standarized.t)

t2=t1*cov[1,1]

plt.subplot(122)

plt.hist2d(a_standarized[:,0],a_standarized[:,1],100,alpha=0.7)

plt.plot(t1,t2,』–k』)

c=pca1.components_

r=np.sqrt(pca1.explained_variance_)

plt.arrow(0,0,c[0,0]*r[0],c[0,1]*r[0],color=『red』,head_width=.2)

plt.arrow(0,0,c[1,0]*r[1],c[1,1]*r[1],color=『blue』,head_width=.2)

plt.title(『after standarized』)

plt.show()

sofasofa資料科學社群ds面試題庫 ds面經

zealing 2019-04-30 21:17

2pca實現的方式其實有四種:

標準化資料後的協方差矩陣

標準化資料後的相關係數矩陣

未標準化資料後的相關係數矩陣

標準化資料後的svd方式

這四種方式是等價的。

sofasofa資料科學社群ds面試題庫 ds面經

zhanglu 2018-03-28 12:58

1不標準化的pca就是truncatedsvd,其實不標準化也行吧。

產品發布前為什麼要驗證

古語有云 是騾子是馬拉出來溜一溜!這反映了在歷史上,人們購買馬匹時也要進行驗證,當然這其中有人性陰暗的一面 不良商家 但這種方法仍然是大夥購買商品進行試用是最有效的鑑別方法。隨著人們技術的不斷發展,工業機械化自動化的程度過越來越高,工業品的出廠一致性,良品率持續提高,是否就不需要驗證了?答案仍然是否...

泛型方法前為什麼要加

package com.test05.mytest class fruit class person class classname void show 2 e e void show 3 t t public static void main string args 輸出 而show 2 和sho...

泛型方法前為什麼要加

package com.test05.mytest class fruit class person class classname void show 2 e e void show 3 t t public static void main string args 輸出 而show 2 和sho...