机器学习之&&Andrew Ng课程复习--- 聚类——Clustering

第十三章.聚类——Clustering

**************************************************************************************

 (一)、UnsupervisedLearning:Introduction

(二)、K-Means Algorithm

    (三)、Optimization Objective

 (四)、Random Initialization

(五)、Choosing theNumber of Clustrers

**************************************************************************************

(一)、Unsupervised Learning:Introduction

(监督性学习的介绍)

在本章之前,我们接触的所有算法只涉及监督性学习,这章我们将接触到另外一个Machine Learning的方向:无监督性学习。接下来我们仅仅用一点时间来学习下,Clustering(聚类)这个概念,保证非常精彩,因为这是我们第一个无监督性学习算法。我们要从未标记的数据中进行学习(也就是针对每一个样本X,我们并不知道其标签Y),而不是有标签的数据。
Q:什么是无监督性学习算法?
Ng:之前的课程我曾剪短介绍无监督学习算法,现在,我想将无监督性学习和监督性学习做个对照。首先下图是个典型的监督性学习算法:


上图有一组附标记的训练数据集,我们想要找出决策边界,来正确划分正( positive)或负(positive)类别数据,在这种监督性学习案例中,我们针对这些有标签的训练数据提出一个适当的假设。相比之下,在无监督学习案例中,我们面对的是一组无标记的训练数据,数据之间不具有任何相关联的标记,所以我们得到的数据像下图:一个数据集,一堆数据但没有任何标签作为参考,所以训练数据只有Xi但是没有Yi。在无监督学习中,我们将这些没有标签的数据送入特点的算法,然后我们要求算法替我们分析出数据的结构,就图二数据而言,其中一种结构的可能为图三那样分成两个类。这种算法就是聚类,本章我们主要介绍无监督学习中聚类算法的具体概念、细节以及应用,后续章节还会介绍其他无监督性学习算法。



无监督和有监督的数学形式:
假设:给定一组数据(input,target)为Z=(X,Y)。
有监督学习:最常见的是regression & classification。
regression:Y是实数vector。回归问题,就是拟合(X,Y)的一条曲线,使得下式cost function L最小。
 


classification:Y是一个finite number,可以看做类标号。分类问题需要首先给定有label的数据训练分类器,故属于有监督学习过程。分类问题中,cost function L(X,Y)是X属于类Y的概率的负对数。
 ,其中fi(X)=P(Y=i | X);
 
无监督学习:无监督学习的目的是学习一个function f,使它可以描述给定数据的位置分布P(Z)。 包括两种:density estimation & clustering.
density estimation就是密度估计,估计该数据在任意位置的分布密度
clustering就是聚类,将Z聚集几类(如K-Means),或者给出一个样本属于每一类的概率。由于不需要事先根据训练数据去train聚类器,故属于无监督学习。
PCA和很多deep learning算法都属于无监督学习。
Q:无监督性学习有什么用呢?
Ng:稍早前,我已经提到几个应用实例。
一、细分市场(Market Segmentation),假设有个客户数据库,想要将所有客户划分至不同的市场组,如下图,以便于营销或服务。
二、社交分析体系中的应用,已经存在很多年了,比如观察一群人,组成的社交网络,比如FaceBook、Google+,或者有关个人信息….你通常和谁有电子来往,或者查找一群相互有联系的人,这是另外一种聚类算法,用来查找那些有相互联系的朋友。
三、用聚类来组织运算集群或组织数据中心,因为在集群中,哪些计算机的数据中心倾向于一起工作,你可以用它重新组织你的资源,网络的布局,数据中心和通信。
四、最后一个应用是Ng自己正在做的事情,尝试用聚类算法,理解星系的组成(Ng每次搞的都有点高端),和其中的天文细节。


提问:


总而言之,聚类算法是我们无监督学习算法的第一个例子,接下来章节我们将深入探讨聚类算法。

(二)、K-Means Algorithm
在聚类问题中,我们哟有未加标签的数据,我们希望有一个算法能够自动的把这些数据分成有紧密关系的子集或簇,K-Means(K-均值)算法是最为广泛使用的聚类算法。那么在这一小节,我们将学习什么是K-Means算法以及它怎么运作的,K均值算法最好用图来表示:



 图   三
