实验三:手动编程实现K-means算法
K-均值算法(K-means)算法概述:
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
算法过程:
(1)随机选取K个对象作为初始聚类中心;
(2)将数据样本集合中的样本按照最小距离原则分配到最邻近聚类;
(3)根据聚类的结果,重新计算K个聚类的中心,并作为新的聚类中心;
(4)重复步骤2.3直到聚类中心不再变化。
一、实验目的
1.深刻理解K-means算法原理及运算过程
2.掌握和使用numpy库中函数和方法
3.掌握和使用matplotlib库中函数和方法
4.增强逻辑思维能力和代码编写能力
二、实验内容:
1、根据k-means算法的原理,手动编程实现数据集的聚类。输入为某个自定义的数据集,以及输入任意的K(聚类个数),输出的结果为K个簇,以及K个簇中心。
2、最后将划分后的簇用不同的颜色来区分K个簇以及中心点,尽可能让可视化的图清晰明了美观。
三、实验要求:
编程实现以上实验内容,将代码及运行结果填写到实验步骤里面,注意排版和格式。
四、实验步骤:
import numpy as np
import matplotlib.pyplot as plt
x=np.array([[1,2],[1.5,1.8],[5,8],[8,8],[1,0.6],[9,10]])
x=np.random.rand(10000).reshape(-1,2)
k=int(input("Please input:"))
medoids=x[0:k]
max_iter=100
for t in range(max_iter): #迭代次数
cluster=[[] for i in range(k)]
#计算所有点与中心点的距离,根据就近原则将点分配到最近的那个中心所对应的簇
for i in range(len(x)):
min_d=1000
for j in range(k):
d=np.sum(np.square(x[i]-medoids[j]))
if d<min_d:
shortest_medoid=j
min_d=d
cluster[shortest_medoid].append(x[i])
for j1 in range(k):
medoids[j1]=np.mean(cluster[j1],axis=0)
plt.figure(dpi=400)
plt.axis('equal')
colors=['r','g','m','k','y','b','gold','yellow','pink','blue','b']
for i in range(k):
plt.scatter(np.array(cluster[i])[:,0],np.array(cluster[i])[:,1],color=colors[i])