机器学习——详解经典聚类算法Kmeans

本文始发于个人公众号:TechFlow,原创不易,求个关注


今天是机器学习专题的第12篇文章,我们一起来看下Kmeans聚类算法。

在上一篇文章当中我们讨论了KNN算法,KNN算法非常形象,通过距离公式找到最近的K个邻居,通过邻居的结果来推测当前的结果。今天我们要来看的算法同样非常直观,也是最经典的聚类算法之一,它就是Kmeans。

我们都知道,在英文当中Means是平均的意思,所以也有将它翻译成K-均值算法的。当然,含义是一样的,都是通过求均值的方式来获取样本的类簇。

既然知道Kmeans算法和均值和类簇有关,那么剩下的问题就只有两个:首先,我们应该怎么来计算均值,其次当我们获取了均值之后,又是怎么来聚类的呢?

聚类算法

上面的两个问题我们先放一放,我们先来看一个例子,假设我们有一系列用户的收入样本,我们想要将这批用户根据他们的收入、居住地以及消费情况分成富人阶级、中产阶级和工薪阶级。

在这个问题当中,我们只知道我们希望把样本分成三类,但是怎么来分,我们并不清楚,这是我们希望模型替我们完成的。也就是说我们希望模型能够自动识别这些样本之间的关联性,把关联性强的样本聚在一起,成为一个类簇。在这个问题当中,我们希望模型替我们把数据分成三个类别。

如果让我们人工来划分这个问题当然很简单,我们直接根据这些用户的收入来分。直接将用户的收入画一个折线图,然后来寻找最佳的两个切分点,三下五除二很快就搞定了。但如果我们的特征当中没有用户的收入呢?如果我们能知道用户有没有车,有没有房,家里的存款和所有外债,这就没那么直观了,不过也容易,我们简单地建模也容易解决。再如果我们连车房的信息都没有,只能拿到用户在哪里上班,用户住在哪里呢?这个问题是不是就更抽象了?

在特征比较抽象和隐晦的时候,我们想直接划分往往不太容易,由于不知道真实的标签,我们也没有办法用上监督模型。为了解决问题,Kmeans只能反其道而行之,我们不再对数据进行划分了,而让比较接近的数据自己聚集在一起。Kmeans算法正是基于这一思想而生,让数据通过某种算法聚集,不再进行划分的方法称为聚类算法

在聚类问题当中,一系列样本被模型根据数据的属性聚合在了一起,成为了同一个类别。这里的类别就称为这些样本的类簇(cluster)。每一个簇的中心点称为簇中心。所以,KMeans算法,顾名思义,就是将样本根据用户设置的K值,一共聚类成K个类簇

Kmeans原理

不知道大家有没有听说过这么一个理论,人类和计算机其实是相反的。一些对于人类来说困难的问题,对于计算机非常简单。比如记忆,人类很难瞬间记忆大量的东西,而计算机不是,只要带宽和容量足够,再多的数据都能记住。不但能记住,而且绝不会出错。再比如计算,人类很难快速计算复杂的公式,基本上两位数以上的乘除就必须要借助工具了。但计算机不是,只要CPU资源足够,再大量的计算都可以进行。

但是呢,人类觉得很简单的东西,对计算机来说非常困难。比如视觉,我们人类可以很轻易地分辨图片上的猫和狗,但是计算机不行。即使是深度学习和AI大行其道的今天,我们也要专门设计复杂的模型和大量数据进行训练才能让计算机学会分辨图片的内容。再比如创作,人类可以创作出前人没有的东西,计算机则不能,所谓的计算机谱曲、写作只不过是程序按照固定的模式加上一些随机波动的值综合作用的结果而已。再比如思考,人类可以思考之前从未见过的问题,计算机显然不能。

比如上图,我们人类一眼看去这是三个类别,但是计算机不行。数据在计算机当中是离散的,计算机也没有视觉,看不到数据之间的联系。所以我们看着简单的问题,其实并没有那么简单,但其实刚才的分析当中我们已经道出了本质:既然计算机看不到联系,那么我们就要想办法让它能够“看到”,说看到应该不够准确,准确地说是算到。

回想一下,我们刚才是怎么快速分辨出图上有三个类别的?你会说很简单嘛,因为三个区域内点最多啊。这个说法很正确,但是不够量化,如果我们量化一下,应该是存在三个区域密度最大。一旦量化表达以后,问题就清楚了,我们正是要通过密度来进行聚类。Kmeans正是基于这一朴素的思想,但是它过于朴素,并没有设计计算类簇数量的算法,所以这个类别数量K,是要用户提供的。

也就是说算法并不知道要聚成几类,我们说是几类就是几类。

我们忽略这一细节,假设我们通过某种奇怪的方法知道了数据一共分成三类,那么Kmeans怎么进行划分呢?

我们深入思考会发现我们虽然说是要量化密度,但是密度很难量化。因为密度的定义本身就是基于聚类之后的结果的,我们肯定是已经知道了这样一批数据聚集在了一起才能算它们的密度,而不是相反。所以这个思路是靠谱的,但是直接这么做是不行的。但是直接做不行,不意味着倒着不可以,这个思路在数学上很常见,在这里我们又遇到了。

既然我们通过密度来聚类不行,那么我们能不能先聚类再算密度,根据密度的结果调整呢

我Google了好久也没找到Kmeans原作者的信息,但我想能想出这么天才想法的人,他一定很机智。Kmeans正是基于这么朴素又机智的思路衍生的。

初始化

在算法运行的伊始,Kmeans会在数据集的范围当中随机选择K个中心点,然后依据这K个中心点进行聚类。中心点有了聚类其实很容易,对于每一个样本来说我们只需要计算一下它和所有中心的距离,选择最近的那个就好了。

当然,这样得到的结果肯定很不准,但是没关系,即使依据不靠谱的中心,我们也可以完成聚类,我们把随机到的中心点的位置和最后的聚类结果都画在一张图上,可以看到虽然一开始选的位置看起来不是那么靠谱,但是我们一样可以达成一个不错的结果。

初始的聚类结果肯定是不准的,但是没有关系,我们不怕不准,就怕没有结果。有了结果就好办了,我们可以针对这个结果进行分析来查看优化的方向。有了优化的方向就可以让结果变得越来越准,就好像在线性回归当中,我们也不是第一下就搞定最佳参数的选值的,也是通过梯度下降一点一点迭代出来的。

迭代

在我们介绍具体的迭代方法之前,先来分析下情况。显然由于随机选取的关系,聚类的结果肯定是不准的,不准的原因是由于我们随机选取的中心和类簇距离太远导致的。也就是说我们要想办法让中心向着类簇靠近。

那怎么才能靠近呢,我们先来看一下完美聚类之后的情况。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值