📅  最后修改于: 2023-12-03 15:27:18.439000             🧑  作者: Mango
在数据挖掘中,聚类是一种常见的算法。但是在应用聚类算法时,我们需要确定数据中的簇数以保证算法的有效性。本文将介绍一些常用的方法来帮助确定簇数。
肘部法则是最常见的方法之一,其核心思想是通过观察聚类的误差平方和(SSE)与簇数的关系来确定簇数。 SSE定义为每个数据点到所属簇的中心点的距离的平方和。当簇数增加时,SSE会逐渐减小,直到一个拐点停止下降。
下面是一个示例代码段,展示了如何使用肘部法则来确定数据集的最佳簇数:
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
#生成数据集,这里以四维特征为例
X = np.random.randn(1000, 4)
#KMeans聚类算法
sse = []
for k in range(1, 10):
kmeans = KMeans(n_clusters=k, max_iter=1000).fit(X)
sse.append(kmeans.inertia_)
# 绘制 SSE 对 k 的曲线图
plt.figure(figsize=(6, 6))
plt.plot(range(1, 10), sse, marker='o')
plt.xlabel('簇数量')
plt.ylabel('SSE')
plt.show()
代码解析:
numpy
库生成一个包含1000个样本,每个样本由4个随机特征的数据集。这里使用随机生成的数据样本,实际应用中需要根据数据集的特点选择合适的数据集。运行以上代码,将会看到如下的图表:
如图所示,当k=3时SSE出现拐点,说明3是数据集的最佳簇数。
轮廓系数是另一种常见方法,它通过计算聚类模型中任意两个点a与b的相似度以及聚类模型中a与其最近簇中点的相似度之差,计算出单个数据点的轮廓系数。最终得到所有数据点的轮廓系数均值,选择轮廓系数均值最大的簇数。
下面是一个示例代码段,展示了如何使用轮廓系数法来确定数据集的最佳簇数:
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import numpy as np
#生成数据集,这里以四维特征为例
X = np.random.randn(1000, 4)
#KMeans聚类算法
silhouette_scores = []
for k in range(2, 10):
kmeans = KMeans(n_clusters=k, max_iter=1000).fit(X)
silhouette_scores.append(silhouette_score(X, kmeans.labels_))
# 绘制 轮廓系数 对 k 的曲线图
plt.figure(figsize=(6, 6))
plt.plot(range(2, 10), silhouette_scores, marker='o')
plt.xlabel('簇数量')
plt.ylabel('轮廓系数')
plt.show()
代码解析:
numpy
库生成一个包含1000个样本,每个样本由4个随机特征的数据集。运行以上代码,将会看到如下的图表:
如图所示,当k=3时,轮廓系数达到了最大值,说明3是数据集的最佳簇数。
Gap statistic是一种通过比较原始数据集与随机数据集的聚类结果来确定最佳簇数的方法。其基本思想是在数据集的每个簇中插入随机数据点,并比较原始数据集与插入随机数据点后形成的聚类结果的质量差异。当随机数据点数越大,原始数据集与随机数据集的聚类结果越不同,说明原始数据集的簇数越优。
代码片段由于篇幅原因省略,具体实现可自行搜索gap statistic的相关资料。
以上三种方法是目前应用较为广泛的簇数确定方法,其中肘部法则和轮廓系数法是较为简单和快速的方法,而gap statistic需要的计算量则更大一些。在应用时,需要根据实际情况选择合适的方法和数据集,以保证最终的聚类效果。