Python的主成分分析PCA算法


這篇文章很不錯:https://blog.csdn.net/u013082989/article/details/53792010

為什么數據處理之前要進行歸一化???(這個一直不明白)

 

 

這個也很不錯:https://blog.csdn.net/u013082989/article/details/53792010#commentsedit

 

下面是復現一個例子:

# -*- coding: utf-8 -*-

#來源:https://blog.csdn.net/u013082989/article/details/53792010
#來源:https://blog.csdn.net/hustqb/article/details/78394058  (這里有個例子)關於降維之后的坐標系問題,???結合里面的例子


#用庫函數實現的過程:

#導入需要的包:
import numpy as np
from matplotlib import pyplot as plt
from scipy import io as spio
from sklearn.decomposition import pca
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt



#歸一化數據,並作圖
def scaler(X):
    """
    注:這里的歸一化是按照列進行的。也就是把每個特征都標准化,就是去除了單位的影響。
    """
    scaler=StandardScaler()
    scaler.fit(X)
    x_train=scaler.transform(X)
    return x_train


#使用pca模型擬合數據並降維n_components對應要降的維度
def jiangwei_pca(x_train,K):                       #傳入的是X的矩陣和主成分的個數K
    model=pca.PCA(n_components=K).fit(x_train)
    Z=model.transform(x_train)                     #transform就會執行降維操作


#數據恢復,model.components_會得到降維使用的U矩陣

    Ureduce=model.components_
    x_rec=np.dot(Z,Ureduce)                       #數據恢復

    return Z,x_rec                                #這里Z是將為之后的數據,x_rec是恢復之后的數據。








if __name__ == '__main__':
    X=np.array([[1,1],[1,3],[2,3],[4,4],[2,4]])
    x_train=scaler(X)
    print('x_train:',x_train)
    Z,x_rec=jiangwei_pca(x_train,2)
    print("Z:",Z)
    print("x_rec:",x_rec)                          #如果有時候,這里不能夠重新恢復x_train,一個原因可能是主成分太少。
    print("x_train:",x_train)
   

 

##    這里的主成分為什么不是原來的兩個。

##   還有一個問題是,如何用圖像表現出來。

##   還有一個問題就是如何得到系數,這個系數是每個特征在主成分中的貢獻,要做這個就需要看矩陣,弄明白原理:

或許和這個程序有關:pca.explained_variance_ratio_

摘自:https://blog.csdn.net/qq_36523839/article/details/82558636

這里提一點:pca的方法explained_variance_ratio_計算了每個特征方差貢獻率,所有總和為1,explained_variance_為方差值,通過合理使用這兩個參數可以畫出方差貢獻率圖或者方差值圖,便於觀察PCA降維最佳值。

在提醒一點:pca中的參數選項可以對數據做SVD與歸一化處理很方便,但是需要先考慮是否需要這樣做。

 

 

關於pca的一個推導例子:

 

 、、

根據最后的圖形顯示來看,一共有五個樣本點。而從下面的矩陣看,似乎不是這樣???

有點糾結。

從對矩陣X的求均值過程可以知道,是對行求均值的。然后每行減掉均值。

(這樣的話,也就是說:每一行是一個特征???,就不太明白了。)

應該寫成這樣比較清楚:(每一列是一個特性)

[

[1,1]

[1,3]

[2,3]

[4,4]

[2,4]

]

、、

從下面看出這里除的是5,也就是說5是m,也就是行數。???

 

 、、

最后降維到一個特征::

下面圖片中P的部分,是兩個數,也就是兩個特征的系數。代表着特征的系數。。。

 

關鍵是用的別人的庫,但是怎么弄???

、、

上面

 

 

 

 

 

#、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

下面我們來分析另一個例子:這個例子是官方給出的:

程序如下:

# -*- coding: utf-8 -*-

"""
測試

這里是Python的pca主成分分析的一個測試程序
"""
import numpy as np
from sklearn.decomposition import PCA


X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca = PCA(n_components='mle')                                                  #這里是讓機器決定主成分的個數,我們也可以自行設置。
pca = PCA(n_components=2)                                                      #這里設置主成分為,這里不能設置成3,因為這里的特征本身只有兩個。
pca.fit(X)

print("這里是X:")
print(X)

Z=pca.transform(X)                                                             #transform就會執行降維操作
print('這里是Z:')
print(Z)



# Z = np.dot(X, self.components_.T)

# PCA(copy=True, n_components=2, whiten=False)
print(pca.explained_variance_ratio_)

 

然后運行程序輸出的結果:

這里是X:
[[-1 -1]
 [-2 -1]
 [-3 -2]
 [ 1  1]
 [ 2  1]
 [ 3  2]]
可能是系數的東西:  這里有可能是沒個主成分中包含各個特征的權重系數。

                                 你有沒有感覺到這個矩陣有一定的特性,有點對角線對稱的樣子。
[[-0.83849224  0.54491354]
 [-0.54491354 -0.83849224]]
這里是Z:                 這里的Z實際上主成分的意思。主成分也就是綜合特征
[[ 1.38340578   0.2935787 ]
 [ 2.22189802  -0.25133484]
 [ 3.6053038    0.04224385]
 [-1.38340578  -0.2935787 ]
 [-2.22189802   0.25133484]
 [-3.6053038   -0.04224385]]


 [0.99244289 0.00755711]

 

 

要捋清一個問題,我們想要得到的是什么?

我們想要得到的是每個主成分前面包含特征的系數。

主成分1=權重11*特征1+權重12*特征2+權重13*特征3···

主成分2=權重21*特征1+權重22*特征2+權重23*特征3···

[[-0.83849224  0.54491354]
 [-0.54491354 -0.83849224]]

主成分1=(-0.83849224) *特征1+(-0.54491354)*特征2···

主成分2=(0.54491354)  *特征1+(-0.83849224)*特征2···

 

 

就是上面這種系數,

 我還是有一點疑問?為什么?這個系數矩陣是對稱的,這樣有點不是很科學??


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM