机器学习-Ng-week8-聚类和降维
2018-03-03 17:08
260 查看
一、聚类
(1)无监督学习
聚类是我们第一个介绍的无监督学习算法,没有给计算机提供标签,我们拿到的数据是没有标签的。之前我们的正负样本都是根据颜色的 不同区分,或者多个类的时候,我们的样本的样式是不一样的,下图是无监督学习的样本:很显然,这些数据都是不存在标签y的。在非监督学习中,我们需要乙烯类的无标签的训练数据,输入到一个算法中,然后我们告诉我们这个算法找找这个数据的内在结构,比如说上图吧,分成两个分开的点集(称为簇)。聚类算法用于下面的情况:
比如说市场分割,针对不同类型的客户分别推销不同的销售产品或者分别提供更合适的服务;或者是用于社交网络;或者适用于计算机集群组织,或者更好的管理数据中心。如果你知道在这个数据中心里面,那些计算机经常协同工作,那么你可以重新的分配资源,重新布局网络。
(2)k-均值-最普及的聚类算法
算法接受一个未标记的数据集,然后将数据聚类成不同的组。k-均值是一个迭代算法,假设我们想要将数据聚类成n个组,其方法为:step1:选择k个随机的点,称为聚类中心(cluster centroids);step2:对于数据集的每一个数据,按照距离k个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类;step3:计算每一组的平均值,将该组地中心点移动到平均值的位置;重复上面的三个操作,知道中心点不变了!!迭代1次:迭代3次:
迭代10次:
用
来表示聚类中心,用
来存储与第i个实例数据最近的聚类中心的索引,下面是k-均值算法的伪代码:
第一步,第一个for循环,对于每一个样例i,计算其应该属于的类。第二个for循环是聚类中心的移动,即对于每一个类k,重新计算该类的质心。
(3)优化目标
k-均值的最小化问题,最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此k-均值的代价函数(畸变函数distortion function):,其中
代表的是与
最近的聚类中心点。我们的优化目标是找到使得代价函数最小的
和
上面的那个迭代算法,很明显第一个循环是为了减少
的代价,第二个循环是为了减少
的代价。
(4)随机初始化-聚类中心点
step1:选择k<m,即聚类中心点的个数要小于所有的训练集实例的数量;step2:随机选择k个训练实例,然后令K个聚类中心分别于这K个训练实例相等。K-均值的一个问题在于,他有可能会停留在一个局部最小值点,而这取决于初始化的情况。为了避免这样的情况,我们需要多次随机初始化,最后比较多次运行k-均值的结果,选择代价函数最小的结果。这种方法在K较小的时候(2-10)是可行的,但是如果K较大,这样做就不会那么明显地改善。(5)选择聚类数目
肘部法则:我们用一个聚类来运行K均值聚类方法,这就意味着,所有的数据都会到一个聚类里,然后计算成本函数或者计算畸变函数J。下图你可以很清晰的看出,3到达了一个肘点,3之后J下降的很慢,所以我们选择3为我们的K值。二、降维
第二种类型的无监督学习问题,称为降维。(1)动机——数据压缩
数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或者磁盘空间,但它也加快了我们的学习算法。假设我们存在两个特征,
表示长度,用厘米表示,
用英寸表示。这就是一种冗余,这两个都是长度的测量,可以将特征从2维降低到1维。(将2维的数据投影到1维的直线上)
将数据从三维降低到2维:我们将一个三维的特征向量将至一个二维的特征向量。过程类似于上面,我们将三维向量映射到一个二维的平面上,强迫使得所有的数据都在同一个平面上,降至二维的特征向量。
(2)动机——数据可视化
如果一个有关于很多的国家的数据,但是每个向量都存在50个特征,将这50个特征的数据可视化是不可能的,使用降维的方法降至2维,便可以进行可视化!(3)主成分分析法-PCA
主成分分析是最常见的降维算法。在PCA中,我们希望找到一个方向向量。当我们把所有的数据都投射到该向量上,我们希望投射平均均方误差尽可能的小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂直线的长度。问题是要将n维的数据降低至k维,目标是找到向量
使得总的投射误差最小。主成分分析和线性的比较:主成分分析和线性回归是两种不同的算法。主成分分析最小化的是投射误差,但是线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不做任何预测。
上面的这个图左边的是线性回归的误差(垂直于横轴投影),右边则是PCA的误差(垂直于红色的投影线)PAC将n个特征降维到k个,可以用来进行数据压缩。图像处理领域的KL变换使用PCA做图像压缩。但PCA要保证降维后,数据的特征损失最小。
PAC的优点:对数据进行降维处理,我们可对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维,同时最大程度的保持了原有的数据的信息;完全无参数限制。无需人工的干预,最后的结果依赖于数据本身(也可以当做缺点,尽管我们知道关于数据的先验知识,但却无法通过参数化等方法对处理的过程进行干预,可能效果不佳)。
(4)PCA算法-n维降至k维
step1:均值归一化,我们需要计算出所有的特征的均值,然后令。如果特征是在不同的数量级上,我们还需要将其除以标准差
。step2:计算协方差矩阵(covariance matrix)Sigma-
:
。step3:计算协方差矩阵
的特征向量(eigenvectors):在MATLAB里面我们采用奇异值分解(singular value decomposition)来求解:[U,S,V]=svd(sigma)。
,
上式的U是一个具有与数据之间最小投影误差的方向向量构成的矩阵。如果我们希望将数据从n维降低到k维,我们只需要从U中选取前K个向量,得到一个n*k维的矩阵称为
,然后通过如下的计算获得要求的新特征向量
:
,很显然x是n*1的向量,结果得到的是一个K*1维的向量。算法:
,
,
,
(5)重建的压缩表示
给定,这可能100维,怎么回到原来的表示
,这可能是1000维的数组?PCA算法,我们可能有一个这样的样本,样本
。我们做的是,我们把这些样本投射到图中这个一维平面,然后现在我们需要只使用一个实数,比如
,指定这些点的位置后他们被投射到这一个三维曲面。给定一个点
,我们怎么能回去这个原始的二维空间呢?x是2维,z为1维,
,相反的方程为:
。
。
如你所知,这是与原始数据相当相似。所以,这就是你从低维表示Z回到未压缩的表示。我们把上述的过程称为重建原始数据。
(6)选择主成分数量
平均均方误差:训练集的方差是:
——距离零向量的距离。
我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的K值。如果我们希望这个比例小于1%,就意味着原本数据的偏差有99%都保留了下来,如果我们选择保留95%的偏差,便能非常显著地降低模型中特征的维度了。我们可以先令K=1,然后进行主成分分析,获得
和z,然后计算比例是否小于1%,如果不是的话,在令K=2,如此类推,直到可以找到使得比例小于1%的最小的K值。(原因是各个特征之间通常情况存在某种相关性)。还有一些更好的方式选择K,当MATLAB中调用svd函数的时候,我们获得三个参数:[U,S,V]=svd(sigma)。
其中s是一个n*n的矩阵,只有对角线上有值,而其他单元都是0,我们可以使用这个矩阵来计算平均均方误差与训练集方差的比例:
(7)pca运用的一些建议
假设我们针对一张100*100像素的图片进行某种计算机视觉的机器学习,即总共10000个特征。step1:运用PCA将数据进行压缩到1000个特征;step2:然后对训练集运行学习算法;step3:在预测的时候,采用之前学习而来的将输入的特征x转换成特征向量z,然后在进行预测。
注意:如果我们有交叉验证集合测试集,也采用对训练集学习而来的
。
错误使用PCA的情况:1.常见错误是使用主成分分析的情况:用于减少过拟合(减少了特征的数量)。这样做非常的不好,不如尝试正则化处理,原因在于主成分分析只是近似丢掉一些特征,它并不考虑任何与结果遍历有关的信息,因此可能会丢失非常重要的特征。然而进行正则化的时候,我们会考虑到结果变量,不会丢掉重要的数据。2.默认将PCA作为学习过程的一部分,虽然很多时候这个很有效果,但是最好还是从原始的特征开始,只在有必要的时候(内存不足,算法运行很慢)才考虑主成分分析。
相关文章推荐
- Andrew NG 机器学习 笔记-week8-聚类(Clustering)
- 机器学习公开课笔记(8):k-means聚类和PCA降维
- 机器学习公开课笔记(8):k-means聚类和PCA降维
- 机器学习-coursera-exercise7-降维和聚类
- 机器学习---分类、回归、聚类、降维的区别
- 菜鸟入门_Python_机器学习(4)_PCA和MDA降维和聚类
- Stanford机器学习笔记-9. 聚类(Clustering)
- 机器学习系列:(七)用PCA降维
- 机器学习:降维方法
- 【机器学习】关于t-sne:降维、可视化
- 机器学习第六课:聚类
- Ng在coursera上的机器学习公开课——zai总结(2)_Octave Tutorial
- 机器学习之层次聚类及代码示例
- 机器学习(聚类)
- 机器学习-特征选择(降维) 线性判别式分析(LDA)
- 机器学习理论与实战(十)K均值聚类和二分K均值聚类
- 机器学习-->特征降维方法总结
- Andrew Ng机器学习笔记week8 无监督学习(聚类、PCA)
- 机器学习-NG-week1&week2-线性回归
- 【机器学习】聚类结果评价指标及python3代码实现