k-means的python实现

本文详细介绍了K-means聚类算法的工作原理,通过Python代码实现,展示了如何从随机选取初始质心开始,经过多次迭代,最终将数据集划分为预设数量的簇。并附上了完整的代码和运行结果,帮助读者理解算法的实施过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

k=3为例进行说明
(1)从数据中随机取k个数;
(2)遍历数据进行分类(本文分类标准选择了欧式距离);
(3)第一次分类结束后,计算每个分类中的平均数,代替(1)中的k个数;
(4)循环,迭代。
送上代码:

import numpy as np
import random
import matplotlib.pyplot as plt 
k=3#需要分成的簇
n=20#循环次数
a=10*np.random.random((500,2))
#初始化k个点
b=[]
for i in range(len(a)):
    b.append(i)
c=random.sample(b,k)
d=[]
for i in range(len(c)):
    d.append(a[c[i]])

#定义距离函数
def distance(x,y):
    s=0
    for i in range(len(x)):
        s=s+(x[i]-y[i])**2
    return(s)

#遍历分类
#第一次循环是循环次数
for i in range(n):
    A=[]
    B=[]
    C=[]
    #第二次循化是遍历数据
    for i in range(len(a)):
        if min(distance(a[i],d[0]),distance(a[i],d[1]),distance(a[i],d[2]))==distance(a[i],d[0]):
            A.append(a[i])
        elif min(distance(a[i],d[0]),distance(a[i],d[1]),distance(a[i],d[2]))==distance(a[i],d[1]):
            B.append(a[i])
        elif min(distance(a[i],d[0]),distance(a[i],d[1]),distance(a[i],d[2]))==distance(a[i],d[2]):
            C.append(a[i])
    #可以查看分类后,每簇数据的个数
    print(len(A),len(B),len(C))

#定义画图的视野范围
plt.xlim(xmax=10,xmin=0)
plt.ylim(ymax=10,ymin=0)
#画图
for i in range(len(A)):
    plt.plot(A[i][0],A[i][1],'ro')
for i in range(len(B)):
    plt.plot(B[i][0],B[i][1],'go')
for i in range(len(C)):
    plt.plot(C[i][0],C[i][1],'bo')
plt.show()

#步(3)中的k个数的计算
d00=0
for i in range(len(A)):
    d00=d00+A[i][0]
d00=d00/len(A)

d01=0
for i in range(len(A)):
    d01=d01+A[i][1]
d01=d01/len(A)

d10=0
for i in range(len(B)):
    d10=d10+B[i][0]
d10=d10/len(B)

d11=0
for i in range(len(B)):
    d11=d11+B[i][1]
d11=d11/len(B)

d20=0
for i in range(len(C)):
    d20=d20+C[i][0]
d20=d20/len(C)
d21=0
for i in range(len(C)):
    d21=d21+C[i][1]
d21=d21/len(C)
d[0][0]=d00
d[0][1]=d01
d[1][0]=d10
d[1][1]=d11
d[2][0]=d20
d[2][1]=d21

献上3张结果图

在这里插入图片描述在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值