【機器學習算法-python實現】PCA 主成分分析、降維

【機器學習算法-python實現】PCA 主成分分析、降維

標籤: 機器學習pcapython

2014-07-17 09:40 4036人閱讀 評論(4) 收藏 舉報git

本文章已收錄於: github

 機器學習知識庫算法

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。app

目錄(?)[+]機器學習

1.背景

        PCA(Principal Component Analysis),PAC的做用主要是下降數據集的維度,而後挑選出主要的特徵。函數

        PCA的主要思想是移動座標軸,找到方差最大的方向上的特徵值,什麼叫方差最大的方向的特徵值呢。就像下圖中的曲線B,同樣,它的覆蓋範圍最廣。學習

 

基本步驟:(1)首先計算數據集的協方差矩陣spa

                   (2)計算協方差矩陣的特徵值和特徵向量.net

                   (3)保留最重要的n個特徵

 

 

what is 協方差矩陣:

定義是變量向量減去均值向量,而後乘以變量向量減去均值向量的轉置再求均值。例如x是變量,μ是均值,協方差矩陣等於E[(x-μ)(x-μ)^t],物理意義是這樣的,例如x=(x1,x2,...,xi)那麼協方差矩陣的第m行n列的數爲xm與xn的協方差,若m=n,則是xn的方差。若是x的元素之間是獨立的,那麼協方差矩陣只有對角線是有值,由於x獨立的話對於m≠n的狀況xm與xn的協方差爲0。另外協方差矩陣是對稱的。

能夠參考wiki:(http://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE%E7%9F%A9%E9%98%B5)

 

 

 

2.代碼實現

僞代碼以下(摘自機器學習實戰):

[python] view plain copy

 print?

  1. ''''' 
  2. @author: Garvin 
  3. '''  
  4. from numpy import *  
  5. import matplotlib.pyplot as plt  
  6.   
  7. def loadDataSet(fileName, delim='\t'):  
  8.     fr = open(fileName)  
  9.     stringArr = [line.strip().split(delim) for line in fr.readlines()]  
  10.     datArr = [map(float,line) for line in stringArr]  
  11.     return mat(datArr)  
  12.   
  13. def pca(dataMat, topNfeat=9999999):  
  14.     meanVals = mean(dataMat, axis=0)  
  15.     meanRemoved = dataMat - meanVals #remove mean  
  16.     covMat = cov(meanRemoved, rowvar=0)  
  17.     eigVals,eigVects = linalg.eig(mat(covMat))  
  18.     eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest  
  19.     eigValInd = eigValInd[:-(topNfeat+1):-1]  #cut off unwanted dimensions  
  20.     redEigVects = eigVects[:,eigValInd]       #reorganize eig vects largest to smallest  
  21.     lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions  
  22.     reconMat = (lowDDataMat * redEigVects.T) + meanVals  
  23.     return lowDDataMat, reconMat  
  24.   
  25. def plotBestFit(dataSet1,dataSet2):        
  26.     dataArr1 = array(dataSet1)  
  27.     dataArr2 = array(dataSet2)  
  28.     n = shape(dataArr1)[0]   
  29.     n1=shape(dataArr2)[0]  
  30.     xcord1 = []; ycord1 = []  
  31.     xcord2 = []; ycord2 = []  
  32.     xcord3=[];ycord3=[]  
  33.     j=0  
  34.     for i in range(n):  
  35.           
  36.             xcord1.append(dataArr1[i,0]); ycord1.append(dataArr1[i,1])  
  37.             xcord2.append(dataArr2[i,0]); ycord2.append(dataArr2[i,1])                    
  38.     fig = plt.figure()  
  39.     ax = fig.add_subplot(111)  
  40.     ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')  
  41.     ax.scatter(xcord2, ycord2, s=30, c='green')  
  42.       
  43.     plt.xlabel('X1'); plt.ylabel('X2');  
  44.     plt.show()      
  45.   
  46.   
  47.   
  48.   
  49. if __name__=='__main__':  
  50.      mata=loadDataSet('/Users/hakuri/Desktop/testSet.txt')    
  51.      a,b= pca(mata, 2)  


loadDataSet函數是導入數據集。

PCA輸入參數:參數一是輸入的數據集,參數二是提取的維度。好比參數二設爲1,那麼就是返回了降到一維的矩陣。

PCA返回參數:參數一指的是返回的低維矩陣,對應於輸入參數二。參數二對應的是移動座標軸後的矩陣。

 

 

上一張圖,綠色爲原始數據,紅色是提取的2維特徵。

 

 

3.代碼下載

    下載地址:請點擊我

 

 

 

 

/********************************

* 本文來自博客  「李博Garvin「

* 轉載請標明出處:http://blog.csdn.net/buptgshengod

******************************************/

相關文章
相關標籤/搜索