Scikit-learn-09.K-均值算法

本系列文章介绍人工智能的基础概念和常用公式。由于协及内容所需的数学知识要求,建议初二以上同学学习。 运行本系统程序,请在电脑安装好Python、matplotlib和scikit-learn库。相关安装方法可自行在百度查找。

K-均值算法是一种典型的无监督机器学习算法,用来解决聚类问题。k表示把数据分成多少类,理论上k值越大,算法成本越低。K-均值算法包含两个步骤:

  • 给聚类中心分配点。计算所有的训练样例,把每个训练样例分配到距离其最近的聚类中心所在的类别里。
  • 移动聚类中心。新的聚类中心移动到这个聚类所有的点的平均值处。

重复上面的动作,直到聚类中心不再移动为止。


示例说明

从上面过程可看出,初始化的聚类中心点与聚类的结果密切相关,不同的随机初始化中心点可能会得到不同的结果。因为成本函数可能会收敛在一个局部的最优解,而不是全局最优解。而解决这个问题 的办法就是,多运行几次K-均值算法,找到一个最小的成本值。


示例程序

以下程序是随机生成200个点坐标,用K-均值算法对其进行2、3、4类的分组。

 

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
  
def fit_plot_kmean_model(n_clusters,X):
    plt.xticks(())
    plt.yticks(())
  
    #使用k-均值算法进行拟合
    kmean = KMeans(n_clusters=n_clusters)
    kmean.fit_predict(X)
  
    labels = kmean.labels_
    centers = kmean.cluster_centers_
    markers = ['o','^','*','s']
    colors = ['r','g','b','k']
  
    #计算成本
    score = kmean.score(X)
    plt.title("k={},score={}".format(n_clusters,(int)(score)))
  
    #画样本
    for c in range(n_clusters):
        cluster = X[labels==c]
        plt.scatter(cluster[:,0],cluster[:,1],marker=markers[c],s=20,c=colors[c])
  
    #画中心点
    plt.scatter(centers[:,0],centers[:,1],marker='o',c="white",alpha=0.9,s=300)
  
    for i,c in enumerate(centers):
        plt.scatter(c[0],c[1],marker='$%d$' % i,s=50,c=colors[i])
  
  
#-------------------------------
#生成200个随机样本坐标
X,Y = make_blobs(n_samples=200,
                 n_features=2,
                 cluster_std=1,
                 center_box=(-10,10),
                 shuffle=True,
                 random_state=1)
  
n_clusters = [2,3,4]
  
plt.figure(figsize=(10,3),dpi=144)
for i,c in enumerate(n_clusters):
    plt.subplot(1,3,i+1)
    fit_plot_kmean_model(c,X)
  
plt.show()

从上面数据可以看出,计算成本score的绝对值越大,说明计算成本越高。分类越多,成本越小。

k-均值的算法成本就是训练样本到其所属的聚类中心点的距离的平均值

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值