第十三章.聚类——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。在无监督学习中。我们将这些没有标签的数据送入特点的算法,然后我们要求算法替我们分析出数据的结构,就图二数据而言,当中一种结构的可能为图三那样分成两个类。这样的算法就是聚类,本章我们主要介绍无监督学习中聚类算法的详细概念、细节以及应用,兴许章节还会介绍其它无监督性学习算法。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

无监督和有监督的数学形式:

如果:给定一组数据(input。target)为Z=(X,Y)。

有监督学习:最常见的是regression & classification。

regression:Y是实数vector。回归问题,就是拟合(X,Y)的一条曲线,使得下式cost function L最小。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



classification:Y是一个finite number,能够看做类标号。

分类问题须要首先给定有label的数据训练分类器,故属于有监督学习过程。

分类问题中。cost function L(X,Y)是X属于类Y的概率的负对数。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">,当中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的数学建模和伪代码实现

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:10.5pt; line-height:19.5pt">


如上图所看到的: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的聚类中心是更为常见的方法,可是实际问题中,这种情形不常见。

)

提问:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="font-size:10.5pt; line-height:19.5pt">

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

可是其实一些这种数据,看起来并没有非常好的分开,分成几个簇。

比方如上图。一个关于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。例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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算法。找到全局最优。也就是找到一个使得代价函数最小的。详细流程例如以下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

注意当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值。但事实证明,肘部法则并不那么经常使用,当中一个原因是,有时间你画出的曲线并没有明显的肘点,(右上图)此时肘部法则选择聚类数目将变得较为困难。

练习:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3BfcHJvZ3JhbW1lcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

如图所看到的,Tshirt的size。能够聚成{L,M,S}三类,也能够分为{XL。L。M,S,XS}5类。须要大家兴许的目的和详细情况详细分析了~

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

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




最新文章

  1. 各类坐标系相互之间的转换(84互转GC02,GC02互转BD09)
  2. WP7、WP8 格式化时间为距当前多少时间
  3. LeetCode 191 Number of 1 Bits
  4. 为什么在非UI线程中操作UI的改变失不安全的
  5. 在集群环境中使用 EhCache 缓存系统|RMI 集群模式
  6. DOS/Windows下黑客攻防(一)——神秘黑客大曝光
  7. Java 常调用的Webservice接口的方法
  8. HYML / CSS和Javascript 部分
  9. 51Nod--1008
  10. Community Stories: Cinemachine and Timeline——Community Stories: Cinemachine and Timeline
  11. python_黑洞数
  12. 原生js实现canvas气泡冒泡效果
  13. 软件开发者路线图梗概&书摘chapter6
  14. C# using 的用法
  15. MapReduce实例2(自定义compare、partition)& shuffle机制
  16. Mac设置信认任意来源应用
  17. MySQL二进制安装部署
  18. JS设计模式——2.初识接口
  19. hdu 1159 Common Subsequence 【LCS 基础入门】
  20. WCF把书读薄(2)——消息交换、服务实例、会话与并发

热门文章

  1. python处理时间戳
  2. asp.net学习指南
  3. xcodeproj cannot be opened because the project file cannot be parsed.
  4. ROS-package.xml文件标签解读
  5. navigate系列api
  6. javascript中手风琴特效
  7. 使用CocoaPods更新第三方库出错的解决办法
  8. Python学习——BeautifulSoup篇
  9. ZBrush通过遮罩得到子物体
  10. udev的规则文件