回顧了下PCA的步驟,并用python實現。深刻的發現當年學的特征值、特征向量好強大。
創新互聯建站提供成都網站設計、成都做網站、網頁設計,成都品牌網站建設,1元廣告等致力于企業網站建設與公司網站制作,十余年的網站開發和建站經驗,助力企業信息化建設,成功案例突破1000+,是您實現網站建設的好選擇.
PCA是一種無監督的學習方式,是一種很常用的降維方法。在數據信息損失最小的情況下,將數據的特征數量由n,通過映射到另一個空間的方式,變為k(kn)。
這里用一個2維的數據來說明PCA,選擇2維的數據是因為2維的比較容易畫圖。
這是數據:
畫個圖看看分布情況:
協方差的定義為:
假設n為數據的特征數,那么協方差矩陣M, 為一個n n的矩陣,其中Mij為第i和第j個特征的協方差,對角線是各個特征的方差。
在我們的數據中,n=2,所以協方差矩陣是2 2的,
通過numpy我們可以很方便的得到:
得到cov的結果為:
array([[ 0.61655556, 0.61544444],
[ 0.61544444, 0.71655556]])
由于我們之前已經做過normalization,因此對于我們來說,
這個矩陣就是 data*data的轉置矩陣。
得到結果:
matrix([[ 5.549, 5.539],
[ 5.539, 6.449]])
我們發現,其實協方差矩陣和散度矩陣關系密切,散度矩陣 就是協方差矩陣乘以(總數據量-1)。因此他們的 特征根 和 特征向量 是一樣的。這里值得注意的一點就是,散度矩陣是 SVD奇異值分解 的一步,因此PCA和SVD是有很大聯系的,他們的關系這里就不詳細談了,以后有機會再寫下。
用numpy計算特征根和特征向量很簡單,
但是他們代表的意義非常有意思,讓我們將特征向量加到我們原來的圖里:
其中紅線就是特征向量。有幾點值得注意:
藍色的三角形就是經過坐標變換后得到的新點,其實他就是紅色原點投影到紅線、藍線形成的。
得到特征值和特征向量之后,我們可以根據 特征值 的大小,從大到小的選擇K個特征值對應的特征向量。
這個用python的實現也很簡單:
從eig_pairs選取前k個特征向量就行。這里,我們只有兩個特征向量,選一個最大的。
主要將原來的數據乘以經過篩選的特征向量組成的特征矩陣之后,就可以得到新的數據了。
output:
數據果然變成了一維的數據。
最后我們通過畫圖來理解下數據經過PCA到底發生了什么。
綠色的五角星是PCA處理過后得到的一維數據,為了能跟以前的圖對比,將他們的高度定位1.2,其實就是紅色圓點投影到藍色線之后形成的點。這就是PCA,通過選擇特征根向量,形成新的坐標系,然后數據投影到這個新的坐標系,在盡可能少的丟失信息的基礎上實現降維。
通過上述幾步的處理,我們簡單的實現了PCA第一個2維數據的處理,但是原理就是這樣,我們可以很輕易的就依此實現多維的。
用sklearn的PCA與我們的pca做個比較:
得到結果:
用我們的pca試試
得到結果:
完全一致,完美~
值得一提的是,sklearn中PCA的實現,用了部分SVD的結果,果然他們因緣匪淺。
一般步驟來實現PCA算法
(1)零均值化
假如原始數據集為矩陣dataMat,dataMat中每一行代表一個樣本,每一列代表同一個特征。零均值化就是求每一列的平均值,然后該列上的所有數都減去這個均值。也就是說,這里零均值化是對每一個特征而言的,零均值化都,每個特征的均值變成0。實現代碼如下:
[python]?view plain?copy
def?zeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0)?????#按列求均值,即求各個特征的均值
newData=dataMat-meanVal
return?newData,meanVal
函數中用numpy中的mean方法來求均值,axis=0表示按列求均值。
該函數返回兩個變量,newData是零均值化后的數據,meanVal是每個特征的均值,是給后面重構數據用的。
(2)求協方差矩陣
[python]?view plain?copy
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0)
numpy中的cov函數用于求協方差矩陣,參數rowvar很重要!若rowvar=0,說明傳入的數據一行代表一個樣本,若非0,說明傳入的數據一列代表一個樣本。因為newData每一行代表一個樣本,所以將rowvar設置為0。
covMat即所求的協方差矩陣。
(3)求特征值、特征矩陣
調用numpy中的線性代數模塊linalg中的eig函數,可以直接由covMat求得特征值和特征向量:
[python]?view plain?copy
eigVals,eigVects=np.linalg.eig(np.mat(covMat))
eigVals存放特征值,行向量。
eigVects存放特征向量,每一列帶別一個特征向量。
特征值和特征向量是一一對應的
(4)保留主要的成分[即保留值比較大的前n個特征]
第三步得到了特征值向量eigVals,假設里面有m個特征值,我們可以對其排序,排在前面的n個特征值所對應的特征向量就是我們要保留的,它們組成了新的特征空間的一組基n_eigVect。將零均值化后的數據乘以n_eigVect就可以得到降維后的數據。代碼如下:
[python]?view plain?copy
eigValIndice=np.argsort(eigVals)????????????#對特征值從小到大排序
n_eigValIndice=eigValIndice[-1:-(n+1):-1]???#最大的n個特征值的下標
n_eigVect=eigVects[:,n_eigValIndice]????????#最大的n個特征值對應的特征向量
lowDDataMat=newData*n_eigVect???????????????#低維特征空間的數據
reconMat=(lowDDataMat*n_eigVect.T)+meanVal??#重構數據
return?lowDDataMat,reconMat
代碼中有幾點要說明一下,首先argsort對特征值是從小到大排序的,那么最大的n個特征值就排在后面,所以eigValIndice[-1:-(n+1):-1]就取出這個n個特征值對應的下標。【python里面,list[a:b:c]代表從下標a開始到b,步長為c。】
preface:做著最近的任務,對數據處理,做些簡單的提特征,用機器學習算法跑下程序得出結果,看看哪些特征的組合較好,這一系列流程必然要用到很多函數,故將自己常用函數記錄上。應該說這些函數基本上都會用到,像是數據預處理,處理完了后特征提取、降維、訓練預測、通過混淆矩陣看分類效果,得出報告。
1.輸入
從數據集開始,提取特征轉化為有標簽的數據集,轉為向量。拆分成訓練集和測試集,這里不多講,在上一篇博客中談到用StratifiedKFold()函數即可。在訓練集中有data和target開始。
2.處理
[python]?view plain?copy
def?my_preprocessing(train_data):
from?sklearn?import?preprocessing
X_normalized?=?preprocessing.normalize(train_data?,norm?=?"l2",axis=0)#使用l2范式,對特征列進行正則
return?X_normalized
def?my_feature_selection(data,?target):
from?sklearn.feature_selection?import?SelectKBest
from?sklearn.feature_selection?import?chi2
data_new?=?SelectKBest(chi2,?k=?50).fit_transform(data,target)
return?data_new
def?my_PCA(data):#data?without?target,?just?train?data,?withou?train?target.
from?sklearn?import?decomposition
pca_sklearn?=?decomposition.PCA()
pca_sklearn.fit(data)
main_var?=?pca_sklearn.explained_variance_
print?sum(main_var)*0.9
import?matplotlib.pyplot?as?plt
n?=?15
plt.plot(main_var[:n])
plt.show()
def?clf_train(data,target):
from?sklearn?import?svm
#from?sklearn.linear_model?import?LogisticRegression
clf?=?svm.SVC(C=100,kernel="rbf",gamma=0.001)
clf.fit(data,target)
#clf_LR?=?LogisticRegression()
#clf_LR.fit(x_train,?y_train)
#y_pred_LR?=?clf_LR.predict(x_test)
return?clf
def?my_confusion_matrix(y_true,?y_pred):
from?sklearn.metrics?import?confusion_matrix
labels?=?list(set(y_true))
conf_mat?=?confusion_matrix(y_true,?y_pred,?labels?=?labels)
print?"confusion_matrix(left?labels:?y_true,?up?labels:?y_pred):"
print?"labels\t",
for?i?in?range(len(labels)):
print?labels[i],"\t",
for?i?in?range(len(conf_mat)):
print?i,"\t",
for?j?in?range(len(conf_mat[i])):
print?conf_mat[i][j],'\t',
def?my_classification_report(y_true,?y_pred):
from?sklearn.metrics?import?classification_report
print?"classification_report(left:?labels):"
print?classification_report(y_true,?y_pred)
my_preprocess()函數:
主要使用sklearn的preprocessing函數中的normalize()函數,默認參數為l2范式,對特征列進行正則處理。即每一個樣例,處理標簽,每行的平方和為1.
my_feature_selection()函數:
使用sklearn的feature_selection函數中SelectKBest()函數和chi2()函數,若是用詞袋提取了很多維的稀疏特征,有必要使用卡方選取前k個有效的特征。
my_PCA()函數:
主要用來觀察前多少個特征是主要特征,并且畫圖。看看前多少個特征占據主要部分。
clf_train()函數:
可用多種機器學習算法,如SVM, LR, RF, GBDT等等很多,其中像SVM需要調參數的,有專門調試參數的函數如StratifiedKFold()(見前幾篇博客)。以達到最優。
my_confusion_matrix()函數:
主要是針對預測出來的結果,和原來的結果對比,算出混淆矩陣,不必自己計算。其對每個類別的混淆矩陣都計算出來了,并且labels參數默認是排序了的。
my_classification_report()函數:
主要通過sklearn.metrics函數中的classification_report()函數,針對每個類別給出詳細的準確率、召回率和F-值這三個參數和宏平均值,用來評價算法好壞。另外ROC曲線的話,需要是對二分類才可以。多類別似乎不行。
主要參考sklearn官網
首先2個包:
import?numpy?as?np
from?sklearn.decomposition?import?PCA
然后一個m x n 的矩陣,n為維度,這里設為x。
n_components = 12 是自己可以設的。
pca?=?PCA(n_components=12)
pca.fit(x)
PCA(copy=True,?iterated_power='auto',?n_components=12,?random_state=None,
svd_solver='auto',?tol=0.0,?whiten=False)
float_formatter?=?lambda?x:?"%.2f"?%?x
np.set_printoptions(formatter={'float_kind':float_formatter})
print?'explained?variance?ratio:'
print?pca.explained_variance_ratio_
print?'cumulative?sum:'
print?pca.explained_variance_ratio_.cumsum()
python作為一個編程語言,具有與其他編程語言同等的能力。冠冕堂皇地講,是所有語言都是圖靈等價的。不過python作為一門語言,尤其獨特的優點,簡單易學,內置了很多庫。也很容易擴展。Python培訓課程如何學?
可以選一本通俗易懂的書,找一個好的視頻資料,然后自己裝一個IDE工具開始邊學邊寫。下面我具體來講講:
1.找一本靠譜的書,難度一定要是入門級別,千萬不能太復雜,不要一下子陷進去,會打亂節奏,學東西要循序漸進,不能一口吃個胖子.打個比方,學過java的同學都聽過大名鼎鼎的thinking in java,這邊書很厚很全,若一上來就學,肯定會吃力,時間長了就會失去興趣,因此對初學者來說,一定要找一本通熟易懂的,簡單的書。入門的書非常關鍵。
入門的書很多,但是我個人強烈推薦《A Byte of Python》,這本書我讀了2遍,作者寫作思路非常清晰,對每個知識點講解很到位,不多不少。對初學者來說,力道剛剛好。而且是全英文,對提高自己的英語水平也很有幫助。
網上有人會推薦《笨辦法學Python》,我個人覺得這本書沒有《A Byte of Python》好 。一般有一些編程基本,我建議直接看《A Byte of Python》。這本書的銷量已經破百萬了,而且在豆瓣上點評有8.8,可謂是入門級的神書.電子版大家可以在CSDN 搜一下就有,都是高清的。
2.找一個靠譜的師傅。Python編程是一個十分系統的技術體系,有時候光靠看書和網上的視頻,只能是一知半解,遇到問題,沒有人給你講解其中的原理和流程,那么對于整個技術點的理解就永遠不會通透。況且,編程不只是知識,還涉及到做具體的項目,在做項目中,如果有人帶,進步才是最神速的。
3.多編寫程序,這似乎是廢話,但是確實是一句實話。學編程一定要親身去編寫,沒有什么捷徑。一開始哪怕你把書里面的例子一字不落敲一遍,也好過你只是去看書,而不動手。
而且學python 最好是堅持編,每天抽小半個小時,學一些知識點,不斷堅持.快的話幾個星期基本就能入門了。
基于特征臉(PCA)的人臉識別方法
特征臉方法是基于KL變換的人臉識別方法,KL變換是圖像壓縮的一種最優正交變換。高維的圖像空間經過KL變換后得到一組新的正交基,保留其中重要的正交基,由這些基可以張成低維線性空間。如果假設人臉在這些低維線性空間的投影具有可分性,就可以將這些投影用作識別的特征矢量,這就是特征臉方法的基本思想。這些方法需要較多的訓練樣本,而且完全是基于圖像灰度的統計特性的。目前有一些改進型的特征臉方法。
比如人臉灰度照片40x40=1600個像素點,用每個像素的灰度值組成的矩陣代表這個人的人臉。那么這個人人臉就要1600 個特征。拿一堆這樣的樣本過來做pca,抽取得到的只是在統計意義下能代表某個樣本的幾個特征。
人臉識別可以采用神經網 絡深度學習的思路,國內的ColorReco在這邊有比較多的案例。
分享題目:pcapython函數 python中pca函數
鏈接分享:http://vcdvsql.cn/article40/hepsho.html
成都網站建設公司_創新互聯,為您提供軟件開發、云服務器、營銷型網站建設、微信小程序、服務器托管、ChatGPT
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