相似文件
换一批
经管之家送您一份
应届毕业生专属福利!
求职就业群
感谢您参与论坛问题回答
经管之家送您两个论坛币!
+2 论坛币
K-均值聚类是一种简单的分区方法 ķķ 组或群集。 本质上,该过程如下: - 选择 ķķ重心。这些将是每个线段的中心点。
- 将数据点分配给最近的质心。
- 将质心值重新分配为每个群集的计算平均值。
- 将数据点重新分配到最近的质心。
- 重复直到数据点停留在同一群集中。
这是一个很好的GIF,可以使过程可视化的XX的是质心,彩色的点是分配给群集的数据点。
现在,让我们更详细地了解每个步骤。 选择初始质心值在讨论如何为k均值聚类初始化质心之前,我们必须首先确定将数据划分为多少个聚类。作为人类,看上面的例子,答案显然是三个。但是,如何在算法上做出决定呢? 肘法
一种方法是尝试许多不同的ķķ 并绘制出数据点距其各自质心的平均距离(群集内平均平方和),作为 ķķ。这将为您提供如下所示的内容。注意如何增加ķķ 值从1到2会大大降低每个数据点与其各自质心的平均距离,但是随着您继续增加ķķ改进开始逐渐减少。理想ķķ 值可以在该图的肘部找到。
不幸的是,这并不是一种精确的算法方法,因为它仍然取决于人工决定肘部的位置。此外,当无法明确区分肘部时(例如,曲线非常平滑时),此方法并不总是能很好地工作。 轮廓分析另一种更自动化的方法是构建具有一系列取值范围的k-means聚类模型的集合。 ķķ 然后评估每个模型以确定最佳聚类数。 我们可以使用Silhouette分析来评估每个模型。计算用于观察的Silhouette系数,然后将其平均以确定Silhouette得分。 该系数将平均集群内距离与平均最近集群距离相结合,以分配一个介于-1和1之间的值。零以下的值表示观测值可能在错误的集群中,而接近1的值表示观测值是错误的。非常适合该集群,并且与其他集群明显分开。该系数实质上测量的是观测值与相邻簇之间的接近程度,在这种情况下,期望与相邻簇之间的最大距离是可能的。
我们可以自动确定最佳的群集数量,ķķ,通过选择产生最高轮廓得分的模型。 - from sklearn.cluster import KMeans
- from sklearn.metrics import silhouette_score
- import numpy as np
- # Use silhouette score to find optimal number of clusters to segment the data
- num_clusters = np.arange(2,10)
- results = {}
- for size in num_clusters:
- model = KMeans(n_clusters = size).fit(data)
- predictions = model.predict(data)
- results[size] = silhouette_score(data, predictions)
- best_size = max(results, key=results.get)
复制代码 重心初始化一旦选择了要将数据分区到的组,就有几个选择初始质心值的选项。最简单的方法?选择ķķ从您的数据集中随机点,并称之为一天。但是,重要的是要记住,k均值聚类会导致近似解收敛到局部最优值-因此,从质心选择不当开始可能会打乱您的聚类(即,选择离群值作为质心)。常见的解决方案是多次运行聚类算法,然后选择以最佳聚类性能结束的初始值(通过与质心的最小平均距离进行度量-通常使用聚类内平方和)。您可以使用n_init参数在sci-kit learning中指定要对K-means聚类模型执行的随机初始化的次数。 另一种方法是在数据集的样本上使用另一种聚类技术,例如层次聚类,并使用结果聚类质心作为初始k均值质心。此方法通常为大型数据集上的k均值聚类应用保留。您也可以以最分散的方式(使质心之间的距离最大)选择初始值,以防止发生不必要的局部收敛。 将数据点分配给集群
选择初始质心后,下一步就是将每个数据点分配给一个群集。从数学上讲,您可以这样做: S(t)i={xp:∥∥xp−m(t)i∥∥2≤∥∥xp−m(t)j∥∥2∀j,1≤j≤k} 集群表示为集合
表示质心值(在第一个步骤之后的所有后续步骤中为平均值)。 将此翻译成英文,我们得到以下信息: 集合i包含从数据点(xp)到i(mi)平均值的距离小于从数据点到所有其他质心平均值(mj)的距离的所有数据点(x)。 计算新的质心值将每个数据点分配给一个群集后,将每个群集的质心值重新分配为该群集内所有数据点的平均值。 m(t+1)i=1∣∣S(t)i∣∣∑xj∈ S(t)ixj 处理大型数据集,是否不想对数据执行多次迭代?看看Bradley-Fayyad-Reina算法,该算法执行k均值的功能与k均值类似,仅对数据进行一次传递。 范例程式码
让我们看一下k均值对Iris数据集中的花朵进行分组的实现。首先,我们将导入一些库并加载数据集。 - from sklearn import datasets
- from sklearn.cluster import KMeans
- from scipy.spatial.distance import cdist, pdist
- import numpy as np
- iris = datasets.load_iris()
- # attributes of iris are ['target_names', 'data', 'target', 'DESCR', 'feature_names']
复制代码由此可见,我们将基于以下功能对数据库进行聚类: - 萼片长度(厘米)
- 萼片宽度(厘米)
- 花瓣长度(厘米)
- 花瓣宽度(厘米)
接下来,我们必须选择要将数据分成多少组。 - # Choosing the optimal k
- k_range = range(1,10)
- # Try clustering the data for k values ranging 1 to 10
- k_means_var = [KMeans(n_clusters = k).fit(iris.data) for k in k_range]
- centroids = [X.cluster_centers_ for X in k_means_var]
- k_euclid = [cdist(iris.data, cent, 'euclidean') for cent in centroids]
- dist = [np.min(ke, axis=1) for ke in k_euclid]
- # Calculate within-cluster sum of squares
- wcss = [sum(d**2) for d in dist]
- # Visualize the elbow method for determining k
- import matplotlib.pyplot as plt
- plt.plot(k_range, wcss)
- plt.show()
复制代码检查此图,k = 3似乎是最佳选择。 - kmeans = KMeans(n_clusters = 3)
- kmeans.fit(iris.data)
- kmeans.labels_
复制代码
让我们看看我们是如何做到的。k-means算法返回的标签是: - >> kmeans.labels_
- array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0])
复制代码
原始数据集中的标签是: - >> iris.target
- array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
复制代码
由此可见,我们的算法在对第一朵和第二朵花类型进行聚类方面做得不错,但有时却混淆了第二朵和第三朵花。注意,我们的算法对与数据相关的任何标签都是盲目的;只是将数据点分组。这就是为什么标签与我们的结果和提供的标签不一致的原因。
想要在k均值聚类中玩得
扫码加我 拉你入群
请注明:姓名-公司-职位
以便审核进群资格,未注明则拒绝
|