【Machine Learning】笔记:无监督学习

来源:互联网 发布:java学生管理系统集合 编辑:程序博客网 时间:2024/05/17 04:36

课程来自 Coursera 上 Andrew Ng 的 machine learning第8周的内容。

Clustering

K-均值聚类算法

比如要分成两类,就先随便选两个 cluster centroid 聚类中心,整个聚类算法是一个迭代过程,它分为两步:

  • cluster assignment,聚类分配
  • move centroid,移动聚类中心

具体来说,随便分配 K 个聚类中心,先遍历一遍所有的数据点,看离哪个聚类中心最近,就划分到哪个聚类中,然后,遍历 K 个聚类,将聚类中心重设为该聚类当前所有数据点的中心(均值)。再不断重复上述步骤。

小问题:如果在某次分配之后,某个聚类中没有任何数据点,那该怎么办?
一般来说,这样就直接去掉该聚类,最后会得到 K1 个聚类,这样的做法更加常见。但如果一定要分出 K 个聚类,那就再随机生成一个聚类中心。

如果数据比较集中或本身没有显著聚成块,那也没事,仍然可以划分出需要的聚类。

最优化目标

监督学习都有优化目标,那无监督学习有吗?自然是有的。

先明确一些记号。c(i) 表示第 i 个数据点所在的聚类编号,比如 c(3)=5 表示第三个数据点被分入 5 号聚类。uk 表示第 k 号聚类的聚类中心。uc(i) 表示第 i 个数据点所在聚类的聚类中心,比如 uc(3) 就表示 5 号聚类的聚类中心,因为c(3)=5 表示5号聚类。

聚类算法的优化目标是:

minc(1),,c(m),u1,,uKJ(c(1),,c(m),u1,,uK)

其中,

J(c(1),,c(m),u1,,uK)=1mi=1mx(i)uc(i)2

该代价函数有时也叫 distortion cost function(失真代价函数)。

在定义了 distortion cost function 之后,回过头看迭代那两步,其实第一步就是保持 u1,,uK 不变,只改变 c(1),,c(m) 来最小化 distortion cost function,而第二步就是改变 u1,,uK 来最小化它。所以,distortion cost function 一定是随着迭代次数的增加而下降的

随机初始化

在最开始的时候,该如何随机选取一些点作为 cluster centroid 呢?
K>m 时,可以从 m 个数据点中随机挑选出 K 个,然后将它们作为初试的 K 个聚类的 cluster centroid,这种方法是最推荐的做法。

不同的初始化形式,可能会得到不同的最终结果,可能会陷入局部最优解。那该怎么办呢?
一般的做法是,多尝试几次随机初始化,并执行算法,比较它们最终得到的 distortion cost function,选择最小的那个。事实证明,当 K 不是很大时,比如在 2 到 10 之间,多尝试几次随机初始化,可以得到比较好的结果,但 K 很大时,多试几次提升效果不大。

怎样选择 K

这个问题没有一个清晰的答案。一般来说,比较好的办法仍然是通过可视化等手段来手动选择。以下是两个比较常用的办法:

  • Elbow method(肘部法则),画出 JK 的增加而变化的图,一般这样的图必定是呈下降趋势的,通过观察,可以看出在某个 K 之后,它每一次的下降不再像之前那么多了(斜率绝对值突然变小了)。但常见情况是,画出的图很平滑,看不出哪里有 elbow,这时就无法根据它来作出判断了。但它仍不失为一个值得尝试的方法。
  • 一般来说,使用聚类算法是为了后续对数据的应用,那就可以看一下不同的聚类数目能对下游的应用产生多好的效果。从应用的角度来决定 K.

Dimensionality Reduction

Motivation

为什么要做维数缩减?有两个原因:

  • 为了数据压缩(data compression)。可能有高度相关的冗余的特征,做了数据压缩之后,可以减少特征数量,这样做既可以减少存储空间,又可以提高算法速度。
  • 为了可视化,如果降到二维或者三维,我们就可以画出来,来进行肉眼观察。

Principal Component Analysis

