【Python学习笔记】9:用k-means算法对数据进行聚类

①随机在图中取K个种子点。

②然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。

③接下来,要移动种子点到属于他的“点群”的中心。

④重复②和③步,直到种子点没有移动。

老师给的文件最后多了一个"]"符,把它删掉再做。

注意。因为最开始的四个初始点是随机选的,如果选的好几步之内就能完成,如果选的不好可能要十几步,每次运行步骤数都不一样,但是最终结果的四个聚类点集(顺序可能不同)始终都是不变的。

import math
import random
f=open("dataforkmeans - .txt")
a=[]
b=[]
tag=1
for k in f.read().split():
    if tag==1:
        a.append(float(k))
        tag=0
    else:
        b.append(float(k))
        tag=1
#到此已经将x坐标和y坐标分别放在了a[]和b[]中

p=len(a)
k=4
print ("数据表的长度为",p,"已知聚类数k =",k)
center=[]
for i in range(k):
    while(1):
        j=random.randint(0,p-1)
        if j not in center:
            center+=[j]
            break
#到此已经选取了四个0~104的不重复下标
cen_x=[a[i] for i in center]#存放种子点横坐标
cen_y=[b[i] for i in center]#存放种子点纵坐标

belong=[-1 for i in range(p)]
#print belong
tag=1
count=0
while(tag==1):#tag==1表示在循环里进行过种子点的移动
    tag=0
    #先更新聚类belong[]
    for i in range(p):#对每一个点
        index_maxlen=-1#存放到谁最近
        maxlen=-1#存放最近距离
        for j in range(k):#对k个种子点
            numlen=(a[i]-cen_x[j])**2+(b[i]-cen_y[j])**2#存放当前距离
            if maxlen<0 or numlen<maxlen:#如果比maxlen小
                index_maxlen=j#记录种子下标
                maxlen=numlen#更新更小值
        belong[i]=index_maxlen#记录它的种子点下标
    #再移动种子点
    sum_x=[0 for i in range(4)]
    sum_y=[0 for i in range(4)]#分别保存k个种子点对应聚类的横纵坐标和
    numofclass=[0 for i in range(4)]#用来保存k个聚类的点数
    for i in range(p):#对每一个点
        sum_x[belong[i]]+=a[i]
        sum_y[belong[i]]+=b[i]#将横纵坐标加到它的聚类中去
        numofclass[belong[i]]+=1#维护聚类的点数
    for i in range(k):#对k个种子点
        if sum_x[i]/numofclass[i] !=cen_x[i]:
            tag=1
            cen_x[i]=sum_x[i]/numofclass[i]
        if sum_y[i]/numofclass[i] !=cen_y[i]:
            tag=1
            cen_y[i]=sum_y[i]/numofclass[i]
    count+=1
    print ("**********第",count,"次运行**********")
    for i in range(k):#对k个种子点
        print ("第",i+1,"个聚类有以下点:")
        for j in range(p):#对每个点
            if belong[j]==i:#如果是第i个聚类
                print ("(",a[j],",",b[j],")",end='')
        print ()
        

某次运行结果:

