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)=表示K个聚类中心中最接近x(i)的那个中心的索引(即当前样本x(i)所归为的那个簇的索引μk=表示第k个簇的聚类中心(μk∈Rn)μ(i)c=表示x(i)所属的那个簇的聚类中心
K均值的代价函数
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-均值聚类来让电脑的聚类变得更好,或者可能为了某些别的目的学习聚类,等等。如果那个后续下游的目的(比如市场分割)能给你一个评估标准,那么通常来说决定聚类数量的 更好的办法是,看不同的聚类数量能为后续下游的目的提供多好的结果。
说白了就是根据后面的需求来确定