在使用 PCA 之前,通常需要先进行 mean normalization 和 feature scaling,使各个特征的均值为零,且数值在可比较的范围之内。
注意,PCA 和线性回归尽管看起来有一些相似,但它们要最小化的函数不同。一元线性回归要最小化的是预测值和实际值之间差距的平方和,而将二维数据降到一维的 PCA 要最小化的是点到直线的距离。

PCA 算法实现

首先对数据进行 mean normalization 和 feature scaling.
比如要把 x(i)R2 投影到一个最佳向量 u(1) 上,成为 z(i)R ,找出这样的最佳向量并不难,但证明它是最佳的过程很复杂,老师不作展开
n 维数据降为 k 维的具体过程如下:

  • 计算协方差矩阵 Σ=1mi=1n(x(i))(x(i))T,并将它存为 Matlab/Octave 中的 Sigma 变量,如果 m 个数据已经表示为 m×n 的矩阵 X 了,可以直接用 Sigma = (1/m)*X'*X; 来得到结果。
  • 计算 Σ 的特征值(eigenvectors),用 [U,S,V] = SVD(Sigma);,SVD 是进行奇异值分解(singular value decomposition)的函数,另外还有一个 eig() 函数也可以计算特征值,但 SVD() 更加稳定一些,对于计算的对象是协方差矩阵来说,因为它是对称正定(symmetric positive definite)的矩阵,两个函数得到的结果是一样的。执行之后的输出结果是三个矩阵,我们需要的是 U 矩阵,USigma 一样,都是 n×n的矩阵,U 的列向量,就是我们要求的 u(i),也就是要投影到的向量。
  • 因为我们要投影到 k 维,因此,只需取出 U 矩阵的前 ku(1),u(2),,u(k) 即可。
    接下来要找出 x(i) 对应的 z(i),先将上一步中取出的 k 个向量拼成新的 n×k 的矩阵 [u(1)u(2)u(k)],记为 Ureduce ,则有 z(i)=UTreducex(i).

如果用代码,就是:

Sigma = (1/m)*X'*X;[U,S,V] = SVD(Sigma);Ureduce = U(:,1:k);z = Ureduce'*x;

能把数据还原吗?

在经过了 z=UTreducex 之后,n 维数据变成了 k 维数据,那能近似地再把数据还原回去吗?
确实可以,可以用 xapprox=Ureducez 来还原,Ureduce 就是原来的 n×k 矩阵。这个过程,也叫作 reconstruction from compressed representation.

选择保留多少个主成份?

怎样选择保留主成份的个数 k?下面介绍一种常用的方法。
先定义两个量。Average squared projection error 平均平方映射误差,1mi=1mx(i)x(i)approx2,再定义 total variation in the data 为 1mi=1mx(i)2,一般来说,要可以选择最小的满足下面条件的 k

1mi=1mx(i)x(i)approx21mi=1mx(i)20.01

这个条件说明,99% 的特性被保留了。告诉别人选择了多少 k 的另一种说法是“选择保留多少的差异性”。当然,选择0.05(95%保留)或其他数值也完全可以。

如果 k 每增加 1,都去判断一下上面的等式,计算效率会很低。
当用 [U,S,V] = SVD(Sigma); 时,返回的 S 是一个 n×n 的对角矩阵,此时有 1mi=1mx(i)x(i)approx21mi=1mx(i)2=1i=1kSiii=1nSii,计算就十分方便。

PCA 给算法提速

PCA 可以给监督学习算法提速。如果输入数据的特征数太多,可以先将其降维。
但需要注意,降维所用的矩阵 Ureduce 只可以在训练集中被训练出来,而不能用到验证集的数据,因为它相当于也是一些参数,这些参数定义了从 xz 的映射。

PCA 的使用误区

老师讲了两个误区:

  • 很多人认为,降维之后,特征数减少了,这可以用来防止过拟合,这是不对的!因为它本质上只是丢弃了一些信息而已。就算它有用,最好还是用 regularization 来防止过拟合。
  • 在设计机器学习系统时,很多人会直接上来就进行一步 PCA,老师建议先试一下在原始数据上做,只有在学习算法很慢,或者很占用存储空间时,才考虑使用 PCA. 老师自己使用得比较频繁,一般都用来加速学习算法。
阅读全文
0 0
原创粉丝点击