Kmeans算法(附代码)

1.Kmeans简介

Kmeans算法是一个无监督机器学习算法。其基本作用就是将一堆杂乱、无序的数据归成k类,k是用户给定的数,它表示用户需要将数据分成k个类。

2.Kmeans运算步骤

  • 首先将总的数据集中随机挑选出k个数据,作为将来k个类对应的质心(相当于每个类对应的老大,将来每个类的所有点都将其包围)。
  • 从头开始顺序遍历每一个数据,假如该数据是前面选出来的质心,则跳过直接遍历下一个数据;否则用k个质心分别和该数据计算它们之间的距离,选出与该数据距离最近的质心,将该数据加到选出的质心对应的类,并更新该类的质心。
  • 不断迭代执行第二个步骤,直至满足用户的需求。

3.Kmeans代码

(1)先导入所需要的库函数

from matplotlib import pyplot as plt
import random
import numpy as np
from math import sqrt

(2)初始化一组数据(坐标点)

x_list=[random.randint(1,100) for i in range(50)]
y_list=[random.randint(1,100) for i in range(50)]
xy_axis=[]
for i in range(len(x_list)):
    xy_axis.append([x_list[i],y_list[i]])
print(xy_axis)
xy_axis=np.array(xy_axis)

(3)先可视化一下当前的点的分布

x=xy_axis[:,0]
y=xy_axis[:,1]
plt.scatter(x,y)

现在的数据是还没有经过分类的。

(4)定义距离函数

def eu_dis(x,y):
    return sqrt((x[0]-y[0])**2+(x[1]-y[1])**2)

(5)定义Kmeans算法

def Kmeans(xy_axis,k,time):
    n=len(xy_axis)
    center_list=[] # 存放质心的下标
    cluster_center=[] # 存放质心坐标
    cluster={} # 存放每个类包含的数据的坐标
    for i in range(k):
        cluster[i]=[]
        center_list.append(random.randint(0,n-1))
        cluster_center.append(xy_axis[center_list[i]])
    # 迭代time次
    for o in range(time):
        for i in range(k):
            cluster[i]=[]
        # 遍历每一个数据
        for i in range(n):
            if i not in center_list:
                min_dis=10000000
                pos=-1
                # 寻找最近的质心
                for j in range(k):
                    dis=eu_dis(cluster_center[j],xy_axis[i])
                    if dis<min_dis:
                        min_dis=dis
                        pos=j
                # 更新最近的质心的坐标
                cluster_center[pos][0]=(cluster_center[pos][0]+xy_axis[i][0])/2
                cluster_center[pos][1]=(cluster_center[pos][1]+xy_axis[i][1])/2
                # 将该数据加入到该质心所在的类中
                cluster[pos].append(i)
    for i in range(k):
        print(i,cluster[i])
    # 数据可视化
    x=xy_axis[:,0]
    y=xy_axis[:,1]
    plt.scatter([x[i] for i in cluster[0]],[y[j] for j in cluster[0]],c='b')
    plt.scatter([x[i] for i in cluster[1]],[y[j] for j in cluster[1]],c='r')
    plt.scatter([x[i] for i in cluster[2]],[y[j] for j in cluster[2]],c='y')
    plt.show()

(6)调用

Kmeans(xy_axis,3,10)

结果

 这时可以看出数据已经分好类啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值