PCA主成分分析Python實現

作者:拾毅者?
出處:http://blog.csdn.net/Dream_angel_Z/article/details/50760130?
Github源碼:https://github.com/csuldw/MachineLearning/tree/master/PCA

PCA(principle component analysis) ,主成分分析,主要是用來降低數據集的維度,然后挑選出主要的特征。原理簡單,實現也簡單。關于原理公式的推導,本文不會涉及,你可以參考下面的參考文獻,也可以去Wikipedia,這里主要關注實現,算是鍛煉一下自己。

本來是在復習LDA的,然后就看到了PCA,就跟著下面這篇文章的步驟,把PCA用Python實現了一遍,具體的思想可以參考這篇文章,講的通俗易懂,主要是有個實例參考,值得擁有!

  • JerryLead之PCA主成分分析

下面自己來簡單的清理下思路!

PCA思想

主要思想:移動坐標軸,將n維特征映射到k維上(k<n),這k維是全新的正交特征。這k維特征稱為主元,是重新構造出來的k維特征,而不是簡單地從n維特征中去除其余n-k維特征。

說到PCA難免會提到LDA(linear discriminate analysis,線性判別分析),以及FA(factor analysis,因子分析)。關于LDA,打算有時間也用代碼實現一遍,下面給出它的主要思想。

LDA思想:最大類間距離,最小類內距離。簡而言之,第一,為了實現投影后的兩個類別的距離較遠,用映射后兩個類別的均值差的絕對值來度量。第二,為了實現投影后,每個類內部數據點比較聚集,用投影后每個類別的方差來度量。

三者的描述如下

以下內容引自?Wikipedia- Linear discriminant analysis

LDA is also closely related to principal component analysis (PCA) and factor analysis in that they both look for linear combinations of variables which best explain the data.[4] LDA explicitly attempts to model the difference between the classes of data. PCA on the other hand does not take into account any difference in class, and factor analysis builds the feature combinations based on differences rather than similarities. Discriminant analysis is also different from factor analysis in that it is not an interdependence technique: a distinction between independent variables and dependent variables (also called criterion variables) must be made.

區別:PCA選擇樣本點投影具有最大方差的方向,LDA選擇分類性能最好的方向。

好了,下面來看下實現源碼!

基本步驟

基本步驟:

  • 對數據進行歸一化處理(代碼中并非這么做的,而是直接減去均值)
  • 計算歸一化后的數據集的協方差矩陣
  • 計算協方差矩陣的特征值和特征向量
  • 保留最重要的k個特征(通常k要小于n),也可以自己制定,也可以選擇一個閾值,然后通過前k個特征值之和減去后面n-k個特征值之和大于這個閾值,則選擇這個k
  • 找出k個特征值對應的特征向量
  • 將m * n的數據集乘以k個n維的特征向量的特征向量(n * k),得到最后降維的數據。

其實PCA的本質就是對角化協方差矩陣。有必要解釋下為什么將特征值按從大到小排序后再選。首先,要明白特征值表示的是什么?在線性代數里面我們求過無數次了,那么它具體有什么意義呢?對一個n*n的對稱矩陣進行分解,我們可以求出它的特征值和特征向量,就會產生n個n維的正交基,每個正交基會對應一個特征值。然后把矩陣投影到這N個基上,此時特征值的模就表示矩陣在該基的投影長度。特征值越大,說明矩陣在對應的特征向量上的方差越大,樣本點越離散,越容易區分,信息量也就越多。因此,特征值最大的對應的特征向量方向上所包含的信息量就越多,如果某幾個特征值很小,那么就說明在該方向的信息量非常少,我們就可以刪除小特征值對應方向的數據,只保留大特征值方向對應的數據,這樣做以后數據量減小,但有用的信息量都保留下來了。PCA就是這個原理。

源碼實現

1.首先引入numpy,由于測試中用到了pandas和matplotlib,所以這里一并加載

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2.定義一個均值函數

