美文网首页
K-Means算法的实现

K-Means算法的实现

作者: 严武小虎 | 来源:发表于2017-08-08 20:25 被阅读0次

    在知乎上看见了个K-Means算法的“牧师-村民”模型:

    有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的居民,于是每个居民到离自己家最近的布道点去听课。听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的居民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个居民又去了离自己最近的布道点……就这样,牧师每个礼拜更新自己的位置,居民根据自己的情况选择布道点,最终稳定了下来

    这个模型可以说是很生动形象了。链接见下:

    zhuanlan.zhihu.com/p/20432322

    K-Means是一种聚类算法。所谓聚类,就是将一堆没有标签的数据自动划分成几类的方法,这个方法要保证同一类的数据有相似的特征。比如我们把全班同学的成绩划分成 优良中差,90分、70分、60分、40分,然后用该算法把全班同学分类。又或者一筐苹果,分成上下中等,去给它分类。

    我们要注意的是:

    1.K值,也就是簇类个数是人为给定的

    2.数据的相似度用欧式距离度量。也就说明某些数据必须先经过处理(处理成能够用欧拉距离度量)才能计算

    在二维空间下,我们用Python语言来实现K-Means的具体流程:

    (list[[x, y, cluster], [x, y, cluster], [x, y, cluster]... ...]

    1.先随机创造n个点,这里取100个,但是无具体的标签;x,y轴取正向30个单位。

    for inrange(n):

         list[i][0] =round(random.uniform(1,30),2)

         list[i][1] =round(random.uniform(1,30),2)

    2.为这些数据随机分配标签。我们这里人为的设K值为3

    for in range(n):

           list[i][2] = random.randint(1,K)

    3.接下来我们就得“让牧师搬到中心地带”:求每个簇类的中心位置(此处的K是指第几个类簇)

    for in range(K):

         count = 0

    for in range(n):

         if list[i][2] ==i:

              count +=1

              x += list[j][0]

              y += list[j][1]

              x_i =x/count

              y_i =y/count

    4.现在我们的情况就是:三位牧师已经移动到了自己那一簇村民的中心位置,然而这是随机分配的,村民现在就要自己看,自己究竟与哪个牧师的距离最近,然后把自己原有的标签撕掉,换成最近的那个牧师的。也就是把每个数据的已给的标签换成距离最近的那个,已经是的就不用换了。(复杂的地方就用伪代码)

    for inrange(n):

         求出第i个点与中心1、2、3的欧拉距离

         通过比较得出i与第j个中心的距离最近

         if list[i][2]!=j:

              list[i][2] == j

    5.现在我们就给某些数据重新贴了一次标签,获得了局部最优。然而现在我们又生成了3个新的簇类,3个中心点的位置又不同了,所以我们的“牧师”,也就是中心点,又得搬家,执行我们的步骤3。步骤3执行了之后,“村民”又得搬,于是再执行步骤4... ...于是这就形成了一个迭代的过程。(复杂的地方就用伪代码)

    while 不是最优条件

         步骤3:求中心点

         步骤4:挪位置

    6.最后我们需要解决的问题就是“最优条件”是什么,否则这个迭代过程就不会停止。什么时候最优呢?比如我这一次重新分配了,发现每个数据的标签都没有变化,是否说明我可以停止了呢?或者改变的量相当的少,是否也可以停止了呢?这个就根据实际情况来决定了。但是有一个相当重要的地方就是:K-Means算法是求局部最优解,并不是全局最优。只要“牧师”移动得差不多了,“村民”都满意了,好我们就停了,但或许还有更好的位置。至此,我们的K-Means算法的迭代过程就结束了。

    在这就是在一个二维空间下,K-Means的实现流程。

    如果有理解错误的地方,欢迎随时在下方评论。

    (简书上真不适合敲代码┓( ´∀` )┏)

    相关文章

      网友评论

          本文标题:K-Means算法的实现

          本文链接:https://www.haomeiwen.com/subject/zmjxrxtx.html