代码及数据集下载: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 为原数据维数。
伪代码:
输入:样本集 X={x1,x2,...,xm} ;低维空间维度 d′
输出:投影矩阵 W={w1,w2,..,wd′}
过程:
1.对样本进行中心化
2.计算协方差矩阵 XXT
3.对协方差矩阵进行特征值分解 XXT
4.取最大的 d′ 个特征值及其对应的特征向量组成 W={w1,w2,..,wd′}
python代码为
import numpy as np
import matplotlib.pyplot as plt
def 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,reconMat
data = 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()