一,降维技术
1,降维的作用
- 使得数据集更易使用。
- 降低算法的计算开销。
- 去除噪声。
- 使得结果易懂。
2,降维技术的方法
- PCA
- 因子分析:我们假设观察数据的生成中有一些观测不到的隐变量,观测数据是这些隐变量和噪声的线性组合。隐变量的数目少的话就可以通过隐变量实现降维。
- 独立成分分析:类似因子分析,它假设观察数据是由隐含的几个数据源生成(或者说是从某几种数据分布中采样生成)。数据源的数目少的话就可以实现降维。
二,PCA
1,PCA概述
PCA基本思想:第一个主成分是从数据差异性最大(即方差最大)的方向提取出来的;第二个主成分来源与数据差异性次大的方向,并且该方向与第一个主成分方向正交;该过程重复进行,重复次数为原始数据特征的数目。通过忽略最后几个无法体现数据差异性的主成分达到降维的目的。
PCA的原理:最近重构性和最大可分性,通过选取原始数据协方差矩阵的前k大的特征值的特征向量组成线性变换矩阵来对原始数据进行降维。
- 优点:降低数据的复杂度,识别最重要的多个特征。
- 缺点:不一定需要,且可能损失有用信息。
- 使用数据类型:数值型数据。
2,用numpy实现PCA
(1)PCA核心步骤
- 去除平均值(即样本中心化)。
- 计算样本数据的协方差矩阵XXT,X是
m∗n 维的矩阵,其中n为样本数,m为每个样本的特特征数。 - 计算协方差矩阵的特征值和特征向量。
- 将特征值按从大到小的顺序排序。
- 保留前N个特征值对应的特征向量。
- 将数据转换到上述前N个特征向量构建的新空间中。
(2)用Python实现PCA
from numpy import *
import matplotlib
import matplotlib.pyplot as plt
def loadDataSet(filename,delim='\t'):
fr = open(filename)
stringAttr = [line.strip().split(delim) for line in fr.readlines()]
datAttr = [[float(x) for x in line] for line in stringAttr]
return mat(datAttr)
def pca(dataSet,topNfeat=9999):
meanVals = mean(dataSet,axis=0)
meanRemoved = dataSet - meanVals
covMat = cov(meanRemoved,rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValsInd = argsort(eigVals)
eigValsInd = eigValsInd[:-(topNfeat+1):-1]
redEigVects = eigVects[:,eigValsInd]
lowDDataMat = meanRemoved*redEigVects
reconMat = (lowDDataMat*redEigVects.T)+meanVals
return lowDDataMat,reconMat
def plotData(dataSet,reconMat):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataSet[:,0].flatten().A[0],dataSet[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0], marker='o', s=50,c='red')
plt.show()
原始数据(蓝色)和降维数据的重构数据(红色)效果图:
(3)一般在处理前需要用平均值替换NaN(Not a Number)
def replaceNanWithMean():
datMat = loadDataSet('secom.data',' ')
numFeat = shape(datMat)[1]
for i in range(numFeat):
meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i])
datMat[nonzero(isnan(datMat[:,i].A))[0],i]=meanVal
return datMat
(4)总结
PCA可以从数据中识别出其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面的坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。