如果人类适应了三维,去掉一个维度,进入了二维世界,那么人类就会因为缺少了原来所适应的一个维度,而无法生存。 ——《三体》
在许多科幻电影中,有许多降维的例子。在《十万个冷笑话2》(可能只有萌新看过)中,大boss将主角降维到二维,就成了纸片人,进而失去了战斗能力;降维到一维,就变成了线条,这就是降维打击。
说直白点,降维就是将维度降低。在机器学习中,降维常常用来做数据的预处理。为什么要对数据进行降维了?那来从数据本身说起。
- 大数据时代,数据冗余,维度高。例如个人用户信息,存储了身份证,同时也存储了生日,就造成了冗余。
- 数据维度有相关性。例如,人脸头像具有对称性,去掉一般的像素点也是没有太大问题的。
- 数据有噪声。噪声对学习会产生干扰,去掉噪声可以提高算法的精度。
那如何进行降维了?难道要随机去掉一些维度吗?答案是否定的。直接去掉维度会导致数据信息的大量确实。主成分分析(PCA)技术可以尽量保证数据信息少量减小的情况下,进行维度的缩减。
PCA原理
首先看下图,这是一个二维数据,有三个类别(不同颜色表示)。我们希望将其降到一维,那是按u1方向投影还是按u2方向呢。明显可以看出,u1比u2好。
推导
为什么说u1比u2好呢?我们可以基于两点进行解释。
- 样本点到这个直线的距离足够近。
- 样本点在这个直线上的投影能尽可能的分开。
基于这两个原则,进行公式推导(这里进行省略),可以得到下面公式。XXT为样本的协方差矩阵。
流程
根据公式可以得到PCA的流程:
- 去除平均值
- 计算协方差矩阵
- 计算协方差矩阵的特征值和特征向量
- 特征值从大到小排序
- 保留最上面的N个特征向量
- 将数据转换到N个特征向量构建的新空间
PCA代码
数据情况
首先编写代码读入数据,可以看出其为二维数据。
from numpy import *
def loadDataSet(filename):
dataMat = []
fr = open(filename)
for line in fr.readlines():
curLine = line.strip().split('\t')
fltLine = list(map(float,curLine))
dataMat.append(fltLine)
return mat(dataMat)
算法代码
通过上述的算法流程,对代码进行编写,最后可视化降维后的结果。
def pca(dataMat, topNfeat=9999999):
meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals
covMat = cov(meanRemoved, rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat))
eigValInd = argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat+1):-1]
redEigVects = eigVects[:,eigValInd]
lowDataMat = meanRemoved * redEigVects
reconMat = (lowDataMat * redEigVects.T) + meanVals
return lowDataMat, reconMat
算法优缺点
- 优点:降低数据复杂度
- 缺点:有可能损失有用信息
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=25flb1mm7rtws