回顧了下PCA的步驟,并用python實(shí)現(xiàn)。深刻的發(fā)現(xiàn)當(dāng)年學(xué)的特征值、特征向量好強(qiáng)大。
我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、大通ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的大通網(wǎng)站制作公司
PCA是一種無(wú)監(jiān)督的學(xué)習(xí)方式,是一種很常用的降維方法。在數(shù)據(jù)信息損失最小的情況下,將數(shù)據(jù)的特征數(shù)量由n,通過映射到另一個(gè)空間的方式,變?yōu)閗(kn)。
這里用一個(gè)2維的數(shù)據(jù)來(lái)說明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é)方差,對(duì)角線是各個(gè)特征的方差。
在我們的數(shù)據(jù)中,n=2,所以協(xié)方差矩陣是2 2的,
通過numpy我們可以很方便的得到:
得到cov的結(jié)果為:
array([[ 0.61655556, 0.61544444],
[ 0.61544444, 0.71655556]])
由于我們之前已經(jīng)做過normalization,因此對(duì)于我們來(lái)說,
這個(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ī)會(huì)再寫下。
用numpy計(jì)算特征根和特征向量很簡(jiǎn)單,
但是他們代表的意義非常有意思,讓我們將特征向量加到我們?cè)瓉?lái)的圖里:
其中紅線就是特征向量。有幾點(diǎn)值得注意:
藍(lán)色的三角形就是經(jīng)過坐標(biāo)變換后得到的新點(diǎn),其實(shí)他就是紅色原點(diǎn)投影到紅線、藍(lán)線形成的。
得到特征值和特征向量之后,我們可以根據(jù) 特征值 的大小,從大到小的選擇K個(gè)特征值對(duì)應(yīng)的特征向量。
這個(gè)用python的實(shí)現(xiàn)也很簡(jiǎn)單:
從eig_pairs選取前k個(gè)特征向量就行。這里,我們只有兩個(gè)特征向量,選一個(gè)最大的。
主要將原來(lái)的數(shù)據(jù)乘以經(jīng)過篩選的特征向量組成的特征矩陣之后,就可以得到新的數(shù)據(jù)了。
output:
數(shù)據(jù)果然變成了一維的數(shù)據(jù)。
最后我們通過畫圖來(lái)理解下數(shù)據(jù)經(jīng)過PCA到底發(fā)生了什么。
綠色的五角星是PCA處理過后得到的一維數(shù)據(jù),為了能跟以前的圖對(duì)比,將他們的高度定位1.2,其實(shí)就是紅色圓點(diǎn)投影到藍(lán)色線之后形成的點(diǎn)。這就是PCA,通過選擇特征根向量,形成新的坐標(biāo)系,然后數(shù)據(jù)投影到這個(gè)新的坐標(biāo)系,在盡可能少的丟失信息的基礎(chǔ)上實(shí)現(xiàn)降維。
通過上述幾步的處理,我們簡(jiǎ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é)果,果然他們因緣匪淺。
Python中6個(gè)最重要的庫(kù):
第一、NumPy
NumPy是Numerical
Python的簡(jiǎn)寫,是Python數(shù)值計(jì)算的基石。它提供多種數(shù)據(jù)結(jié)構(gòu)、算法以及大部分涉及Python數(shù)值計(jì)算所需的接口。NumPy還包括其他內(nèi)容:
①快速、高效的多維數(shù)組對(duì)象ndarray
②基于元素的數(shù)組計(jì)算或數(shù)組間數(shù)學(xué)操作函數(shù)
③用于讀寫硬盤中基于數(shù)組的數(shù)據(jù)集的工具
④線性代數(shù)操作、傅里葉變換以及隨機(jī)數(shù)生成
除了NumPy賦予Python的快速數(shù)組處理能力之外,NumPy的另一個(gè)主要用途是在算法和庫(kù)之間作為數(shù)據(jù)傳遞的數(shù)據(jù)容器。對(duì)于數(shù)值數(shù)據(jù),NumPy數(shù)組能夠比Python內(nèi)建數(shù)據(jù)結(jié)構(gòu)更為高效地存儲(chǔ)和操作數(shù)據(jù)。
第二、pandas
pandas提供了高級(jí)數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)的設(shè)計(jì)使得利用結(jié)構(gòu)化、表格化數(shù)據(jù)的工作快速、簡(jiǎn)單、有表現(xiàn)力。它出現(xiàn)于2010年,幫助Python成為強(qiáng)大、高效的數(shù)據(jù)分析環(huán)境。常用的pandas對(duì)象是DataFrame,它是用于實(shí)現(xiàn)表格化、面向列、使用行列標(biāo)簽的數(shù)據(jù)結(jié)構(gòu);以及Series,一種一維標(biāo)簽數(shù)組對(duì)象。
pandas將表格和關(guān)系型數(shù)據(jù)庫(kù)的靈活數(shù)據(jù)操作能力與Numpy的高性能數(shù)組計(jì)算的理念相結(jié)合。它提供復(fù)雜的索引函數(shù),使得數(shù)據(jù)的重組、切塊、切片、聚合、子集選擇更為簡(jiǎn)單。由于數(shù)據(jù)操作、預(yù)處理、清洗在數(shù)據(jù)分析中是重要的技能,pandas將是重要主題。
第三、matplotlib
matplotlib是最流行的用于制圖及其他二維數(shù)據(jù)可視化的Python庫(kù),它由John D.
Hunter創(chuàng)建,目前由一個(gè)大型開發(fā)者團(tuán)隊(duì)維護(hù)。matplotlib被設(shè)計(jì)為適合出版的制圖工具。
對(duì)于Python編程者來(lái)說也有其他可視化庫(kù),但matplotlib依然使用最為廣泛,并且與生態(tài)系統(tǒng)的其他庫(kù)良好整合。
第四、IPython
IPython項(xiàng)目開始于2001年,由Fernando
Pérez發(fā)起,旨在開發(fā)一個(gè)更具交互性的Python解釋器。在過去的16年中,它成為Python數(shù)據(jù)技術(shù)棧中最重要的工具之一。
盡管它本身并不提供任何計(jì)算或數(shù)據(jù)分析工具,它的設(shè)計(jì)側(cè)重于在交互計(jì)算和軟件開發(fā)兩方面將生產(chǎn)力最大化。它使用了一種執(zhí)行-探索工作流來(lái)替代其他語(yǔ)言中典型的編輯-編譯-運(yùn)行工作流。它還提供了針對(duì)操作系統(tǒng)命令行和文件系統(tǒng)的易用接口。由于數(shù)據(jù)分析編碼工作包含大量的探索、試驗(yàn)、試錯(cuò)和遍歷,IPython可以使你更快速地完成工作。
第五、SciPy
SciPy是科學(xué)計(jì)算領(lǐng)域針對(duì)不同標(biāo)準(zhǔn)問題域的包集合。以下是SciPy中包含的一些包:
①scipy.integrate數(shù)值積分例程和微分方程求解器
②scipy.linalg線性代數(shù)例程和基于numpy.linalg的矩陣分解
③scipy.optimize函數(shù)優(yōu)化器和求根算法
④scipy.signal信號(hào)處理工具
⑤scipy.sparse稀疏矩陣與稀疏線性系統(tǒng)求解器
SciPy與Numpy一起為很多傳統(tǒng)科學(xué)計(jì)算應(yīng)用提供了一個(gè)合理、完整、成熟的計(jì)算基礎(chǔ)。
第六、scikit-learn
scikit-learn項(xiàng)目誕生于2010年,目前已成為Python編程者首選的機(jī)器學(xué)習(xí)工具包。僅僅七年,scikit-learn就擁有了全世界1500位代碼貢獻(xiàn)者。其中包含以下子模塊:
①分類:SVM、最近鄰、隨機(jī)森林、邏輯回歸等
②回歸:Lasso、嶺回歸等
③聚類:K-means、譜聚類等
④降維:PCA、特征選擇、矩陣分解等
⑤模型選擇:網(wǎng)格搜索、交叉驗(yàn)證、指標(biāo)矩陣
⑥預(yù)處理:特征提取、正態(tài)化
scikit-learn與pandas、statsmodels、IPython一起使Python成為高效的數(shù)據(jù)科學(xué)編程語(yǔ)言。
LDA降維后的維度區(qū)間在[1,C-1],C為特征空間的維度,與原始特征數(shù)n無(wú)關(guān),對(duì)于二值分類,最多投影到1維,所以我估計(jì)你是因?yàn)檫@是個(gè)二分類問題,所以只能降到一維。
def dict_f(f): d={} for line in f: l = line.strip("\n").split(" ") d[l[0]] = l[1:] return ddef result(d_c,d_a,cookn): app,game,shoot,apply,function,iq=0,0,0,0,0,0 app = len(d_c[cookn]) for i in d_c[cookn]: for ii in d_a[i]: if (ii=="game"): game= game+1 elif(ii=="shoot"): shoot = shoot +1 elif(ii=="apply"): apply = apply +1 elif(ii=="function"): function = function +1 elif(ii=="iq"): iq = iq +1 else: pass return (app,game,shoot,apply,function,iq) f = open("cookie.txt","r+") #行首沒有空格,每個(gè)單詞之間有且僅有一個(gè)空格d_c = dict_f(f) f1 = open("app.txt","r+")#行首沒有空格,每個(gè)單詞之間有且僅有一個(gè)空格d_a = dict_f(f1)l_c = d_c.keys()l=[i for i in sorted(l_c) if(i!="") ]for i in l: print i+" "+"app=%d game=%d shoot=%d apply=%d function=%d iq=%d"%result(d_c,d_a,i)#print 可以改寫輸入到文件中
首先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()
網(wǎng)站標(biāo)題:python降維的函數(shù) excel降維函數(shù)
標(biāo)題來(lái)源:http://m.rwnh.cn/article38/hhgpsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、定制開發(fā)、虛擬主機(jī)、網(wǎng)站策劃、響應(yīng)式網(wǎng)站、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)