主成分分析详解以及python实现

China☆狼群 提交于 2020-02-22 22:33:41

主成分分析的基本概念

主成分分析(Principal Component Analysis,PCA)是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。

主成分分析的意义

对于一组数据X,存在以下特征{x1,x2,x3},这些特征之间可能存在一些关联性,主成分分析就是利用代表数据之间关联性的协方差矩阵来去除数据的关联性,找到一组数据中最关键的要素。

举一个简单的例子,比如对于一组深海鱼的数据,有身长,体重,游速,体温等等。但是如果我们用这些数据来描述一条深海鱼,那就过于复杂了。显然,即使凭借我们从先验的感官中,就可以看出鱼的身长和体重这两组数据是有高度重合性的,身长长的鱼类体重必然沉。那么我们可不可以把这两种鱼类特征合并到一起呢。因为对于数据的分析而言,少了一个数据,就让整数据的空间下降了一个维度,这是十分必要的。

主成分分析用到的数学工具

协方差矩阵

协方差矩阵是利用标准化过后特征矩阵的转置乘以它本身来得到的,它是一个对角矩阵,用来表示特征与特征之间的关联性。

特征值与特征向量

一个矩阵的特征向量表示在乘以这个矩阵后只发生长度变化而不发生方向变化的向量,而特征值是这些向量乘以矩阵后的变化的程度。因此,求矩阵的特征向量,本质上是将矩阵分解为相互独立正交的向量,而特征值是这些向量对于矩阵本身影响的重要程度(或者说是这个特征向量能代表矩阵的能力)

主成分分析的原理

主成分分析是利用协方差矩阵的特征值与对应的特征向量,保留特征值大的特征向量,去掉对于一些对于数据没有大影响的维度,来进行数据降维的方法。其步骤主要有四步:
1、对数据进行标准化处理,使每个特征均值为0,方差为1
2、求特征矩阵的协方差矩阵cov
3、求cov矩阵的特征值与特征向量,去除特征值过小的特征向量,得到修剪后的向量组P
4、将修剪过后的向量与原来的特征向量相乘Y=XP,得到降维后的数据

python实现

import numpy as np
X=np.array([[-1,1,3],[5,5,4],[3,2,2]])
k=2
n_sample,n_feature=X.shape#得到样本数和特征数
    #求平均值,标准差,矩阵标准化
ave=np.mean(X,0)
X=X-ave
for i in range(n_feature):
    s=np.std(X[:,i])
    X[:,i]=X[:,i]/s
#计算协方差矩阵
cov=np.dot(X.T,X)/(n_sample-1)
#求特征值
vals,vecs=np.linalg.eig(cov)
#找出最大特征值与特征向量
sum=sum(vals)
#得到主成分
p=np.array(vecs[:,0:k])
for j in range(k):
    for i in range(n_feature):
        if vals[i]==np.max(vals):
            a=i
    print(vals[a]/sum)
    print(vecs[:,a])
    vals[a]=0
#计算降维后的矩阵
y=np.dot(X,p)

k的值为保留的维数,最后的结果为
0.7729122102088408(第一个维度的特征值)
[-0.56681041 -0.65559717 -0.49891713]
0.22708778979115923(第二个维度的特征值)
[-0.61186447 -0.07053338 0.78781147]
修剪过后的特征矩阵为
[[ 1.40029819 0.88680196]
[-2.1170043 0.21392828]
[ 0.71670611 -1.10073025]]
可以看出减少了一个特征,且最后一个特征的影响力度只在10^-17这个数量级。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!