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