机器学习-python编写主成分分析(PCA)数据降维

来源:互联网 发布:无人机自动降落算法 编辑:程序博客网 时间:2024/06/11 03:46

代码及数据集下载:PCA
在机器学习之前通常需要对数据进行降维处理,有以下原因:

  • 使得数据集更易使用
  • 降低很多算法的计算开销
  • 去除噪声
  • 使得结果易懂

这里讲的降维方法为主成分分析法(PCA),将数据从原来的坐标系转换到新的坐标系,新的坐标系的选择是由数据本身决定的。第一个坐标轴选择的是原始数据中方差最大的方向,第二个新最标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为想要保留原始数据特征的数目。我们会发现,大部分方差都包含在最前面的几个新的坐标轴中,因此我们忽略余下的方差小的最标轴。方差越大代表该特征包含的信息越多,代表数据的差异。PCA中假设数据是不相关的。

PCA的原理及流程如下:
- 假设变换后的坐标系为W={w1,w2,..,wd},为一组标准正交基。
- m个数据集为X={x1,x2,...,xm}
- 对m个数据的每个特征进行中心化,使得ixi=0
- 数据的协方差矩阵为ixixTi。协方差矩阵数学知识可以看关于协方差矩阵在机器学习中的理解
- 选取方差最大方向等价于选取协方差矩阵最大的特征值及其特征向量。取协方差矩阵前d个最大的特征值及其对应的特征向量。
- 将特征向量排序后组成W矩阵。投影后的样本为WTxi

降维后的维数d选取方法:
1. 由用户事先指定d
2. 通过在d值不同的低维空间中对k近邻分类器(或其他开销较小的学习器)进行交叉验证来选取较好的d值。
3. 从重构的角度设置一个重构阈值,例如t=95%,然后选取使下式成立的最小的d值。d为原数据维数。

i=1dλii=1dλit

伪代码:

输入:样本集X={x1,x2,...,xm};低维空间维度d
输出:投影矩阵W={w1,w2,..,wd}
过程:
1.对样本进行中心化
2.计算协方差矩阵XXT
3.对协方差矩阵进行特征值分解XXT
4.取最大的d个特征值及其对应的特征向量组成W={w1,w2,..,wd}
python代码为

import numpy as npimport matplotlib.pyplot as pltdef loadData(filename,delim = '\t'):    with open(filename) as fr:        stringArr = [line.strip().split(delim) for line in fr.readlines()]        dataArr = [list(map(float,line)) for line in stringArr]    return np.mat(dataArr)def pca(dataSet,topNfeat = 99999999):    dataMean = np.mean(dataSet,axis = 0)    meanRemoved = dataSet - dataMean    covMat = np.cov(meanRemoved,rowvar=0)    eigVals,eigVec = np.linalg.eig(np.mat(covMat))    eigValInd = np.argsort(eigVals)    eigValInd = eigValInd[:-(topNfeat+1):-1]    redEigVects = eigVec[:,eigValInd]    lowDDataMat = meanRemoved * np.mat(redEigVects)    reconMat = lowDDataMat * redEigVects.T + dataMean    return lowDDataMat,reconMatdata = loadData('testSet.txt')lowdata,recondta = pca(data,1)fig = plt.figure(0)ax = fig.add_subplot(111)ax.scatter(data[:,0],data[:,1],s=90,marker='^',c='r')ax.scatter(recondta[:,0],recondta[:,1],s=30,marker='o',c='b')plt.show()
阅读全文
0 0