聚类算法 - K-Means

聚类算法 - K-Means 首页 / 机器学习入门教程 / 聚类算法 - K-Means

K-均值聚类算法计算质心并进行迭代,直到找到最佳质心为止,它假定群集的数目是已知的,它也称为扁平聚类算法。通过算法从数据中识别出的簇数以K均值中的" K"表示。

在该算法中,将数据点分配给群集,以使数据点和质心之间的平方距离之和最小。应当理解,簇内的较少变化将导致相同簇内的更多相似数据点。

K均值算法

无涯教程可以通过以下步骤来了解K-Means聚类算法的工作原理-

链接:https://www.learnfk.comhttps://www.learnfk.com/python-machine-learning/machine-learning-with-python-clustering-algorithms-k-means.html

来源:LearnFk无涯教程网

第1步   - 首先,需要指定需要由该算法生成的簇数K。

第2步   - 接下来,随机选择K个数据点并将每个数据点分配给一个群集,简单来说,就是根据数据点的数量对数据进行分类。

第3步   - 现在,它将计算聚类质心。

第4步   - 接下来,继续迭代以下步骤,直到找到最佳质心为止,这是将数据点分配给不再变化的群集的情况

  •       4.1 - 首先,将计算数据点和形心之间的平方距离之和。

  •       4.2 - 现在,必须将每个数据点分配给比其他群集(质心)更近的群集。

  •       4.3 - 最后,通过获取聚类的所有数据点的平均值来计算聚类的质心。

K均值遵循期望最大化方法来解决此问题,期望步骤用于将数据点分配给最近的群集,而最大化步骤用于计算每个群集的质心。

使用K-means算法时,需要注意以下事项-

  • 在使用包含K-Means的聚类算法时,建议对数据进行标准化,因为此类算法使用基于距离的测量来确定数据点之间的相似性。

  • 由于K-Means的迭代性质和质心的随机初始化,K-Means可能停留在局部最优中,而可能不会收敛于全局最优。因此建议使用不同的质心初始化。

代码实现

以下两个实施K-Means聚类算法的示例将帮助无涯教程更好地理解-

无涯教程网

K-Means示例1

这是了解k均值如何工作的简单示例。在此示例中,将首先生成包含4个不同Blob的2D数据集,然后将应用k-means算法查看输出。

首先,将从导入必要的包开始-

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans

以下代码将生成2D,其中包含四个Blob-

from sklearn.datasets.samples_generator import make_blobs
X, y_true=make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)

接下来,以下代码将帮助可视化数据集-

plt.scatter(X[:, 0], X[:, 1], s=20);
plt.show()
K-Mean 用Python实现

接下来,使KMeans为对象,并提供聚类数量,训练模型并按以下方式进行预测-

kmeans=KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans=kmeans.predict(X)

现在,借助以下代码,可以绘制和可视化由k-means Python估计器选择的群集中心-

from sklearn.datasets.samples_generator import make_blobs
X, y_true=make_blobs(n_samples=400, centers=4, cluster_std=0.60, random_state=0)

接下来,以下代码将帮助可视化数据集-

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=20, cmap='summer')
centers=kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='blue', s=100, alpha=0.9);
plt.show()
K-Means Python Estimator

K-Means示例2

让无涯教程转到另一个示例,在该示例中,将对简单数字数据集应用K均值聚类, K-means将尝试在不使用原始标签信息的情况下识别相似的数字。

首先,将从导入必要的包开始-

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
import numpy as np
from sklearn.cluster import KMeans

接下来,从sklearn加载数字数据集并使其成为对象。还可以在此数据集中找到行数和列数,如下所示:

from sklearn.datasets import load_digits
digits=load_digits()
digits.data.shape
(1797, 64)

上面的输出显示此数据集包含1797个具有64个特征的样本。

可以像上面的示例1一样执行聚类-

kmeans=KMeans(n_clusters=10, random_state=0)
clusters=kmeans.fit_predict(digits.data)
kmeans.cluster_centers_.shape
(10, 64)

上面的输出显示K-means创建了具有64个特征的10个聚类。

fig, ax=plt.subplots(2, 5, figsize=(8, 3))
centers=kmeans.cluster_centers_.reshape(10, 8, 8)
for axi, center in zip(ax.flat, centers):
axi.set(xticks=[], yticks=[])
axi.imshow(center, interpolation='nearest', cmap=plt.cm.binary)

作为输出,将获得以下图像,该图像显示了通过k均值学习的聚类中心。

Simple Digits Dataset

以下代码行将学习到的集群标签与在其中找到的真实标签匹配:

from scipy.stats import mode
labels = np.zeros_like(clusters)
for i in range(10):
   mask = (clusters == i)
   labels[mask] = mode(digits.target[mask])[0]

接下来,无涯教程可以检查准确性,如下所示:

from sklearn.metrics import accuracy_score
accuracy_score(digits.target, labels)
0.7935447968836951

上面的输出显示精度约为80%。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

深入浅出gRPC -〔李林锋〕

Web协议详解与抓包实战 -〔陶辉〕

人人都能学会的编程入门课 -〔胡光〕

深度学习推荐系统实战 -〔王喆〕

成为AI产品经理 -〔刘海丰〕

性能优化高手课 -〔尉刚强〕

零基础实战机器学习 -〔黄佳〕

结构执行力 -〔李忠秋〕

PPT设计进阶 · 从基础操作到高级创意 -〔李金宝(Bobbie)〕

好记忆不如烂笔头。留下您的足迹吧 :)