簡體   English   中英

考慮無N相關成分的PCA分析

[英]PCA analysis considering N-less relevant components

我正在嘗試使用scikit庫(尤其是sklearn.decomposition和sklearn.preprocessing)學習Python中PCA分析的基礎。 目標是將圖像中的數據導入矩陣X(每行是一個樣本,每列是一個要素),然后標准化X,使用PCA提取主要成分(2個最重要,6個最重要.... 6少重要),將X投影在這些主要成分上,逆轉先前的轉換並繪制結果以查看相對於原始圖像的差異。

現在讓我們說我不想考慮2,3,4 ...最重要的主成分,但是我想考慮N個不那么相關的成分,比如說N = 6。

應該如何進行分析? 我的意思是我不能簡單地進行標准化,然后調用PCA()。fit_transform,然后使用inverse_transform()還原以繪制結果。

目前,我正在執行以下操作:

X_std = StandardScaler().fit_transform(X) # standardize original data
pca = PCA()
model = pca.fit(X_std) # create model with all components
Xprime = model.components_[range(dim-6, dim, 1),:] # get last 6 PC

然后我停下來,因為我知道應該調用transform(),但是我不知道該怎么做...我嘗試了幾次卻沒有成功。

是否有人可以告訴我以前的步驟是否正確並指出要遵循的方向?

非常感謝你


編輯:目前,我已經對我的問題的第一個答案建議了此解決方案:

model = PCA().fit(X_std)
model2pc = model 
model2pc.components_[range(2, img_count, 1), :] = 0
Xp_2pc = model2pc.transform(X_std)
Xr_2pc = model2pc.inverse_transform(Xp_2pc)

然后我對6pc,60pc,最后6pc進行相同操作。 我注意到的是,這非常耗時。 我想得到一個直接提取我需要的主要成分的模型(不將其他成分清零),然后對該模型執行transform()和inverse_transform()。

如果要忽略除最后6個主成分以外的所有成分,則可以將不想保留的成分歸零。

N = 6
X_std = StandardScaler().fit_transform(X)
pca = PCA()
model = pca.fit(X_std) # create model with all components
model.components_[:-N] = 0

然后,要從數據中除去最后N分量,只需對數據進行正向和逆向轉換:

Xprime = model.inverse_transform(model.transform(X_std))

這是一個例子:

>>> X = np.random.rand(18).reshape(6, 3)
>>> model = PCA().fit(X)

往返轉換應返回原始數據:

>>> X
array([[0.16594796, 0.02366958, 0.8403745 ],
       [0.25219425, 0.22879029, 0.07950927],
       [0.69636084, 0.4410933 , 0.97431828],
       [0.50121079, 0.44835563, 0.95236146],
       [0.6793044 , 0.53847562, 0.27882302],
       [0.32886931, 0.0643043 , 0.10597973]])
>>> model.inverse_transform(model.transform(X))
array([[0.16594796, 0.02366958, 0.8403745 ],
       [0.25219425, 0.22879029, 0.07950927],
       [0.69636084, 0.4410933 , 0.97431828],
       [0.50121079, 0.44835563, 0.95236146],
       [0.6793044 , 0.53847562, 0.27882302],
       [0.32886931, 0.0643043 , 0.10597973]])

現在將第一個主成分歸零:

>>> model.components_
array([[ 0.22969899,  0.21209762,  0.94986998],
       [-0.67830467, -0.66500728,  0.31251894],
       [ 0.69795497, -0.71608653, -0.0088847 ]])
>>> model.components_[:-2] = 0
>>> model.components_
array([[ 0.        ,  0.        ,  0.        ],
       [-0.67830467, -0.66500728,  0.31251894],
       [ 0.69795497, -0.71608653, -0.0088847 ]])

現在,由於我們刪除了第一個主成分(包含最大的方差),因此往返轉換產生了不同的結果:

>>> model.inverse_transform(model.transform(X))
array([[ 0.12742811, -0.01189858,  0.68108405],
       [ 0.36513945,  0.33308073,  0.54656949],
       [ 0.58029482,  0.33392119,  0.49435263],
       [ 0.39987803,  0.35478779,  0.53332196],
       [ 0.71114004,  0.56787176,  0.41047233],
       [ 0.44000711,  0.16692583,  0.56556581]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM