標籤: 機器學習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?
- '''''
- @author: Garvin
- '''
- from numpy import *
- import matplotlib.pyplot as plt
-
- 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=9999999):
- meanVals = mean(dataMat, axis=0)
- meanRemoved = dataMat - meanVals #remove mean
- covMat = cov(meanRemoved, rowvar=0)
- eigVals,eigVects = linalg.eig(mat(covMat))
- eigValInd = argsort(eigVals) #sort, sort goes smallest to largest
- eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions
- redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest
- lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
- reconMat = (lowDDataMat * redEigVects.T) + meanVals
- return lowDDataMat, reconMat
-
- def plotBestFit(dataSet1,dataSet2):
- dataArr1 = array(dataSet1)
- dataArr2 = array(dataSet2)
- n = shape(dataArr1)[0]
- n1=shape(dataArr2)[0]
- xcord1 = []; ycord1 = []
- xcord2 = []; ycord2 = []
- xcord3=[];ycord3=[]
- j=0
- for i in range(n):
-
- xcord1.append(dataArr1[i,0]); ycord1.append(dataArr1[i,1])
- xcord2.append(dataArr2[i,0]); ycord2.append(dataArr2[i,1])
- fig = plt.figure()
- ax = fig.add_subplot(111)
- ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
- ax.scatter(xcord2, ycord2, s=30, c='green')
-
- plt.xlabel('X1'); plt.ylabel('X2');
- plt.show()
-
-
-
-
- if __name__=='__main__':
- mata=loadDataSet('/Users/hakuri/Desktop/testSet.txt')
- a,b= pca(mata, 2)
loadDataSet函數是導入數據集。
PCA輸入參數:參數一是輸入的數據集,參數二是提取的維度。好比參數二設爲1,那麼就是返回了降到一維的矩陣。
PCA返回參數:參數一指的是返回的低維矩陣,對應於輸入參數二。參數二對應的是移動座標軸後的矩陣。
上一張圖,綠色爲原始數據,紅色是提取的2維特徵。

3.代碼下載
下載地址:請點擊我
/********************************
* 本文來自博客 「李博Garvin「
* 轉載請標明出處:http://blog.csdn.net/buptgshengod
******************************************/