当前位置:   article > 正文

论文代码实现——k-means_python_k-means在论文中的写法

k-means在论文中的写法

首先分割数据集,然后k-means聚类。论文中对于k-means获取k,用的是贪心算法。第一个点是随机获取的,第二个中心点是根据第一个点获取的,这就导致获取的k可能不是最优的。

先用论文中的方式,贪心算法


import random
import numpy as np


# 计算欧几里得距离
def distEclud(x, y):
    #强制类型转换,list转array
    a=np.array(x, dtype = float)
    b=np.array(y, dtype = float)
    dis=np.sqrt(np.sum(np.square(a - b)))
    return dis

def getcNumAndCenter(data,m):
    #簇中心
    centers=[]
    #随机选择第一个簇中心
    c1=random.choice(data)
    centers.append(c1)
    #根据第一个簇中心找第二个
    maxdis=-1
    for c in data:
        dis=distEclud(c,c1)
        if maxdis<dis :
            c2=c.copy()
    centers.append(c2)
    number=2

    for xi in data:
        #xi到每个中心点的距离,xi != cj        
        mindis=9999999
        flag=0
        sumDis=0.0
        for cj in centers:
            if xi is not cj:
                flag=1
                #计算距离
                dis=distEclud(xi,cj)
                if mindis > dis:
                    mindis =dis #找最小的距离
                #求cj与ck之间的平均距离,这里只计算c1到各个点之间的距离
                if c1 is not cj:
                    dis2=distEclud(c1,cj)
                    sumDis+=dis2
        if flag:
            centersNum=float(len(centers))
            avgdis =float(sumDis/centersNum)
            if mindis >avgdis and number<m :
                centers.append(xi)
                number+=1
    return data, number, centers

if __name__ =='__main__':
    #产生数据
    X=np.random.rand(300, 2)
    data=X.copy()
    m=len(data)
    data, number, centers=getcNumAndCenter(data,m)
    print(number)
    print(centers)

第一部分贪心获取到K,及簇,这里的簇中心距离计算的不好,应该选择一天最优的连接。

import random
import numpy as np
from sklearn.cluster import AffinityPropagation
from sklearn import metrics

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/967192
推荐阅读
相关标签
  

闽ICP备14008679号