Python 主成分分析PCA

Python 主成分分析PCA

  主成分分析(PCA)是一種基于變量協方差矩陣對數據進行壓縮降維、去噪的有效方法,PCA的思想是將n維特征映射到k維上(k<n),這k維特征稱為主元,是舊特征的線性組合,這些線性組合最大化樣本方差,盡量使新的k個特征互不相關。

相關知識

介紹一個PCA的教程:A tutorial on Principal Components Analysis ——Lindsay I Smith

1.協方差?Covariance

  變量X和變量Y的協方差公式如下,協方差是描述不同變量之間的相關關系,協方差>0時說明 X和 Y是正相關關系,協方差<0時 X和Y是負相關關系,協方差為0時 X和Y相互獨立。

  

  協方差的計算是針對兩維的,對于n維的數據集,可以計算C(n,2)種協方差。?n維數據的協方差矩陣的定義如下:
  
? ? ? Dim(x)表示第x維。

? ? ? 對于三維(x,y,z),其協方差矩陣如下,可看出協方差矩陣是一個對稱矩陣(symmetrical),其對角線元素為每一維的方差:
?  ?

2.特征向量和特征值 

  若,則稱是A的特征值,X是對應的特征向量。可以這樣理解:矩陣A作用在它的特征向量X上,僅僅使得X的長度發生了變化,縮放比例就是相應的特征值。特征向量只能在方陣中找到,而且并不是所有的方陣都有特征向量,并且如果一個n*n的方陣有特征向量,那么就有n個特征向量。一個矩陣的所有特征向量是正交的,即特征向量之間的點積為0,一般情況下,會將特征向量歸一化,即向量長度為1。

3.PCA過程

  第一步,獲取數據,下圖中的Data為原始數據,一共有兩個維度,可看出二維平面上的點。

  

  下圖是Data在二維坐標平面上的散點圖:

  

  第二步,減去平均值,對于Data中的每一維數據分別求平均值,并減去平均值,得到DataAdjust數據。

  第三步,計算DataAdjust的協方差矩陣

  

  第四步,計算協方差矩陣的特征向量和特征值,選取特征向量

  
  ?

  特征值0.490833989對應的特征向量是(-0.735178656, 0.677873399),這里的特征向量是正交的、歸一化的,即長度為1。

  下圖展示DataAdjust數據和特征向量的關系:

  

  正號表示預處理后的樣本點,斜著的兩條線就分別是正交的特征向量(由于協方差矩陣是對稱的,因此其特征向量正交),特征值較大的那個特征向量是這個數據集的主要成分(principle component)。通常來說,當從協方差矩陣計算出特征向量之后,下一步就是通過特征值,對特征向量進行從大到小的排序,這將給出成分意義的順序。成分的特征值越小,其包含的信息量也就越少,因此可以適當選擇。 ?

  如果數據中有n維,計算出n個特征向量和特征值,選擇前k個特征向量,然后最終的數據集合只有k維,取的特征向量命名為FeatureVector。?

??  ?

  這里特征值只有兩個,我們選擇其中最大的那個,1.28402771,對應的特征向量是clip_image009[6]

  第五步,將樣本點投影到選取的特征向量上,得到新的數據集

  假設樣例數為m,特征數為n,減去均值后的樣本矩陣為DataAdjust(m*n),協方差矩陣是n*n,選取的k個特征向量組成的矩陣為EigenVectors(n*k)。那么投影后的數據FinalData為

? ? ? ?clip_image011[4]?

  這里是FinalData(10*1) = DataAdjust(10*2矩陣)×特征向量clip_image009[7]

  得到結果為

  clip_image012[4]

  下圖是FinalData根據最大特征值對應的特征向量轉化回去后的數據集形式,可看出是將DataAdjust樣本點分別往特征向量對應的軸上做投影:

  

  如果取的k=2,那么結果是

?????clip_image014[4]

  可見,若使用了所有特征向量得到的新的數據集,轉化回去之后,與原來的數據集完全一樣(只是坐標軸旋轉)。

Python實現PCA

  將數據轉化成前K個主成分的偽碼大致如下: 

復制代碼
'''
減去平均數
計算協方差矩陣
計算協方差矩陣的特征值和特征向量
將特征值從大到小排序
保留最大的K個特征向量
將數據轉換到上述K各特征向量構建的新空間中
'''
復制代碼

  代碼實現如下:

