高维数据的应对手段: 主成分分析(PCA)简介+numpy实现+weka使用说明

数据挖掘经常遇到大数据的情况,其中的一个表现形式就是数据的维度非常多,为了对维度进行压缩,可以采用一种名叫主成分分析的技术(PCA),下面的链接把PCA的原理解释地非常好:

http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html

在这里我补充几点:

投影:某一点在某个向量上的投影等于 这点的坐标 点乘 向量的单位向量。

方阵的特征值和特征向量:http://baike.baidu.com/link?url=kGEI3eUtEDlY2QxKhKu5NW_PuwJV26-b_GdXrWHxFQFc-usMO8Bw04TEWgVVd-Ne

协方差:http://zh.wikipedia.org/zh-cn/%E5%8D%8F%E6%96%B9%E5%B7%AE

在第一个链接中,最大方差理论的证明过程中:X(i) 可以看作是一个一列n行的矩阵,而被投影的向量 u 可以看作一个n列一行的矩阵,这两个矩阵的乘积是一个一行一列的矩阵,一行一列的矩阵的转置矩阵等于其本身,然后利用了矩阵转置的特性:

(X^T u)^T= X^T u 

这里的 ^T 表示 转置,X和u分别表示数据向量和投影向量,所以才有了这一步推导:


下面我们就试着用 python 上著名的科学计算库 numpy 来对一个数据矩阵进行主成分分析:

from numpy import *

def pca(dataMat, topNfeat=5):
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals #减去均值
    stded = meanRemoved / std(dataMat) #用标准差归一化
    covMat = cov(stded, rowvar=0) #求协方差方阵
    eigVals, eigVects = linalg.eig(mat(covMat)) #求特征值和特征向量
    eigValInd = argsort(eigVals)  #对特征值进行排序
    eigValInd = eigValInd[:-(topNfeat + 1):-1]  
    redEigVects = eigVects[:, eigValInd]       # 除去不需要的特征向量
    lowDDataMat = stded * redEigVects    #求新的数据矩阵
    reconMat = (lowDDataMat * redEigVects.T) * std(dataMat) + meanVals
    return lowDDataMat, reconMat

在 weka 的非监督属性过滤器中也能找到 PrincipalComponents 过滤器,maxiumAttributes 表示要提取多少维度作为主成分,varianceCovered表示在用最大方差理论时保留一定百分比的主元(特征值)用于计算方差并排序提取不多于maxiumAttributes指定的主元作新的维度



原文地址:https://www.cnblogs.com/rav009/p/5131099.html