K-means聚类

import pandas as pd
import numpy as np
import random as rd
import matplotlib.pyplot as plt
Data=pd.read_excel("西瓜数据集4.0.xlsx")
k=5#设置聚类个数
D=Data.values[:,1:]
U=[]
Sc=[]
while(1):#初始化均值向量,不能有重复
    c=rd.randint(0,28)
    if c not in Sc:#控制不能有重复
        U.append(D[c].tolist())
        if len(U)==k:
            break
        Sc.append(c)


def mindij(x,U):#计算样本到各个均值向量的距离,返回最近的那个编号
    Dij=[]
    for u in U:
        dij=((x[0]-u[0])**2+(x[1]-u[1])**2)**1/2#欧氏距离
        Dij.append(dij)
#         print(dij)
    return np.argmin(Dij)#返回最近类别标记

def U_mean(C):#计算新的均值向量(质心)
    U_=[]
    for i in range(k):
        U_.append(np.mean(C[i],axis=0).tolist())#计算某个类别标记的数据的均值
    return U_
# U_mean(C)
count=0
while(1):
    count+=1
    C=[[] for i in range(k)]
    for x in D:#遍历所有数据
        c=mindij(x,U)#获取最近距离的类别标记
        C[c].append(x.tolist())#将样本添加进该簇集合中
    U_=U_mean(C)#计算新的均值向量

    if U==U_:#判断新均值向量是否等于前面一轮的均值向量
        break#如果相等,则说明收敛,算法退出
    else:
        U=U_#未收敛,重新计算新的分类
print("迭代了",count,"次才收敛。")
for i in range(k):#描点输出
    plt.scatter(np.array(C[i])[:,0],np.array(C[i])[:,1],label="cluster "+str(i))
plt.legend()
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值