公号:码农充电站pro
主页:https://codeshellme.github.iohtml
以前介绍到的一些机器学习算法都是监督学习算法。所谓监督学习,就是既有特征数据,又有目标数据。python
而本篇文章要介绍的K 均值算法是一种无监督学习。git
与分类算法相比,无监督学习算法又叫聚类算法,就是只有特征数据,没有目标数据,让算法自动从数据中“学习知识”,将不一样类别的数据汇集到相应的类别中。github
K 均值的英文为K-Means,其含义是:算法
K 均值算法能够将一个没有被分类的数据集,划分到K 个类中。某个数据应该被划分到哪一个类,是经过该数据与群组中心点的类似度决定的,也就是该数据与哪一个类的中心点最类似,则该数据就应该被划分到哪一个类中。shell
关于如何计算事物之间的类似度,能够参考文章《计算机如何理解事物的相关性》。dom
使用K 均值算法的通常步骤是:机器学习
K 均值算法是一个聚类算法,sklearn 库中的 cluster 模块实现了一系列的聚类算法,其中就包括K 均值算法。学习
来看下KMeans 类的原型:code
KMeans( n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='deprecated', verbose=0, random_state=None, copy_x=True, n_jobs='deprecated', algorithm='auto')
能够看KMeans 类有不少参数,这里介绍几个比较重要的参数:
下面对一些二维坐标中的点进行聚类,看下如何使用K 均值算法。
下面是随机生成的三类坐标点,每类有20 个点,不一样类的点的坐标在不一样的范围内:
Ax = [20, 6, 14, 13, 8, 19, 20, 14, 2, 11, 2, 15, 19, 4, 4, 11, 13, 4, 15, 11] Ay = [14, 19, 17, 16, 3, 7, 9, 18, 20, 3, 4, 12, 9, 17, 14, 1, 18, 17, 3, 5] Bx = [53, 50, 46, 52, 57, 42, 47, 55, 56, 57, 56, 50, 46, 46, 44, 44, 58, 54, 47, 57] By = [60, 57, 57, 53, 54, 45, 54, 57, 49, 53, 42, 59, 54, 53, 50, 50, 58, 58, 58, 51] Cx = [77, 75, 71, 87, 74, 70, 74, 85, 71, 75, 72, 82, 81, 70, 72, 71, 88, 71, 72, 80] Cy = [85, 77, 82, 87, 71, 71, 77, 88, 81, 73, 80, 72, 90, 77, 89, 88, 83, 77, 90, 72]
咱们能够用 Matplotlib 将这些点画在二维坐标中,代码以下:
import matplotlib.pyplot as plt plt.scatter(Ax + Bx + Cx, Ay + By + Cy, marker='o') plt.show()
画出来的图以下,可看到这三类点的分布范围仍是一目了然的。
关于如何使用 Matplotlib 绘图,能够参考文章《如何使用Python 进行数据可视化》。
下面使用K 均值算法对数据点进行聚类。
建立K 均值模型对象:
from sklearn.cluster import KMeans # 设置 K 值为 3,其它参数使用默认值 kmeans = KMeans(n_clusters=3)
准备数据,共三大类,60 个坐标点:
train_data = [ # 前20 个为 A 类点 [20, 14], [6, 19], [14, 17], [13, 16], [8, 3], [19, 7], [20, 9], [14, 18], [2, 20], [11, 3], [2, 4], [15, 12], [19, 9], [4, 17], [4, 14], [11, 1], [13, 18], [4, 17], [15, 3], [11, 5], # 中间20 个为B 类点 [53, 60], [50, 57], [46, 57], [52, 53], [57, 54], [42, 45], [47, 54], [55, 57], [56, 49], [57, 53], [56, 42], [50, 59], [46, 54], [46, 53], [44, 50], [44, 50], [58, 58], [54, 58], [47, 58], [57, 51], # 最后20 个为C 类点 [77, 85], [75, 77], [71, 82], [87, 87], [74, 71], [70, 71], [74, 77], [85, 88], [71, 81], [75, 73], [72, 80], [82, 72], [81, 90], [70, 77], [72, 89], [71, 88], [88, 83], [71, 77], [72, 90], [80, 72], ]
拟合模型:
kmeans.fit(train_data)
对数据进行聚类:
predict_data = kmeans.predict(train_data)
查看聚类结果,其中的0,1,2 分别表明不一样的类别:
>>> print(predict_data) [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
经过观察最终的聚类结果predict_data,能够看到,前,中,后20 个数据分别被分到了不一样的类中,也很是符合咱们的预期,说明K 均值算法的聚类结果仍是很不错的 。
由于本例中的二维坐标点的分布界限很是明显,因此最终的聚类结果很是不错。
本篇文章主要介绍了K 均值算法的原理,及sklearn 库对它的实现,而且演示了如何使用K 均值算法对二维数据点进行聚类。
(本节完。)
推荐阅读:
欢迎关注做者公众号,获取更多技术干货。