论文代码实现——k-means_python

首先分割数据集,然后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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值