python学习笔记(32)----PCA主成分分析——降维

主成分分析法本质上是从一个坐标系转移到另外一个坐标系,但是我们只取出K个相对重要的方向。

假设是二维数据,我们需要找到一个轴,使得样本空间所有点映射到这个轴上面后,方差最大(方差越大,信息量也就越大)

1.数据中心化,就是将所有的杨丽均值归0(样本分布没有发生改版,就是样本在每一个维度均值为0)
数据中心化后,均值为0 ,就简化了方差求解

2.此时,我们可以通过梯度上升来求解w使得方差最大,求出w后,称为第一主成分,此时,数据进行改变,把数据在第一主成分上的分量去掉,在新的数据上继续求出下一主成分,再将数据投影
(这里也可以通过求协方差,然后对协方差矩阵做特征分解,选则最大的K个特征值对应的特征向量,再将数据投影到选取的特征向量上)代码还是用协方差矩阵算了,np中已经封装好了协方差,特征值特征向量的求法

import numpy as np
import matplotlib.pyplot as plt

X=np.empty((100,2))
X[:,0]=np.random.uniform(0,100,100)
X[:,1]=0.75*X[:,0]+3+np.random.normal(0,10,100)
plt.scatter(X[:,0],X[:,1])

#1.去均值,数据中心化
def demean(data):
    # 按列求平均,即各个特征的平均
    meanVal = np.mean(data, axis=0)
    data_demean = data - meanVal
    return data_demean, meanVal
data_demean,meanVal=demean(X)
'''
mean() 函数定义:
numpy.mean(a, axis, dtype, out,keepdims )

mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:

    axis 不设置值,对 m*n 个数求均值,返回一个实数
    axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
    axis =1 :压缩列,对各行求均值,返回 m *1 矩阵

'''
#2.协方差
covmat=np.cov(data_demean,rowvar=0)
#这里rowvar=0是数据一行代表一个样本

#3.协方差特征值和特征向量
eigVals,eigVects=np.linalg.eig(np.mat(covmat))
print('特征值:',eigVals)
print('特征向量:',eigVects)

#对特征值排序并取出K个重要的特征
eigvalindice=np.argsort(eigVals)   #对特征值从小到大进行排序

k=1  #取出K个最大的特征值的下标
n_eigvalindice=eigvalindice[-1:-(k+1):-1]
#这里二个:,第一个是从-1取到-(k+1)
#第二个是从后往前取

#最大的k个 特征值对应的特征向量
n_eigvect=eigVects[:,n_eigvalindice]
print(n_eigvect)

#4.将高纬数据转换到低纬
lowDataMat=data_demean*n_eigvect
print(lowDataMat)

#5.降维后的数据重构

reconMat=lowDataMat*n_eigvect.T+meanVal
print(reconMat)
plt.scatter(np.array(reconMat[:,0]),np.array(reconMat[:,1]))
plt.show()

python学习笔记(32)----PCA主成分分析——降维_第1张图片

你可能感兴趣的:(python学习笔记(32)----PCA主成分分析——降维)