数据表的长度为 105 已知聚类数k = 4
**********第 1 次运行**********
第 1 个聚类有以下点:
( 12.7 , 17.7 )( 14.4 , 18.75 )( 14.0 , 18.1 )( 13.05 , 16.95 )( 12.3 , 15.45 )( 15.6 , 14.35 )( 15.0 , 16.75 )( 13.4 , 16.2 )( 13.35 , 14.8 )( 14.3 , 15.7 )( 16.3 , 18.3 )( 16.1 , 17.5 )( 16.6 , 16.3 )( 16.95 , 14.4 )( 14.7 , 13.7 )( 14.3 , 14.7 )( 15.75 , 15.9 )( 13.95 , 17.25 )( 13.3 , 18.75 )( 13.4 , 19.9 )( 15.45 , 19.55 )( 15.35 , 17.75 )( 12.5 , 13.9 )( 13.45 , 13.25 )
第 2 个聚类有以下点:
( 6.15 , 7.9 )( 6.8 , 8.85 )( 8.6 , 9.8 )( 8.9 , 8.35 )( 7.55 , 7.8 )( 6.3 , 5.65 )( 6.8 , 5.5 )( 7.4 , 6.75 )( 8.35 , 6.3 )( 8.05 , 5.55 )( 8.55 , 5.25 )( 9.4 , 6.6 )( 8.9 , 7.55 )( 9.95 , 8.2 )( 10.1 , 7.55 )( 10.25 , 5.65 )( 9.25 , 5.2 )( 9.4 , 4.3 )( 6.85 , 4.7 )( 7.3 , 4.35 )( 7.8 , 4.4 )( 6.55 , 6.7 )( 8.2 , 8.75 )( 10.7 , 6.1 )( 10.2 , 6.7 )( 9.75 , 4.8 )( 10.2 , 5.0 )
第 3 个聚类有以下点:
( 9.75 , 8.9 )( 10.1 , 9.8 )( 10.7 , 7.5 )( 14.7 , 9.45 )( 15.65 , 10.75 )( 15.65 , 10.2 )( 15.65 , 8.9 )( 15.65 , 8.45 )( 16.85 , 8.45 )( 17.15 , 10.35 )( 17.9 , 11.6 )( 18.5 , 9.55 )( 18.6 , 7.9 )( 18.15 , 7.1 )( 15.9 , 5.85 )( 14.35 , 6.9 )( 12.85 , 9.35 )( 13.35 , 10.3 )( 15.1 , 11.75 )( 16.1 , 11.75 )( 14.95 , 10.9 )( 13.65 , 8.95 )( 13.55 , 8.0 )( 14.15 , 7.95 )( 15.1 , 7.25 )( 15.45 , 7.1 )( 15.75 , 7.1 )( 16.6 , 7.15 )( 16.75 , 9.95 )( 16.55 , 10.95 )( 17.2 , 9.05 )( 17.4 , 7.65 )( 17.75 , 10.7 )( 19.4 , 10.15 )( 14.45 , 6.15 )
第 4 个聚类有以下点:
( 5.9 , 16.35 )( 6.85 , 17.05 )( 7.35 , 16.3 )( 6.85 , 14.7 )( 6.6 , 15.7 )( 6.15 , 15.05 )( 6.6 , 14.1 )( 7.85 , 15.45 )( 8.5 , 17.35 )( 8.45 , 14.85 )( 8.1 , 14.25 )( 9.35 , 16.05 )( 9.95 , 17.95 )( 8.5 , 16.5 )( 9.8 , 15.2 )( 10.25 , 16.85 )( 9.7 , 14.15 )( 8.05 , 13.65 )( 6.7 , 13.1 )
**********第 2 次运行**********
第 1 个聚类有以下点:
( 12.7 , 17.7 )( 14.4 , 18.75 )( 14.0 , 18.1 )( 13.05 , 16.95 )( 12.3 , 15.45 )( 15.6 , 14.35 )( 15.0 , 16.75 )( 13.4 , 16.2 )( 13.35 , 14.8 )( 14.3 , 15.7 )( 16.3 , 18.3 )( 16.1 , 17.5 )( 16.6 , 16.3 )( 16.95 , 14.4 )( 14.7 , 13.7 )( 14.3 , 14.7 )( 15.75 , 15.9 )( 13.95 , 17.25 )( 13.3 , 18.75 )( 13.4 , 19.9 )( 15.45 , 19.55 )( 15.35 , 17.75 )( 12.5 , 13.9 )( 13.45 , 13.25 )
第 2 个聚类有以下点:
( 6.15 , 7.9 )( 6.8 , 8.85 )( 8.6 , 9.8 )( 8.9 , 8.35 )( 7.55 , 7.8 )( 6.3 , 5.65 )( 6.8 , 5.5 )( 7.4 , 6.75 )( 8.35 , 6.3 )( 8.05 , 5.55 )( 8.55 , 5.25 )( 9.4 , 6.6 )( 8.9 , 7.55 )( 9.75 , 8.9 )( 9.95 , 8.2 )( 10.1 , 7.55 )( 10.25 , 5.65 )( 9.25 , 5.2 )( 9.4 , 4.3 )( 6.85 , 4.7 )( 7.3 , 4.35 )( 7.8 , 4.4 )( 6.55 , 6.7 )( 8.2 , 8.75 )( 10.1 , 9.8 )( 10.7 , 7.5 )( 10.7 , 6.1 )( 10.2 , 6.7 )( 9.75 , 4.8 )( 10.2 , 5.0 )
第 3 个聚类有以下点:
( 14.7 , 9.45 )( 15.65 , 10.75 )( 15.65 , 10.2 )( 15.65 , 8.9 )( 15.65 , 8.45 )( 16.85 , 8.45 )( 17.15 , 10.35 )( 17.9 , 11.6 )( 18.5 , 9.55 )( 18.6 , 7.9 )( 18.15 , 7.1 )( 15.9 , 5.85 )( 14.35 , 6.9 )( 12.85 , 9.35 )( 13.35 , 10.3 )( 15.1 , 11.75 )( 16.1 , 11.75 )( 14.95 , 10.9 )( 13.65 , 8.95 )( 13.55 , 8.0 )( 14.15 , 7.95 )( 15.1 , 7.25 )( 15.45 , 7.1 )( 15.75 , 7.1 )( 16.6 , 7.15 )( 16.75 , 9.95 )( 16.55 , 10.95 )( 17.2 , 9.05 )( 17.4 , 7.65 )( 17.75 , 10.7 )( 19.4 , 10.15 )( 14.45 , 6.15 )
第 4 个聚类有以下点:
( 5.9 , 16.35 )( 6.85 , 17.05 )( 7.35 , 16.3 )( 6.85 , 14.7 )( 6.6 , 15.7 )( 6.15 , 15.05 )( 6.6 , 14.1 )( 7.85 , 15.45 )( 8.5 , 17.35 )( 8.45 , 14.85 )( 8.1 , 14.25 )( 9.35 , 16.05 )( 9.95 , 17.95 )( 8.5 , 16.5 )( 9.8 , 15.2 )( 10.25 , 16.85 )( 9.7 , 14.15 )( 8.05 , 13.65 )( 6.7 , 13.1 )
**********第 3 次运行**********
第 1 个聚类有以下点:
( 12.7 , 17.7 )( 14.4 , 18.75 )( 14.0 , 18.1 )( 13.05 , 16.95 )( 12.3 , 15.45 )( 15.6 , 14.35 )( 15.0 , 16.75 )( 13.4 , 16.2 )( 13.35 , 14.8 )( 14.3 , 15.7 )( 16.3 , 18.3 )( 16.1 , 17.5 )( 16.6 , 16.3 )( 16.95 , 14.4 )( 14.7 , 13.7 )( 14.3 , 14.7 )( 15.75 , 15.9 )( 13.95 , 17.25 )( 13.3 , 18.75 )( 13.4 , 19.9 )( 15.45 , 19.55 )( 15.35 , 17.75 )( 12.5 , 13.9 )( 13.45 , 13.25 )
第 2 个聚类有以下点:
( 6.15 , 7.9 )( 6.8 , 8.85 )( 8.6 , 9.8 )( 8.9 , 8.35 )( 7.55 , 7.8 )( 6.3 , 5.65 )( 6.8 , 5.5 )( 7.4 , 6.75 )( 8.35 , 6.3 )( 8.05 , 5.55 )( 8.55 , 5.25 )( 9.4 , 6.6 )( 8.9 , 7.55 )( 9.75 , 8.9 )( 9.95 , 8.2 )( 10.1 , 7.55 )( 10.25 , 5.65 )( 9.25 , 5.2 )( 9.4 , 4.3 )( 6.85 , 4.7 )( 7.3 , 4.35 )( 7.8 , 4.4 )( 6.55 , 6.7 )( 8.2 , 8.75 )( 10.1 , 9.8 )( 10.7 , 7.5 )( 10.7 , 6.1 )( 10.2 , 6.7 )( 9.75 , 4.8 )( 10.2 , 5.0 )
第 3 个聚类有以下点:
( 14.7 , 9.45 )( 15.65 , 10.75 )( 15.65 , 10.2 )( 15.65 , 8.9 )( 15.65 , 8.45 )( 16.85 , 8.45 )( 17.15 , 10.35 )( 17.9 , 11.6 )( 18.5 , 9.55 )( 18.6 , 7.9 )( 18.15 , 7.1 )( 15.9 , 5.85 )( 14.35 , 6.9 )( 12.85 , 9.35 )( 13.35 , 10.3 )( 15.1 , 11.75 )( 16.1 , 11.75 )( 14.95 , 10.9 )( 13.65 , 8.95 )( 13.55 , 8.0 )( 14.15 , 7.95 )( 15.1 , 7.25 )( 15.45 , 7.1 )( 15.75 , 7.1 )( 16.6 , 7.15 )( 16.75 , 9.95 )( 16.55 , 10.95 )( 17.2 , 9.05 )( 17.4 , 7.65 )( 17.75 , 10.7 )( 19.4 , 10.15 )( 14.45 , 6.15 )
第 4 个聚类有以下点:
( 5.9 , 16.35 )( 6.85 , 17.05 )( 7.35 , 16.3 )( 6.85 , 14.7 )( 6.6 , 15.7 )( 6.15 , 15.05 )( 6.6 , 14.1 )( 7.85 , 15.45 )( 8.5 , 17.35 )( 8.45 , 14.85 )( 8.1 , 14.25 )( 9.35 , 16.05 )( 9.95 , 17.95 )( 8.5 , 16.5 )( 9.8 , 15.2 )( 10.25 , 16.85 )( 9.7 , 14.15 )( 8.05 , 13.65 )( 6.7 , 13.1 )

再运行一次,竟然要算13次,不过结果是一样的,就不贴了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值