PCA(Principal components analysis)也称主成分分析,是机器学习中降维的一种方法
为什么要降维
在真实的数据中有各种问题, PCA的思想是将n维特征映射到m维上(m<n)
1、如多余的数据,商店的客流量与营业额,很明显这两组的数据相关度比较高
,简单的理解就是把上述客流量与营业额合并成一个维度
2、由于信道不理想的,怎么滤去传输过程中的噪音
本文将以一个2维数据来说明PCA的计算过程,PCA的具体步骤
1、求平均值(dataAvg)
2、求每个值与平均值的差(dataAdjust)
3、求协方差矩阵
4、求协方差矩阵的特征值与特征向量
可以参考,机器学习(3.2)--PCA降维鸢尾花数据降维演示
为什么要降维
在真实的数据中有各种问题, PCA的思想是将n维特征映射到m维上(m<n)
1、如多余的数据,商店的客流量与营业额,很明显这两组的数据相关度比较高
,简单的理解就是把上述客流量与营业额合并成一个维度
2、由于信道不理想的,怎么滤去传输过程中的噪音
,简单的理解就是减少特征数
本文将以一个2维数据来说明PCA的计算过程,PCA的具体步骤
1、求平均值(dataAvg)
2、求每个值与平均值的差(dataAdjust)
3、求协方差矩阵
4、求协方差矩阵的特征值与特征向量
5、将特征值从大到小排序,选择最大的M个,取的这M个特征向量。
同时另一个实验性的例子通过鸢尾花的特征作为数据,来查看降维后的效果
点击查看 机器学习(3.2)--PCA降维鸢尾花数据降维演示
# -*- coding:utf-8 -*-
import numpy as np
#建立十个样本的二维数组
data=[[2.5,2.4] ,[0.5,0.7] ,[2.2,2.9] ,[1.9,2.2] ,[3.1,3.0]
,[2.3,2.7] ,[2,1.6] ,[1,1.1] ,[1.5,1.6] ,[1.1,0.9]]
data=np.array(data).astype(np.float)
#1、求平均值(dataAvg)
dataAvg=np.average(data,axis=0)# x的均值是1.81,y的均值是1.91
#print(dataAvg)
#2、求每个值与平均值的差(dataAdjust)
dataAdjust=data-dataAvg# X-avg(x) 与y-avg(y)的值
#print(dataAdjust)
#3、求协方差矩阵
#计算任意两组数据协方差函数,
def covariance(getDataAdjust,index1,index2):
x=getDataAdjust[:,index1:index1+1]
y=getDataAdjust[:,index2:index2+1]
n=x.shape[0]
return (x*y).sum()/(n-1)
#计算协方差矩阵,
'''
在二维数据中这个矩阵就是
[[cov(x,x),cov(x,y)]
,[cov(y,x),cov(y,y)]]
同理在三维数据这个矩阵就是
[[cov(x,x),cov(x,y),cov(x,z)]
,[cov(y,x),cov(y,y),cov(y,z)
,[cov(z,x),cov(z,y),cov(z,z)
]]
'''
CovMatrix=[[covariance(dataAdjust,0,0),covariance(dataAdjust,0,1)]
,[covariance(dataAdjust,1,0),covariance(dataAdjust,1,1)]]
print('协方差矩阵为:')
print(CovMatrix)
#4、求协方差矩阵的特征值与特征向量,如果不知道什么是特征值与特征向量,可以查查线性代数
e1,e2 = np.linalg.eig(CovMatrix)
print('------------------------')
print('协方差矩阵的特征值:')
print(e1) #[0.0490834 1.28402771] ,这里的两个值,当要降到M维(本例只能降到1维),即取最大的值,这里是1.28402771
print('------------------------')
print('协方差矩阵的特征向量:')
print(e2)
#5、将特征值从大到小排序,选择最大的M个,取的这M个特征向量。这里只是取数,没有计算步骤
#[[-0.73517866 -0.6778734 ] 因数为上述特征值最大的取1.28402771,为第2个,所以,这里我们取每个元素数组的第2个,即e2[:,1:]
# [ 0.6778734 -0.73517866]]
#取出的值应该是[-0.6778734, -0.73517866]
#做矩阵乘法,将dataAdjust 乘以上述 e2[:,1:] 得出的结果即为降维后的值
finalDataX=np.matmul(dataAdjust,e2[:,1:])
print('------------------------')
print('降维后的数据:')
print(finalDataX)
本例使用二维数据,降维前,降维后都是数字,很多东西并不是直观,
可以参考,机器学习(3.2)--PCA降维鸢尾花数据降维演示