這篇文章很不錯: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···
就是上面這種系數,
我還是有一點疑問?為什麼?這個系數矩陣是對稱的,這樣有點不是很科學??