PCA 之前的標準化與縮放
我知道有很多關於PCA預處理的內容,但我還是有些困惑。
我有一個包含一些明確模式的數據集:1 個變量是一個人是否有經濟資源(是/否),另一個是金融資源的數量(對於沒有資源的人 = 0),然後其他變量是傾向於與財政資源的數量相關。該數據集還包含幾個虛擬變量,以及一些介於 0 和 5 之間的離散變量。
我假設我會找到兩個集群:一個用於沒有資源的人,另一個用於有資源的人。
當應用帶有兩個組件的 PCA 時,我有兩種方法: - Scale,然後應用 PCA - Normalize,然後應用 PCA
這導致完全不同的結果。我知道縮放是 PCA 的標準預處理步驟。但是規範化有意義嗎?我想我已經做了一些接近稀疏 PCA 的事情,我首先捕獲了最重要的模式,然後擬合了 PCA。你能給我一些關於這方面的見解嗎?
請注意,我的 PCA 的目標是可視化聚類算法的結果。
圖 1 - 具有縮放比例的前 2 個組件
圖 2 - 歸一化的前 2 個組件
由於計算主成分的方式,縮放(我稱之為居中和縮放)對於 PCA 非常重要。PCA 是通過奇異值分解來解決的,它可以找到最能代表平方意義上的數據的**線性子空間。我用斜體表示的兩部分是我們分別居中和縮放的原因。
線性子空間是線性代數中的一個重要研究課題,PCA 的線性子空間最重要的結果是它必須經過原點,即點 [0, 0, …, 0]。因此,例如,如果您正在測量一個國家的 GDP 和人口之類的東西,那麼您的數據可能離原點很遠,並且很難被任何線性子空間近似。通過將我們的數據居中,我們保證它們存在於原點附近,並且可以用低維線性子空間來近似它們。在您的情況下,您的數據似乎都是正數,因此在預處理之前它們肯定不會以 0 為中心。
這是一個遠離原點的 2D 數據集的示例,它在居中之前獲得了無用的第一個組件:
縮放很重要,因為 SVD 在平方和意義上近似,所以如果一個變量的比例與另一個變量不同,它將主導 PCA 過程,而低 D 圖實際上只是可視化該維度。
我將用python中的一個例子來說明。
我們先搭建一個環境:
import numpy as np from sklearn.decomposition import PCA from sklearn.preprocessing import scale, normalize import matplotlib.pyplot as plt plt.ion() # For reproducibility np.random.seed(123)
我們將生成 4 維標準正態/不相關的數據,但有一個額外的變量隨機取 0 或 5 的值,給出我們希望可視化的 5 維數據集:
N = 200 P = 5 rho = 0.5 X = np.random.normal(size=[N,P]) X = np.append(X, 3*np.random.choice(2, size = [N,1]), axis = 1)
我們將首先在沒有任何預處理的情況下進行 PCA:
# No preprocessing: pca = PCA(2) low_d = pca.fit_transform(X) plt.scatter(low_d[:,0], low_d[:,1])
我們清楚地看到了兩個集群,但數據是完全隨機生成的,完全沒有結構!
歸一化改變了情節,但我們仍然看到 2 個集群:
# normalize Xn = normalize(X) pca = PCA(2) low_d = pca.fit_transform(Xn) plt.scatter(low_d[:,0], low_d[:,1])
二元變量與其他變量的規模不同這一事實產生了一種可能不一定存在的集群效應。這是因為 SVD 比其他變量更多地考慮它,因為它對平方誤差的貢獻更大。這可以通過縮放數據集來解決:
# Scale Xs = scale(X) low_d = pca.fit_transform(Xs) plt.scatter(low_d[:,0], low_d[:,1])
我們終於(正確地)看到數據完全是隨機噪聲。
在 PCA 中看到標準化並不常見。我不能告訴你為什麼會這樣,事實上,我通過我的一些個人(未發表的)初步研究發現,為了使程序對異常值具有魯棒性,標準化可能很有用,但我可以’不建議這樣做,因為我在已發表的文獻中沒有看到它(不再正確,見下文)。
我猜想,在您的情況下,您的 0-5 變量可能會主導 0-1 虛擬變量,從而導致不應該存在的聚類(是否會發生 0-5 變量累積在刻度的邊緣?) .
編輯:我最近遇到了空間符號協方差矩陣的概念,它似乎可以進行我們討論的歸一化,以生成穩健的協方差矩陣。特徵分析隨後將產生歸一化 PCA 算法,本文將對此進行討論。