K均值算法

1.K-means算法的描述

在这里插入图片描述

假设需要聚成k个类
①算法先会随机从数据集中选取k个点,把他们当做k个聚类的中心点;
②依次计算数据集中的每一个点与各个中心点的距离,离哪个中心点近,就划分到那个中心点对应的聚类下
③计算分到同一类簇下,所有点的均值,更新中心点,重复②,直至达到迭代结束条件

2、代码

import numpy as np
import  matplotlib.pyplot as plt
import random
def  get_dis(vec1,vec2):
   dist = np.sqrt(np.sum(np.square(vec1 - vec2)))
   return dist
def  rand_center(dataset,k):
   index=[]
   index=random.sample(range(1,len(dataset)),k)#range()左闭右开
    return dataset[index]
   #return dataset[[5, 11, 23]]
'''
dataset数据集
k聚类的个数
n迭代的次数
'''
def k_means(dataset,k,n):
   centers = rand_center(dataset, k)
   #distance矩阵存储,每个点到中心点的距离
   distance_mat = np.ones((len(dataset), k))
   time=0
   flag = []
   while time < n:
       # 计算距离
       for i in range(0, len(dataset)):
           for j in range(0, k):
               distance_mat[i][j] = get_dis(dataset[i], centers[j])
       # 用distance_mat矩阵中的每一行最小值的下标,作为分类的标记。得到每个点的分类到的类簇,
       flag = np.argmin(distance_mat, axis=1)
       # 更新每个点的中心
       i=0
       for center in centers:
           centers[center==centers]=np.mean(dataset[flag==i], axis=0)
           i+=1
       time += 1
   return  flag
def draw_result(dataset,flag):
   #画出未分类前的数据
   plt.subplot(121)
   plt.plot(dataset[:, 0], dataset[:, 1], '*')
   plt.title('Unclassified datasets')
   plt.xlabel('density')
   plt.ylabel('Sugar content')
   #画出聚类后的数据
   plt.subplot(122)
   C=[]
   for i in range(len(set(flag))):
       C.append(dataset[(flag == i)])

   for c in C :
       plt.plot(c[:, 0], c[:, 1], 'o')
   plt.title('Classified datasets')
   plt.xlabel('density')
   plt.ylabel('Sugar content')
   plt.show()

###测试代码
#使用西瓜书上的数据迭代4次的测试结果
dataset=np.loadtxt('data.txt')
result=k_means(dataset,3,4)
draw_result(dataset,result)

在这里插入图片描述


#使用自己生成的数据进行测试
s1=np.random.normal(0,1,(200,2))
s2=np.random.normal(0,1,(200,2))+np.array([3,3])
s3=np.random.normal(0,1,(200,2))+np.array([5,10])
dataset=np.vstack((s1,s2,s3))
result=k_means(dataset,3,30)
draw_result(dataset,result)

自己生成的数据集

3、数据集

#西瓜书上的数据集4.0
0.697   0.46
0.774   0.376
0.634   0.264
0.608   0.318
0.556   0.215
0.403   0.237
0.481   0.149
0.437   0.211
0.666   0.091
0.243   0.267
0.245   0.057
0.343   0.099
0.639   0.161
0.657   0.198
0.36    0.37
0.593   0.042
0.719   0.103
0.359   0.188
0.339   0.241
0.282   0.257
0.748   0.232
0.714   0.346
0.483   0.312
0.478   0.437
0.525   0.369
0.751   0.489
0.532   0.472
0.473   0.376
0.725   0.445
0.446   0.459

4、参考

《机器学习》 周志华

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值