Sweety

Practice makes perfect

导航

聚类(斯坦福machine learning week 8)

Posted on 2017-11-29 20:28  蓝空  阅读(146)  评论(0编辑  收藏  举报

1 用途

图片描述

  • 图1是细分市场,将所有用户划分至不同的细分市场组,以便于营销或服务。
  • 图2是社交分析体系,比如在社交网络中观察一群人,看他们和谁有电子邮件来往,或者查找一群相互有联系的人。
  • 图3是用聚类来组织运算集群或组织数据中心,因为,如果你知道在集群中,哪些计算机的数据中心倾向于一起工作,你可以用它重新组织你的资源,网络的布局,以及数据中心和通信。
  • 图4是使用聚类算法来试图理解星系的形成,和其中的天文细节。

2 K-Means 算法

2.1 实现

K均值是一个迭代方法,它要做两件事情:

  • 第一是簇分配。
  • 第二个是移动聚类中心。

2.1.1 K-Means 第一步:簇分配

具体来讲,就是对数据集中的所有点,依据他们更接近红色这个中心、还是蓝色这个中心,进行染色。染色之后的结果如图所示:
图片描述

2.1.2 K-Means 第二步:移动聚类中心

具体的操作方法是这样的:我们将两个聚类中心(也就是红色的叉和蓝色的叉)移动到和它一样颜色的那堆点的均值处。

那么我们要做的是找出所有红色的点,计算出它们的均值位置,然后我们就把红色点的聚类中心移动到这里。对蓝色的点也同样计算平均位置,然后移动蓝色聚类中心到该平均位置处。
图片描述

2.1.3K-Means 第三步:重复执行上面两步

然后我们就会进入下一个簇分配。我们重新检查所有没有标签的样本,依据它离红色中心还是蓝色中心更近一些,重新将它染成红色或是蓝色。
图片描述

然后再做一遍簇分配和移动聚类中心操作:

图片描述

2.2 K-Means的规范化描述

这里写图片描述
第一步:随机初始化K个聚类中心,记作μ_1,μ_2一直到μ_K。

第二步:

K均值内部循环执行以下步骤:

  • 簇分配
    首先对于每个训练样本,我们用变量c(i)表示K个聚类中心中最接近x(i)的那个中心的下标(具体的类别),这就是簇分配。
    (大写的K表示所有聚类中心的个数,小写的k则表示某个聚类中心的下标。)
    我们希望的是:在所有K个中心中,找到一个k使得xiμk的距离是x(i)到所有的聚类中心的距离中最小的那个,这就是计算ci的方法。
    这里还有另外的表示c_i的方法:我用范数的形式||x(i)μk||来表示,这是第i个训练样本到聚类中心μk的距离。
    接下来我要做的是找出k的值,让这个式子||x(i)μk||最小,然后将 c(i)赋值为k。
    出于惯例,人们更喜欢用距离的平方||x(i)μk||2来表示x(i)距聚类中心μ_k的距离。所以我们可以认为c(i) 的类别是属于距样本x(i)的距离的平方最小的那个聚类中心的。 当然使距离的平方最小或是距离最小,都能让我们得到相同的c(i),但是我们通常还是使用距离的平方,因为这是约定俗成的。

  • 移动聚类中心
    对于每个聚类中心:k从1循环到K,将μ_k赋值为这个簇的均值。

2.3 优化目标

解和使用这个K均值的优化目标函数有两方面的目的:

  • 首先这将能帮助我们调试学习算法,确保K均值算法是在正确运行中。
  • 第二个也是最重要的一个目的是,K均值优化目标函数将帮助我们找到更好的簇,并且避免局部最优解。(后面会讲到)
    当K均值正在运行时,我们将对两组变量进行跟踪:
    c(i)=Kx(i)x(i)μk=kμkRnμ(i)c=x(i)

K均值的代价函数

J(c(1),,c(m),μ1,,μK)=1mi=1m||x(i)μ(i)c||2

K均值的目标就是要最小化代价函数:
minc(1),,c(m),μ1,,μKJ(c(1),,c(m),μ1,,μK)

在K均值算法中,有时候也叫做失真代价函数(distortion cost function)。

2.3 随机初始化

我们之前没有讨论得太多的是这一步:
这里写图片描述
如何初始化聚类中心这一步,有几种不同的方法可以用来随机初始化聚类中心。但是,事实证明,有一种可能是效果最好的方法。接下来我就将这个方法介绍给你。
图片描述

图片描述
如果你担心K均值方法会遇到上面这种局部最优的问题,并且你想提高K均值方法找到最有可能的聚类的几率的话,我们能做的就是尝试多次随机的初始化,而不是仅仅初始化一次K均值方法就希望它会得到很好的结果。

2.3.1 解决方案

初始化K均值很多次,并运行K均值方法很多次,通过多次尝试来保证我们最终能得到一个足够好的结果。一个尽可能局部或全局最优的结果。
假设说有决定运行K均值方法100次,那么这就意味着我们要随机初始化K均值方法100次。对于这100次随机初始化的每一次,我们都需要运行K均值方法。我们会得到一系列聚类结果和一系列聚类中心之后,我们可以计算失真函数JJ。用我们得到的这些聚类结果和聚类中心来计算这样一个结果函数。

  • 如果你运行K均值方法时,所用的聚类数相当小,比如聚类数是从2到10之间的任何数
  • 如果K非常大的话,比如K比10大很多,就不太可能会有太大的影响,但是这种情况下第一次可能随机的初始化得到的结果就还可以(也就是说如果类多了的话效果可能不明显)

2.3 选择簇的数量

选择聚类的数目可能不总是那么容易,大部分情况下,对于数据集中有多少个聚类中心通常是模棱两可的。

2.3.1 肘部法则 (Elbow Method)

通过图来选择,横坐标是分类的数据,纵坐标是cost function值
事实证明肘部法则并不那么常用,其中一个原因是如果你把这种方法用到一个聚类问题上,事实上你最后得到的曲线通常看起来是更加模棱两可的,就像这样:

看到这条曲线,肘部法则会说:“我们来看这个图,这里看起来像是一个很清楚的肘点”。选择这个点作为数目就好了

事实证明肘部法则并不那么常用,其中一个原因是如果你把这种方法用到一个聚类问题上,事实上你最后得到的曲线通常看起来是更加模棱两可的,就像这样:
图片描述
如果实际情况中,你遇到的肘点的位置并不明确,这使得用这个方法来选择聚类数目变得较为困难。
简单小结一下肘部法则:它是一个值得尝试的方法,但是我不会期待它在任何问题上都有很高的表现。

2.3.1 通过下游来决定聚类数量

通常人们使用K-均值聚类算法是为了某些后面的用途,或者说某种下游的目的。而要求得一些聚类也许你会用K-均值聚类算法来做市场分割。例如我们之前谈论的T恤尺寸的例子,也许你会用K-均值聚类来让电脑的聚类变得更好,或者可能为了某些别的目的学习聚类,等等。如果那个后续下游的目的(比如市场分割)能给你一个评估标准,那么通常来说决定聚类数量的 更好的办法是,看不同的聚类数量能为后续下游的目的提供多好的结果。
说白了就是根据后面的需求来确定