• 【机器学习算法-python实现】PCA 主成分分析、降维


    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='	'):
        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

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


  • 相关阅读:
    一个简单的禁止鼠标滚轮事件处理
    模仿抽奖转盘,并且用cookie记录历史次数
    学习jquery
    使用var提升变量声明
    Django 自带密码加密,自定密码加密方式 及自定义验证方式
    kindEditor使用并防止xss攻击(day88)
    python二维码生成库(qrcode)简介和实例
    js原型的区别
    js中 this与that
    python单元测试之unittest框架使用总结
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6819611.html
Copyright © 2020-2023  润新知