Python - 机器学习算法库Scikit-Leran使用详解8(K-means聚类算法)
作者:hangge | 2022-09-16 08:10
九、K-means 聚类算法
1,基本介绍
(1)K-means 算法是一种无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。
有监督学习与无监督学习区别:
- 有监督学习:有监督学习主要对有标签的数据集(即有“参考答案”)去构建机器学习模型,以尽可能对训练样本集外的数据进行标记(分类)预测。
- 无监督学习:无监督机器学习不需要标记数据。它通过研究训练样本,并根据它们的共同特征自动将它们分为几类。聚类就是典型的无监督学习。
- 从 N 个训练样本中随机选取 K 个样本作为质心(聚类中心)
- 对每个样本测量其到各个质心的距离,并把它归到最近的质心的所对应的类中
- 重新计算已经得到的各个类的质心
- 重复上面 2、3 两步操作,直到达到某个中止条件(迭代次数、新的质心与原质心相等或小于指定阈值等)
(3)K-means 的优缺点如下:
- 优点:原理简单,实现容易,运算效率高。主要需要调参的参数仅仅是簇数 K。
- 缺点:K 值的选取不好把握,设置簇的个数与随机初始化质心点可能影响聚类的最终效果。对噪音和异常点比较的敏感。
2,使用样例
(1)下面我们以 sklearn 库中自带的鸢尾花数据集对 K-means 聚类算法进行简单的应用。为了方便使用散点图绘制结果,这里我们只用了样本的两个特征(长度和宽度)来聚类。
#导入 sklearn 提供的鸢尾花数据 from sklearn.datasets import load_iris #导入 导入skleran 提供的K-means算法 from sklearn.cluster import KMeans #导入 matplotlib 的pyplot 模块 import matplotlib.pyplot as plt #导入pandas import pandas as pd #加载数据集 iris = load_iris() y = iris['target'] x = iris.data[:, :2] # 通过花萼的两个特征(长度和宽度)来聚类 k = 3 # 假设聚类为 3 类(默认分为 8 个 簇) #构建算法模型 model=KMeans(n_clusters=k) # n_clusters参数表示分成几个簇(此处k=3) #训练模型 model.fit(x) # 获取聚类后样本所属簇的对应编号(label_pred) label_pred = model.labels_ # labels_属性表示每个点的分簇号,会得到一个关于簇编号的数组 centroids = model.cluster_centers_ #cluster_center 属性用来获取簇的质心点,得到一个关于质心的二维数组 print("样本集中各样本的原始标签:", y) print("样本集聚类后各样本的分簇号:", label_pred) print("簇的质心点:", centroids) # 创建一个图像窗口 plt.figure() # 绘制样本点。c:表示颜色和色彩序列,此处与 cmap 颜色映射一起使用(cool是颜色映射值)s表示散点的的大小 plt.scatter(x[:, 0], x[:, 1], c=label_pred, s=50, cmap='cool') # 绘制质心点 plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=50) plt.show()
全部评论(0)