復制代碼
from numpy import *def loadDataSet(fileName, delim='\t'):fr = open(fileName)stringArr = [line.strip().split(delim) for line in fr.readlines()]datArr = [map(float,line) for line in stringArr]return mat(datArr)def pca(dataMat, topNfeat=999999):meanVals = mean(dataMat, axis=0)DataAdjust = dataMat - meanVals           #減去平均值covMat = cov(DataAdjust, rowvar=0)eigVals,eigVects = linalg.eig(mat(covMat)) #計算特征值和特征向量#print eigValseigValInd = argsort(eigVals)eigValInd = eigValInd[:-(topNfeat+1):-1]   #保留最大的前K個特征值redEigVects = eigVects[:,eigValInd]        #對應的特征向量lowDDataMat = DataAdjust * redEigVects     #將數據轉換到低維新空間reconMat = (lowDDataMat * redEigVects.T) + meanVals   #重構數據,用于調試return lowDDataMat, reconMat
復制代碼

  測試數據testSet.txt由1000個數據點組成。下面對數據進行降維,并用matplotlib模塊將降維后的數據和原始數據一起繪制出來。

復制代碼
import matplotlib
import matplotlib.pyplot as pltdataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat,1)
print "shape(lowDMat): ",shape(lowDMat)fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()
復制代碼

  結果如下圖:

Python環境

1.編譯環境:win8.1 + 32位 + python2.7

2.相關模塊安裝:

  (1)Numpy和Scipy:numpy用于存儲和處理大型矩陣,進行數值計算。scipy是基于numpy的科學和工程計算工具,用于處理多維數組向量、矩陣、圖形(圖形圖像是像素的二維數組)、表格。下載地址:http://www.scipy.org/scipylib/download.html

  (2)Matplotlib:python的一個圖形框架,用于數據繪圖。win32的安裝文件下載地址:http://matplotlib.org/downloads.html

  (3)Dateutil 和 Pyparsing模塊:安裝配置matplotlib包時需要。win32的安裝文件下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/

3.編譯遇到問題:

  (1)提示“No module name six”,將\Python27\Lib\site-packages\scipy\lib中的six.py six.pyc six.pyo三個文件拷貝到\Python27\Lib\site-packages目錄下即可。

  (2)提示 “ImportError:?six?1.3?or?later?is?required;?you?have?1.2.0”,說明six.py版本過低,下載最新的版本,將其中的six.py替換\Python27\Lib\site-packages中的six.py即可,下載地址:https://pypi.python.org/pypi/six/

  注:six模塊是Python 2和3的兼容工具

?

PCA可以從數據中識別其主要特征,它是通過沿著數據最大方差方向旋轉坐標軸來實現的。其中的矩陣運算,求特征值、特征向量等不是很熟悉,仍需進一步學習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387842.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387842.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387842.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小程序 國際化_在國際化您的應用程序時忘記的一件事

小程序 國際化The hidden bugs waiting to be found by your international users您的國際用戶正在等待發現的隱藏錯誤 While internationalizing our applications, we focus on the things we can see: text, tool-tips, error messages, and the like. But, hidden in our …

三. 性能測試領域

能力驗證&#xff1a; 概念&#xff1a;系統能否在A條件下具備B能力 應用&#xff1a;為客戶進行系統上線后的驗收測試&#xff0c;作為第三方對一個已經部署系統的性能驗證 特點&#xff1a;需要在已確定的環境下運行 需要根據典型場景設計測試方案和用例 一個典型場景包括操…

PCA主成分分析Python實現

作者&#xff1a;拾毅者 出處&#xff1a;http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源碼&#xff1a;https://github.com/csuldw/MachineLearning/tree/master/PCA PCA&#xff08;principle component analysis&#xff09; &#xff0c;主成分分…

scp

將文件或目錄從本地通過網絡拷貝到目標端。拷貝目錄要帶 -r 參數 格式&#xff1a;scp 本地用戶名IP地址:文件名1 遠程用戶名IP地址:文件名 2 例&#xff1a; scp media.repo root192.168.20.32:/etc/yum.repos.d/ 將遠程主機文件或目錄拷貝到本機&#xff0c;源和目的參數調換…

robo 3t連接_使用robo 3t studio 3t連接到地圖集

robo 3t連接Robo 3T (formerly Robomongo) is a graphical application to connect to MongoDB. The newest version now includes support for TLS/SSL and SNI which is required to connect to Atlas M0 free tier clusters.Robo 3T(以前稱為Robomongo )是用于連接MongoDB的…

JavaWeb--JavaEE

一、JavaEE平臺安裝1、升級eclipseEE插件2、MyEclipse二、配置Eclipse工作空間1.字體設置 2.工作空間編碼 UTF-83.JDK版本指定 4.集成Tomcat Server運行環境5.配置server webapps目錄 端口號 啟動時間等三、創建第一個Web項目1.創建 Web Project2.設置 tomcat、創建web.xml3.目…

