赞
踩
PCA实现的伪代码:
在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的,第一个坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且有最大方差的方向。
1.去除平均值,(这种变换称为中心化(centralization))
2.计算协方差矩阵
3.计算协方差矩阵的特征值和特征向量
4.将特征值从大到小排序
5.保留最上面的N个特征向量
6.将数据转换到N个特征向量构建的空间中
"""
函数说明:PCA特征维度压缩函数
Parameters:
dataMat - 数据集数据
topNfeat - 需要保留的特征维度,即要压缩成的维度数,默认4096
Returns:
lowDDataMat - 压缩后的数据矩阵
reconMat - 压缩后的数据矩阵反构出原始数据矩阵
Modify:
2018-08-07
"""
def pca(dataMat, topNfeat=4096):
# 求矩阵每一列的均值
meanVals = np.mean(dataMat, axis=0)
# 数据矩阵每一列特征减去该列特征均值
meanRemoved = dataMat - meanVals
# 计算协方差矩阵,处以n-1是为了得到协方差的无偏估计
# cov(x, 0) = cov(x)除数是n-1(n为样本个数)
# cov(x, 1)除数是n
covMat = np.cov(meanRemoved, rowvar=0)
# 计算协方差矩阵的特征值及对应的特征向量
# 均保存在相应的矩阵中
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
# sort():对特征值矩阵排序(由小到大)
# argsort():对特征矩阵进行由小到大排序,返回对应排序后的索引
eigValInd = np.argsort(eigVals)
# 从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引
eigValInd = eigValInd[: -(topNfeat+1): -1]
# 将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵
redEigVects = eigVects[:, eigValInd]
# 将去除均值后的矩阵*压缩矩阵,转换到新的空间,使维度降低为N
lowDDataMat = meanRemoved * redEigVects
# 利用降维后的矩阵反构出原数据矩阵(用作测试,可跟未压缩的原矩阵比对)
# 此处用转置和逆的结果一样redEigVects.I
reconMat = (lowDDataMat * redEigVects.T) + meanVals
print(reconMat)
# 返回压缩后的数据矩阵及该矩阵反构出原始数据矩阵
return lowDDataMat, reconMat
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。