sklearn kmeans_sklearn调包侠之K-Means

v2-fb1fa3d264a924cf39a7dcb233213a36_1440w.jpg?source=172ae18b

v2-5e2cd5e47eec7afe574d4df6f14f3455_b.jpg

K-Means算法

k-均值算法(K-Means算法)是一种典型的无监督机器学习算法,用来解决聚类问题。

算法流程

K-Means聚类首先随机确定 K 个初始点作为质心(这也是K-Means聚类的一个问题,这个K值的不合理选择会使得模型不适应和解释性差)。然后将数据集中的每个点分配到一个簇中, 具体来讲,就是为每个点找到距其最近的质心(这里算的为欧式距离,当然也可以使用其他距离), 并将其分配该质心所对应的簇;这一步完成之后,每个簇的质心更新为该簇所有点的平均值;重复上述过程直到数据集中的所有点都距离它所对应的质心最近时结束。

算法伪代码

  1. 创建 k 个点作为起始质心(随机选择)
  2. 当任意一个点的簇分配结果发生改变时(不改变时算法结束)
  3. 对数据集中的每个数据点
  4. 对每个质心
  5. 计算质心与数据点之间的距离
  6. 将数据点分配到距其最近的簇
  7. 对每一个簇, 计算簇中所有点的均值并将均值作为质心

实战

构造数据

首先,我们用make_blobs创建数据集,如图所示。

  1. %matplotlib inline
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. from sklearn.datasets import make_blobs
  5. X, y = make_blobs(n_samples=200,
  6. n_features=2,
  7. centers=4,
  8. cluster_std=1,
  9. center_box=(-10.0, 10.0),
  10. shuffle=True,
  11. random_state=1)
  12. plt.figure(figsize=(6,4), dpi=144)
  13. plt.xticks(())
  14. plt.yticks(())
  15. plt.scatter(X[:, 0], X[:, 1], s=20, marker='o')

v2-a9cff3b746c8f3307c6787f4a5cbe87d_b.jpg

训练模型与评估

该算法使用 sklearn.cluster 模块中的KMeans函数。

  1. from sklearn.cluster import KMeans
  2. n_clusters = 3
  3. kmean = KMeans(n_clusters=n_clusters)
  4. kmean.fit(X);
  5. print("kmean: k={}, cost={}".format(n_clusters, int(kmean.score(X))))
  6. # result
  7. # kmean: k=3, cost=-668

绘制聚类结果

最后,我们通过matplotlib绘制聚类的结果,如图所示:

  1. labels = kmean.labels_
  2. centers = kmean.cluster_centers_
  3. markers = ['o', '^', '*']
  4. colors = ['r', 'b', 'y']
  5. plt.figure(figsize=(6,4), dpi=144)
  6. plt.xticks(())
  7. plt.yticks(())
  8. # 画样本
  9. for c in range(n_clusters):
  10. cluster = X[labels == c]
  11. plt.scatter(cluster[:, 0], cluster[:, 1],
  12. marker=markers[c], s=20, c=colors[c])
  13. # 画出中心点
  14. plt.scatter(centers[:, 0], centers[:, 1],
  15. marker='o', c="white", alpha=0.9, s=300)
  16. for i, c in enumerate(centers):
  17. plt.scatter(c[0], c[1], marker='$%d$' % i, s=50, c=colors[i])

v2-18094931a8611a55873ed86fe5a64a7c_b.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值