前几周,我们已经接触到了许多监督学习算法:线性回归,逻辑回归,支持向量机,此外神经网络也可用于处理监督学习的问题。本周将开始学习无监督学习算法:聚类算法和降维算法。
聚类
聚类的目标是将一系列无标签的训练数据,输入到算法中,找到数据的内在结构。比如将下图的两簇数据分别圈出来的算法,就是一个聚类算法。
聚类的应用:
市场分割:对客户信息分类分别制定商业计划
相册分类:根据人脸相似度自动分类
K-均值迭代算法
K-均值是最常见的聚类算法,可以将数据聚类成不同的组。
代价函数和目标函数:
c1,c2,……,cm 来存储与第m个样本最近的聚类中心的索引值
𝜇1,𝜇2,……,𝜇𝑘 表示聚类中心
步骤
- 随机初始化所有的聚类中心点𝜇𝑘
条件:令这k个聚类中心为随机的k个样本。(k<m)
可能存在局部最优问题,需要多次运行 K-均值找代价函数最小的结果,但是当k很大时,多次运行可能没什么差别。 - 类别标定
找到 离 第m个样本 最近的 聚类中心k,并将该聚类中心的索引值存储在cm中。 - 移动聚类中心
对有相同索引值的样本进行平均计算找到一个质心作为新的聚类中心 - 重复2,3步骤直到聚类中心不变
聚类中心数k的选择
肘部法则:
y轴是代价函数计算出的误差,x轴是聚类中心数。当得到左边的曲线,选择“肘部”的聚类数比较合理;但当得到右边曲线时,往往需要从后续的工作要求等角度来思考。
降维
目的:
数据压缩:将冗余的数据从高维降至低维,可以加快算法速度。
数据可视化:特征太多时,往往不能够可视化,降低到一二三维就可以显示出来。
主成分分析法(PCA)
主成分分析法是最常见的降维算法。在 PCA 中,我们要做的是找到一个方向向量,当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度(如右图)。投射误差最小保证了数据的特性损失最小。
步骤
- 均值归一化(特征缩放)
计算出所有特征的均值𝜇𝑗,然后令 𝑥𝑗 = 𝑥𝑗 − 𝜇𝑗。如果特征是在不同的数量级上,我们还需要将其除以方差σ² - 计算协方差矩阵Covariance Matrix
- 利用奇异值分解来计算协方差矩阵𝛴的特征向量
奇异值分解在MATLAB的工具函数为: [U, S, V]= svd(𝛴)
解出后,U是一个与数据之间具有最小投射误差的方向向量构成的矩阵。要将数据降至𝑘维,我们只需要从U中选取前𝑘列向量,获得一个𝑛 × 𝑘维度的矩阵,我们用𝑈𝑟𝑒𝑑𝑢𝑐𝑒表示。 - 计算k维的新特征向量z
选择主成分k的数量
我们希望在投射的平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的𝑘值。
投射的平均均方误差与训练集方差的比例:
如果我们希望这个比例小于1%,就意味着原本数据的偏差有 99%都保留下来了。
方法1:
先令𝑘 = 1,运行PCA,获得𝑈𝑟𝑒𝑑𝑢𝑐𝑒和𝑧,然后计算该比例是否小于1%。不满足条件再令𝑘=2,如此类推,直到找到可以使得比例小于 1%的最小𝑘值。
方法2:
奇异值分解中, [U, S, V] = svd(𝛴)。其中S是由特征值组成的对角矩阵,可以使用矩阵S来计算投射的平均均方误差与训练集方差的比例:
重建原始数据
在压缩过数据后,我们可以采用如下方法来近似地获得原有的特征:
PCA应用常见的错误
- PCA可以通过降维减少特征数来解决过拟合问题吗?
答:这样做非常不好,不如尝试正则化处理。
原因在于主要成分分析只是近似地丢弃掉一些特征,它不考虑与结果有关的特征变量,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。 - 默认地将PCA作为学习过程中的一部分
最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。