軟件需求規格說明書通用模版_通用需求挑戰和機遇

軟件需求規格說明書通用模版When developing applications there will be requirements that are needed on more than one application. Examples of such common requirements are non-functional, cookie consent and design patterns. How can we work with these types of…

python版PCA(主成分分析)

python版PCA&#xff08;主成分分析&#xff09; 在用統計分析方法研究這個多變量的課題時&#xff0c;變量個數太多就會增加課題的復雜性。人們自然希望變量個數較少而得到的信息較多。在很多情形&#xff0c;變量之間是有一定的相關關系的&#xff0c;當兩個變量之間有一定…

干貨|Spring Cloud Bus 消息總線介紹

2019獨角獸企業重金招聘Python工程師標準>>> 繼上一篇 干貨&#xff5c;Spring Cloud Stream 體系及原理介紹 之后&#xff0c;本期我們來了解下 Spring Cloud 體系中的另外一個組件 Spring Cloud Bus (建議先熟悉 Spring Cloud Stream&#xff0c;不然無法理解 Spr…

一類動詞二類動詞三類動詞_基于http動詞的完全無效授權技術

一類動詞二類動詞三類動詞Authorization is a basic feature of modern web applications. It’s a mechanism of specifying access rights or privileges to resources according to user roles. In case of CMS like applications, it needs to be equipped with advanced l…

主成份分析(PCA)詳解

主成分分析法&#xff08;Principal Component Analysis&#xff09;大多在數據維度比較高的時候&#xff0c;用來減少數據維度&#xff0c;因而加快模型訓練速度。另外也有些用途&#xff0c;比如圖片壓縮&#xff08;主要是用SVD&#xff0c;也可以用PCA來做&#xff09;、因…

thinkphp5記錄

ThinkPHP5 隱藏index.php問題 thinkphp模板輸出cookie,session中… 轉載于:https://www.cnblogs.com/niuben/p/10056049.html

portainer容器可視化管理部署簡要筆記

參考鏈接&#xff1a;https://www.portainer.io/installation/ 1、單個宿主機部署in Linux&#xff1a;$ docker volume create portainer_data$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer 2、單…

證明您履歷表經驗的防彈五步法

How many times have you gotten the question “Tell me more about your work experience at …” or “Describe an experience when you had to overcome a technical challenge”? Is your answer solid and bullet-proof every single time you have to respond? If no…

2018-2019-1 20165231 實驗四 外設驅動程序設計

博客鏈接&#xff1a;https://www.cnblogs.com/heyanda/p/10054680.html 轉載于:https://www.cnblogs.com/Yhooyon/p/10056173.html

如何安裝pylab:python如何導入matplotlib模塊

pylab是python下挺不錯的一個畫圖模塊&#xff0c;使用也非常簡單&#xff0c;記得Mit的計算機科學及編程導論有節課也是用到了這個工具&#xff0c;但這個工具安裝不象用起來那么方便&#xff0c;小編就圖文全程直播下吧 工具/原料 python2.7.10win10 32位方法/步驟 1缺省狀態…

微信掃描二維碼和瀏覽器掃描二維碼 ios和Android 分別進入不用的提示頁面

實現微信掃描二維碼和瀏覽器掃描二維碼 ios和Android 分別進入不用的提示頁面 而進入商城下載該項目 詳情地址&#xff1a;gitee.com/DuJiaHui123… 1.創建完之后 替換文件里面的ios項目地址和Android地址 2.網頁上線 3.百度搜索 二維碼生成 把上線后的地址生成二維碼 4.可以把…

詳解getchar()函數與緩沖區

1、首先&#xff0c;我們看一下這段代碼&#xff1a; 它的簡單意思就是從鍵盤讀入一個字符&#xff0c;然后輸出到屏幕。理所當然&#xff0c;我們輸入1&#xff0c;輸出就是1&#xff0c;輸入2&#xff0c;輸出就是2。 那么我們如果輸出的是12呢&#xff1f; 它的輸出是1。 這…

windows下python安裝Numpy、Scipy、matplotlib模塊

python 2.7 針對2.7的軟件。numpy :http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ 下載下面的numpy-1.8.2-win32-superpack-python2.7 scipy: http://sourceforge.net/projects/scipy/files/matplotlib:matplotlib-1.1.0.win32-py2.7 以上都是exe文件&#xff0…

restTemplate使用和踩坑總結

日常工作中肯定會遇到服務之間的調用&#xff0c;尤其是現在都是微服務的架構&#xff0c;所以總結一下restTemplate的最常用的用法以及自己踩過的坑。 restTemplate的使用 restTemplate底層調用的是Execute方法&#xff0c;而Execute底層調用的是doExecute&#xff0c;它是基于…