机器学习之K_means(附简单手写代码)

25 篇文章 6 订阅

聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。(摘自百度百科)

假设对基本的二维平面上的点进行K均值聚类,其实现基本步骤是:

  1. 事先选定好K个聚类中心(假设要分为K类)。
  2. 算出每一个点到这K个聚类中心的距离,然后把该点分配给距离它最近的一个聚类中心
  3. 更新聚类中心。算出每一个类别里面所有点的平均值,作为新的聚类中心。
  4. 给定迭代此次数,不断重复步骤2,3,达到该迭代次数后自动停止。

思想很简单,实现起来也很简单,附上代码(有注释):

import numpy as np
import matplotlib.pyplot as plt

#np.random.seed(300)
x=np.random.rand(200)*15    #产生要聚类的数据点,(0,15)之间
y=np.random.rand(200)*15

center_x=[]    #存放聚类中心坐标
center_y=[]
result_x=[]    #存放每次迭代后每一小类的坐标
result_y=[]

number_cluster=4   #簇数
time=50   #迭代次数

color=['red','blue','black','orange']

for i in range(number_cluster):  # 随机生成中心
    result_x.append([])      #顺便初始化存放聚类结果的列表
    result_y.append([])
    x1 = np.random.choice(x)  #为了避免出现聚类后有的簇一个点也没有,
    y1 = np.random.choice(y)  #干脆就以某一个数据点为中心
    if x1 not in center_x and y1 not in center_y:
        center_x.append(x1)
        center_y.append(y1)

plt.scatter(x,y)  #画出数据图
plt.title('init plot')
plt.show()

def K_means():
    for t in range(time):
        for i in range(len(x)):
            distance = []   #存放每个点到各中心的距离
            for j in range(len(center_x)):
                k = (center_x[j] - x[i]) ** 2 + (center_y[j] - y[i]) ** 2  #距离
                distance.append([k])
            result_x[distance.index(min(distance))].append(x[i])  #聚类
            result_y[distance.index(min(distance))].append(y[i])
        plt.title('iterations:'+str(t+1))
        for i in range(number_cluster):
            plt.scatter(result_x[i], result_y[i], c=color[i])
        plt.show()

        # 更新位置
        center_x.clear()
        center_y.clear()
        for i in range(number_cluster):
            ave_x = np.mean(result_x[i])
            ave_y = np.mean(result_y[i])
            center_x.append(ave_x)
            center_y.append(ave_y)


if __name__=='__main__':
    K_means()

结果展示:
1.初始化:
在这里插入图片描述
2.第一次迭代:
在这里插入图片描述
3.第二次迭代:
在这里插入图片描述
4.第九次迭代(收敛):
在这里插入图片描述

  • 12
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值