实验三:手动编程实现K-means算法

实验三:手动编程实现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])

你可能感兴趣的:(机器学习笔记,算法,kmeans,聚类)