#計算均值,要求輸入數據為numpy的矩陣格式,行表示樣本數,列表示特征    
def meanX(dataX):return np.mean(dataX,axis=0)#axis=0表示按照列來求均值,如果輸入list,則axis=1
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

3.編寫pca方法,具體解釋參考注釋

"""
參數:- XMat:傳入的是一個numpy的矩陣格式,行表示樣本數,列表示特征    - k:表示取前k個特征值對應的特征向量
返回值:- finalData:參數一指的是返回的低維矩陣,對應于輸入參數二- reconData:參數二對應的是移動坐標軸后的矩陣
"""
def pca(XMat, k):average = meanX(XMat) m, n = np.shape(XMat)data_adjust = []avgs = np.tile(average, (m, 1))data_adjust = XMat - avgscovX = np.cov(data_adjust.T)   #計算協方差矩陣featValue, featVec=  np.linalg.eig(covX)  #求解協方差矩陣的特征值和特征向量index = np.argsort(-featValue) #按照featValue進行從大到小排序finalData = []if k > n:print "k must lower than feature number"returnelse:#注意特征向量時列向量,而numpy的二維矩陣(數組)a[m][n]中,a[1]表示第1行值selectVec = np.matrix(featVec.T[index[:k]]) #所以這里需要進行轉置finalData = data_adjust * selectVec.T reconData = (finalData * selectVec) + average  return finalData, reconData
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

4.編寫一個加載數據集的函數

#輸入文件的每行數據都以\t隔開
def loaddata(datafile):return np.array(pd.read_csv(datafile,sep="\t",header=-1)).astype(np.float)
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

5.可視化結果

因為我將維數k指定為2,所以可以使用下面的函數將其繪制出來:

def plotBestFit(data1, data2):    dataArr1 = np.array(data1)dataArr2 = np.array(data2)m = np.shape(dataArr1)[0]axis_x1 = []axis_y1 = []axis_x2 = []axis_y2 = []for i in range(m):axis_x1.append(dataArr1[i,0])axis_y1.append(dataArr1[i,1])axis_x2.append(dataArr2[i,0]) axis_y2.append(dataArr2[i,1])                 fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')ax.scatter(axis_x2, axis_y2, s=50, c='blue')plt.xlabel('x1'); plt.ylabel('x2');plt.savefig("outfile.png")plt.show()  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

6.測試方法

測試方法寫入main函數中,然后直接執行main方法即可:

data.txt可到github中下載:data.txt

#根據數據集data.txt
def main():    datafile = "data.txt"XMat = loaddata(datafile)k = 2return pca(XMat, k)
if __name__ == "__main__":finalData, reconMat = main()plotBestFit(finalData, reconMat)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

結果展示

最后的結果圖如下:


?

藍色部分為重構后的原始數據,紅色則是提取后的二維特征!

參考文獻

[1]?http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html?
[2]?Wikipedia- Linear discriminant analysis?
[3]?Wikipedia- Principal_component_analysis

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

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

相關文章

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;它是基于…

常見編碼總結

本文總結自&#xff1a;https://blog.csdn.net/zmx729618/article/details/51821024 1. ISO 8859-1 字節數&#xff1a;1 范圍&#xff1a;0-255&#xff08;編碼范圍是0x00-0xFF&#xff09;&#xff0c;其中0x00-0x7F之間完全和ASCII一致&#xff08;ASCII是7位編碼&#xff…

啟動一個Java進程

windows版本 startup.bat -------------------------------------------------------- rem --------------------------------------------------------------------------- rem Start SMS Server by zhangjin rem --------------------------------------------------------…

Flask框架從入門到精通之參數配置(二)

知識點&#xff1a; 1、參數配置 一、概況 上一篇我們已經把Flask第一個程序運行起來了&#xff0c;那么這一篇主要講一下Flask參數的配置。 二、配置參數 Flask參數配置方式有很多種&#xff0c;每一種都可以達到結果&#xff0c;在合適的場景選擇合適的配置方式。 配置文件 在…