如左上角图所示,我们有没加标签的数据(假设是二维的),而我想将这些数据分成俩个簇,现在我执行K均值算法,流程是这样的。首先我随机选择俩个点,这俩个点叫做聚类中心(Cluster Centroids),为什么是两个点呢,因为我希望聚出两个类。K均值是一个迭代方法,它要做两件事,第一个是簇的分配,第二个是移动聚类中心,我们来看看这两个是干嘛的。
在K均值的每次循环中,第一步是要进行簇分配,这就是说我要遍历所有的样本,就是图中所有绿色的点,然后依据每一个点是更接近红色的这个中心,还是蓝色的这个中心,来将每个数据点分配到不同的聚类中心中。具体来讲如右上角图,对数据中的所有点,依据它们更接近红色中心,还是蓝色中心进行染色。以上就是簇分配的步骤。
K均值算法的第二步就是移动聚类中心,具体的操作是这样的,我们将两个聚类中心,也就是红色的X和蓝色的X移动到和它一样颜色的那堆点的均值处,那么我们要做的是找出所有红色的点,计算出它们的均值,就是所有红色的点平均下来的位置,然后我们就把红色点的聚类中心移动到这里,如图三左下图。蓝色点同理。然后我们就进入下一次簇分配。我们重新检查所有没有标签的样本,依据它离红色中心还是蓝色中心更近一些,将它染色,然后又移动聚类中心,(计算蓝色、红色点的均值),如此反复迭代,直到聚类中心不在改变,即分类结果(点的颜色不改变),这时候我们就说K均值算法收敛了。(如下图所示)


下面我们来看看K-Means的数学建模和伪代码实现


如上图所示:K-Means算法的输入是K(聚类个数,后面我们会讲怎么确定K值)和无标签的数据Xi(我们假设Xi为n维)。正如K-Means算法伪代码所示,我们首先随机初始化K个聚类中心U1,U2,…Uk,迭代过程是这样的首先我们计算每个Xi到K个聚类中心的距离的平方Ci,取最小值,为Xi染色,处理完所有样本后,我们计算每种类别k的平均聚类中心,移动U1,U2,…Uk。反复迭代,直到收敛。(如果某个聚类中心没有分配到Xi,那么通常的做法是直接移除那个聚类中心,这是将只有K-1个簇,如果我们一定要找到K个簇,这时我们的做法是重新随机取一个聚类中心,但是直接移除那个没有分配Xi的聚类中心是更为常见的方法,但是实际问题中,这种情形不常见。)

提问:

在这一节结束之前,我们来学习K-Means算法另外一个常见的应用,应对没有很好分开的簇,意思是到目前为止,我们的K均值算法,都是基于一些像下图所示的数据,能很好的隔离开来的,如下图三个簇,然后我们就用这个算法找出三个簇。


但是事实上一些这样的数据,看起来并没有很好的分开,分成几个簇。比如如上图,一个关于T恤大小的例子,假设你是T桖制造商,你找到了一些人,想把T恤卖给他们,然后你搜集了一些人的身高和体重的数据,我们假设身高体重更重要些的,然后你可能收集到一些数据,一些关于身高体重的数据如右上图,然后你想确定下T恤的大小,假设我们要设计三种不同的大小的t恤,小号、中号和大号,那么小号、中、大号分别应该多大呢?有一种方法,在这些数据上使用K均值算法进行聚类,然后将这些数据聚成几个簇,所以尽管这些数据刚开始没有很明显的形成三个簇,但是K均值算法仍然能将数据分成几个类,然后我们分别对这三个簇,设计小、中、大号衣服,这其实就是一个细分市场(Market Segmentation)问题,当你用K-Means将你的市场分为三个不同的部分,你就能区分对待你三类不同的顾客群体,更好的适应他们的不同需求。
综上所述,这就是K-Means算法,而且你现在应该如何去实现K-Means并且利用它来解决一些问题,下一节我们会更深入的探讨K-Means,以及如何能让K-Means表现的更好一些。

(三)、Optimization Objective

大多数监督性学习算法,正如我们所学过的,比如线性回归、逻辑斯蒂回归等等,所有这些算法都有优化对象(代价函数),尝试最小化这个损失函数。事实证明,K-Means同样有优化对象或者说是损失函数,我们尝试取最小化这个对象。这一小节就让我们来学习下这个优化对象(代价函数),一来了解和学习K-Means代价函数有助于我们Debug学习算法,保证K-Means算法的正确运行,二来更重要的一点是我们可以利用这个代价函数使得K-Means的聚类效果更好,避免局部最优。下面让我们来看看K-Means的CostFunction,我们有经常称作Distortion CostFunction,如下图所示:


J(Cm,Uk)就是我们要minimize的CostFuntion,其意义为最小化所有数据与其相对应(如Xi被染成红色,那么我们就计算其与红色点聚类中心的距离)的聚类中心的欧氏距离的和。
我们来回忆下上节中所讲的K-Means算法的流程如下图:


这一步是根据固定(初始)类中心U,优化C,初步确定Xi类别


这一步是优化聚类中心U,然后这两步不停地迭代运行,直到CostFuntion J(Cm,Uk)收敛。

提问:


这里大家注意,回归问题中有可能因为学习率设置过大产生随着迭代次数增加,cost function反倒增大的情况。但聚类是不会产生这样的问题的,因为每一次聚类都保证了使J下降,且无学习率做参数。
综上我们已经知道,K-Means算法正是通过最小化这个CostFunction J(Cm,Uk)来帮助算法有更好的效果,下面小节我们将进一步探讨如何帮助K-Means算法更好的聚类和避免局部最优。


 (四)、Random Initialization
