编程作业放到了github上:coursera_machine_learning
1. K-Means聚类算法
这是这门课中的第一个非监督学习算法(unsupervised learning)。非监督学习在之前的课程中已经介绍过了,就是不给出数据
x
所对应于label
K-means就是一个聚类算法,其目的就是将一堆数据分到几个未知的类别中去。
1.1 算法过程
第一步:随机选择k个聚类中心(cluster centriods),如k=2
第二步:计算各样例点到这k个聚类中心的距离,让样例点属于距离自己近的那个聚类中心所属的类别。
第三步:重新决定聚类中心,为各类中所有样例的平均值
[重复第二步和第三步]
更新各样例所属类别更新聚类中心
总结一下,步骤如下:
随机初始化K个聚类中心
μ1,μ2,...,μK
重复{
for i = 1 to m: [Cluster Assignment Step]
c(i):= 距离 x(i) 最近的聚类中心的索引
for k = 1 to K: [Move Centroid Step]
μk:= 所有属于 k 类的样本点的平均值
}
和监督学习一样,K-means也有自己的cost function和优化目标:
很好的是,这个优化目标其实已经包含在了上述的分类步骤中了:
[Cluster Assignment Step]: 通过更新 c(1),...c(m) 来最小化 J(c(1),...c(m);μ1,..μK)
[Move Centroid Step]: 通过更新 μ1,..μK 来最小化 J(c(1),...c(m);μ1,..μK)
所以进行完上述步骤,就 minc(1),...c(m);μ1,..μKJ(c(1),...c(m);μ1,..μK) 了。
1.2 聚类中心初始化
可以随机初始化聚类中心,还有一种方法是在训练集中随机挑选K个样例点,赋值给K个聚类中心。
在学习的过程中,和监督学习一样,很有可能会掉入“局部最优解”中,如下图(上面一幅是正确的聚类,下面两种都是局部最优聚类)
没啥好的解决办法,办法就是多初始化几次聚类中心,然后多训练几个K-means模型,然后从中选择一个让 J(c(1),...c(m);μ1,..μK) 最小的模型。
不过局部最优解,一般当K比较小的时候会出现。
1.3 聚类数量K的选择
有两种方法来确定K的取值。
第一种方法,称为“Elbow Method”,即去多个K,去训练多个K-means模型,然后画出K- J(c(1),...c(m);μ1,..μK) 的图像:
选择转折点的K值。
但并得做出来的图都有清晰的转折点:
第二种方法,根据实际应用来决定,比如说T-shirt的大小类别如果是S, M, L则K=3,如果是xS, S, M, L, xL则K=5。
2. PCA降维算法
在所给的数据集中,有时候会有一些噪音的干扰,需要我们从中挑选出重要的特征来,这就是降维算法的应用;又或者说我们想要可视化数据,可视化的最高维度就是三维,再高维的图像,人是看不到的,所以也需要把高维数据映射到低维度的空间中,可以让人观察到。
2.1 算法概述
目的:将高维度的特征空间映射到低维度的特征空间中来。
既然是映射问题,那么最直接的一个方法就是给定一个低维度空间,将高维度空间中的数据投影到这个低维度空间中去。那么如何确定这个低维度空间就是关键了。
要求:选择的低维度空间使得投影距离最小。
举例:从2维映射到1维空间。
图中有两个1维空间,紫红色的线和橘黄色的线,很明显,各数据点到橘黄色的线的距离远远小于到紫红色的线,所以选择橘黄色的线所表示的1维空间。在1维空间上这些数据点变成了下面的样子:
2.2 实际操作过程
下面的介绍实际操作中,应该如何找到这个合适的低维空间。这里面有关“奇异值分解”的数学原理一概不讲,知道用这个方法可以达到最终效果就行了。
第一步:数据预处理 - feature scaling/mean normalization
x(i)j:=x(i)j−μjrange(xj)
第二步:计算协同矩阵
Σ=1mXTX
第三步:奇异值分解
[U,S,V] = svd(sigma)
第四步:选择U中前K列作为低维空间
U_reduce = U(:,:K)
第五步:将数据映射到这个低维空间
[z(i)=UTx(i)]
Z=UTX
至此,映射完毕,用
Z
代替
2.3 K的选择
在PCA算法中,应该如何选择低维空间的维度呢?
我们希望, x(i) 在被映射到低维空间后成为 z(i) ,将 z(i) 再映射回原来的高维空间,得到的 x(i)approx 中,大部分应该和 x(i) 是相同的,只有少部分因为映射损失了一些。用数学公式表示就是:
在实际操作中,有一个更好的计算上述公式的方法;
即:
所以整个选择K的流程是:
从K=1开始,进行PCA过程,得到
[U,S,V] = svd(sigma)
计算∑Ki=1Sii∑mi=1Sii⩾0.99是否成立
如果成立,输出所有结果,如果不成立,K=K+1
继续上述过程
注:PCA的降维目的并不是防止过拟合,防止过拟合的方法是引入regularization项