1.1、主成分分析( Principal Component Analysis, PCA)。
在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复, 重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。
那么,我们如何得到这些包含最大差异性的主成分方向呢?事实上,通过计算数据矩阵的协方差矩阵,然后得到协方差矩阵的特征值及特征向量,选择特征值最大(也即包含方差最大)的N个特征所对应的特征向量组成的矩阵,我们就可以将数据矩阵转换到新的空间当中,实现数据特征的降维(N维)。
既然,说到了协方差矩阵,那么这里就简单说一下方差和协方差之间的关系,首先看一下均值,方差和协方差的计算公式: 由上面的公式,我们可以得到一下两点区别:
(1)方差的计算公式,我们知道方差的计算是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征。可以说方差就是协方差的特殊情况。
(2)方差和协方差的除数是n-1
,这样是为了得到方差和协方差的无偏估计。具体推导过程可以参见博文:http://blog.csdn.net/maoersong/article/details/21823397
def loadDataSet(fileName, delim='\t'):
fr = open(fileName)
datArr = []
for line in fr.readlines():
curLine = line.strip().split(delim)
curList = []
for cl in curLine:
curList.append(a)
datArr.append(curList)
return mat(datArr)
1.2.2、pca算法实现
def pca(dataMat, topNfeat=100):
'''
pca特征维度压缩函数
:param dataMat: 数据集矩阵
:param topNfeat: 需要保留的特征维度
:return:
'''
# 按列计算平均值
meanVals = mean(dataMat, axis=0)
# 计算协方差矩阵
meanRemoved = dataMat - meanVals # remove mean
covMat = cov(meanRemoved, rowvar=0)
# 特征值,特征向量
eigVals, eigVects = linalg.eig(mat(covMat))
print(eigVals)
eigValInd = argsort(eigVals) # sort, sort goes smallest to largest
# 降维
eigValInd = eigValInd[:-(topNfeat + 1):-1] # cut off unwanted dimensions
redEigVects = eigVects[:, eigValInd] # reorganize eig vects largest to smallest
# 压缩后的矩阵
lowDDataMat = meanRemoved * redEigVects # transform data into new dimensions
# 原始数据被重构后
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
1.3、示例:PCA对半导体数据进行降维
1.3.1、处理缺失数据
def replaceNanWithMean(filename='secom.data', delim=' '):
datMat = loadDataSet(filename, delim)
numFeat = shape(datMat)[1]
for i in range(numFeat):
meanVal = mean(datMat[nonzero(~isnan(datMat[:, i].A))[0], i]) # values that are not NaN (a number)
datMat[nonzero(isnan(datMat[:, i].A))[0], i] = meanVal # set NaN values to mean
return datMat