​Numpy中怎么实现PCA

本篇内容主要讲解“Numpy中怎么实现PCA”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Numpy中怎么实现PCA”吧!

创新互联公司是专业的鲁甸网站建设公司,鲁甸接单;提供成都网站设计、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行鲁甸网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

Numpy中实现PCA

from numpy import *

'''
10.235186	11.321997
10.122339	11.810993
9.190236	8.904943
9.306371	9.847394
8.330131	8.340352
10.152785	10.123532
10.408540	10.821986
...
...
'''
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)                    #计算列均值
    print meanVals                                      # [[ 9.06393644  9.09600218]]
    print '======'
    meanRemoved = dataMat - meanVals #remove mean       # 每一列都减去均值
    covMat = cov(meanRemoved, rowvar=0)                 # 计算新矩阵(减去均值)协方差
    print covMat                                        # [
                                                            [ 1.05198368  1.1246314 ]
                                                            [ 1.1246314   2.21166499]
                                                          ]
                                                          
                                                        #协方差
    print '======'
    eigVals,eigVects = linalg.eig(mat(covMat))          #计算协方差矩阵的特征值和特征向量
    print eigVals                                       # [ 0.36651371  2.89713496]
    print '======'
    print eigVects                                      #  [
                                                            [-0.85389096 -0.52045195]
                                                            [ 0.52045195 -0.85389096]
                                                           ]  
    print '======'
    eigValInd = argsort(eigVals)                        #按照特征值从大到小排序。选择topN
    eigValInd = eigValInd[:-(topNfeat+1):-1]  
    redEigVects = eigVects[:,eigValInd]               
    print redEigVects
    print '======'                                      #[
                                                            [-0.52045195]
                                                            [-0.85389096]
                                                         ]
    lowDDataMat = meanRemoved * redEigVects             # N x 2  * 2 x 1 ==> N x 1 
                                                          即把N x 2的矩阵转化成N x 1 的矩阵,维度降到1  
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

均值: mean(X) = (x0 + x1 + ... + xn) / n

标准差:std = Math.sqrt([x0 - mean(x)]^2/(n-1),2)

方差:var=[x0 - mean(x)]^2/(n-1)

比如两个集合[0,8,12,20]、[8,9,11,12] 均值都是10.但是两个集合的差别很大。计算两个标准差,前者是8.3和后者是1.8.

显示后者比较集中。标准差描述了数据的“散布度”。之所以除以n-1而不是n。是因为能使我们以较小的样本更好的逼近总体的标准差。即“无偏估计”

为什么需要协方差?

标准差和方差一般是用来描述一维的数据。但是现实生活中,我们常常遇到含有二维数据的数据集。最简单的是大家上学免不了的统计多个学科的考试成绩。多维数据之间的关系。协方差就是这样一种度量两个随机变量关系的统计量

var(X) = {Math.pow(xi-mean(X),2)}/(n-1) = {xi-mean(X)}{xi-mean(X)}/(n-1)

仿照方差的定义:

cov(X,Y)= {xi-mean(X)}{yi-mean(Y)}/(n-1)

来度量各个维度偏离其均值的程度。

协方差结果的意义:

如果是正值,则说明两者是正相关,如果结果是负值,则说明两者是负相关。如果是0,表示两者没有关联,相互独立。

多维协方差:矩阵来表示

    cov(x,x) cov(x,y) cov(x,z)

C=cov(y,x) cov(y,y) cov(y,z)      ===> 可见协方差矩阵是一个对称矩阵,而且对角线是各个维度的方差。 是3*3

    cov(z,x) cov(z,y) cov(z,z)

到此,相信大家对“Numpy中怎么实现PCA”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享文章:​Numpy中怎么实现PCA
路径分享:http://azwzsj.com/article/ggchpp.html