1. 程式人生 > >【機器學習算法-python實現】PCA 主成分分析、降維

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

pre gre text iss 主成分分析 int 找到 nts 導入

1.背景

PCA(Principal Component Analysis),PAC的作用主要是減少數據集的維度,然後挑選出基本的特征。 PCA的主要思想是移動坐標軸,找到方差最大的方向上的特征值。什麽叫方差最大的方向的特征值呢。就像下圖中的曲線B。一樣。它的覆蓋範圍最廣。技術分享

基本步驟:(1)首先計算數據集的協方差矩陣 (2)計算協方差矩陣的特征值和特征向量 (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.代碼實現

偽代碼例如以下(摘自機器學習實戰):技術分享
‘‘‘
@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

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


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