K-均值聚类算法计算质心并进行迭代,直到找到最佳质心为止,它假定群集的数目是已知的,它也称为扁平聚类算法。通过算法从数据中识别出的簇数以K均值中的" K"表示。
在该算法中,将数据点分配给群集,以使数据点和质心之间的平方距离之和最小。应当理解,簇内的较少变化将导致相同簇内的更多相似数据点。
K均值算法
无涯教程可以通过以下步骤来了解K-Means聚类算法的工作原理-
第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()
接下来,使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示例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均值学习的聚类中心。
以下代码行将学习到的集群标签与在其中找到的真实标签匹配:
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%。
聚类算法 - K-Means - 无涯教程网无涯教程网提供K-均值聚类算法计算质心并进行迭代,直到找到最佳质心为止,它假定群集的数目是已知的...https://www.learnfk.com/python-machine-learning/machine-learning-with-python-clustering-algorithms-k-means.html