在这小节,我们将学习到如何选择K-Means聚类算法的初始聚类中心,更重要的是探讨如何避免局部最优来构建K-Means算法。有几种不同的方法我们可以用来初始化聚类中心,但是事实证明有一种比其他大多数可能考虑到的方法更加被推荐,接下来让我们一起认识下它。如下图,我们展示了通常我们是如何初始化我的聚类中心的。当运行一个K-Means算法时,我们首先需要知道一个聚类中心数值K,K值要比样本的数量m小。我们随机挑选K个训练样本,然后我们设定U1,U2…UK让它们等于这K个样本。

如上图,我们不妨设K=2,然后我们随机取2个样本,如上面图那两点,这是我们令初始聚类中心就是这两点。然后我们通常不是这么幸运地(恰好能随机找到这两个簇中点分别作为初始聚类中心),我们有时挑选的初始样本如下图,


以上这种方法在你实现K均值聚类的时候可能会用到,但是我们会发现初始聚类中心的不同,其聚类结果也会大有不同,尤其是如果K均值方法落在局部最优的时候,如果给一些数据,如下图,看起来好像3个聚类,那么如果我们的初始化聚类中心不同可能会得到不同的结果,这是因为聚类中心的初始值造成了局部最优。如何避免K-Means陷入局部最优呢,我们可以尝试多次随机的初始化,而不是仅仅初始化一次K均值,就希望它得到很好的结果,我们需要多次(50-1000次)随机的初始化聚类中心,并行运行在这些初始化下的K-Means算法,找到全局最优,也就是找到一个使得代价函数最小的。具体流程如下图:


注意当K值比较小时 2-10,这种方法效果很明显,当K过大时,这种方法影响就不大了。

 

练习:


综上,这就是随机初始化的K均值方法,如果你尝试学习的聚类数目相对较小,用这种多次随机初始化,有时能帮助你找到更好的数据聚类结果,但是尽管你有很多聚类数目初始化,这种随机的方法会给K-Means一种合理的起点来开始并找到一个好的聚类结果。

(五)、Choosing the Number of Clustrers
在这一小节我们将详细讨论K均值方法聚类中如何去选择聚类类别数目,或者说是如何去选择参数K,其实,没有一个非常好的方法回答这个问题,或者能够自动做这件事情,到目前为止,确定聚类数目最常用的方法,任然是通过看可视化的图或者通过查看聚类算法的输出结果或者其他一些东西来手动地决定聚类的类别数目。
为什么确定聚类数目比较难?一部分原因是通常在数据集中有多少个聚类是不清楚的,这也是非监督学习的特点,因为数据没有标签,因此聚类数目的多少总没有一个清晰的答案。
当人们谈及怎么选择聚类数目K时,经常谈起的方法叫作Elbow method(“肘部法则”),那让我们认识下这个法则,认识下它的优缺点,如下图所示:

我们分别计算K值确定(K=1,2,3,4….)条件下,所有样本的CostFunction J的值,然后我们将这些值连成一条曲线如上图(左)所示,随着聚类数目的增多,畸变(代价)函数的值是如何下降的,你会发现其畸变函数值会随着      K值增多极速下降,当到达K=3时,畸变值就会下降的很慢,K=3正好也是曲线的”肘”点,因此我们选3为K的值。在你应用肘部法则的时候左上方的图确实可以比较清晰的帮我们确定K值,但事实证明,肘部法则并不那么常用,其中一个原因是,有时间你画出的曲线并没有明显的肘点,(右上图)此时肘部法则选择聚类数目将变得较为困难。

 

练习:


最后有另外一种方法引导你如何确定K值,通常人们用K均值聚类方法是为了得到聚类结果后用于后面的一些用途,比如你会用K-Means方法来做市场分割,如我们之前谈到的T恤大小问题,或者是你用来做电脑聚类等等,如果后续的目的是例如市场分割,那能给你一个评估标准,那么通常更好的方式来决定聚类的数量是,观察不同的聚类数值能否为后续的目的提供更好的结果,比如我们继续来看看T恤大小的例子,如下图。


如图所示,Tshirt的size,可以聚成{L,M,S}三类,也可以分为{XL,L,M,S,XS}5类。需要大家后续的目的和具体情况具体分析了~

  总结一下,对于大部分时候,聚类数目仍然是通过手动人工输入,或我们的经验来决定,一种可以尝试的方法是肘部原则,但是我们并不能总是期望它能很有效果,我们更好的想法是思考如何去选择聚类,基于聚类数目能为后续分析和研究提供价值的大小来确定聚类数目。

       这一章主要学习了无监督学习中的聚类问题,特别是学习了K-Means这种聚类算法,探讨了聚类问题的CostFunction,以及初始聚类中心和聚类个数K值得选择,这些方法在聚类问题中较为通用,希望在日后的学习工作中灵活应用。





  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值