目录
基本原理
代码实现:
肘部法则(Elbow Method):
轮廓系数(Silhouette Coefficient)
Gap Statistic(间隙统计量):
Calinski-Harabasz Index(Calinski-Harabasz指数):
基本原理
这些方法(肘部法则、轮廓系数、Gap Statistic、Calinski-Harabasz Index)都是用于确定聚类算法中的 n_clusters
(簇的数量)参数,但它们之间存在一些区别。下面是它们的主要特点以及适用情况的总结:
-
肘部法则(Elbow Method):
-
轮廓系数(Silhouette Coefficient):
- 特点:计算每个样本的轮廓系数(介于-1和1之间),并计算出所有样本的平均轮廓系数。最大化平均轮廓系数可以确定最佳的
n_clusters
。 - 适用情况:适用于各种类型的数据集,尤其是数据分布相对均匀且没有明显的几何形状的聚类结构。需要注意的是,轮廓系数的计算复杂度较高,对于大型数据集可能会有一定的性能开销。
- 特点:计算每个样本的轮廓系数(介于-1和1之间),并计算出所有样本的平均轮廓系数。最大化平均轮廓系数可以确定最佳的
-
Gap Statistic(间隙统计量):
-
Calinski-Harabasz Index(Calinski-Harabasz指数):
在选择适当的方法时,应综合考虑以下因素:
- 数据特征:数据集的聚类结构、形状、噪声以及是否具有明显的几何形态等特征。
- 算法要求:不同的方法可能对数据集的假设和计算复杂度有不同的要求。
- 领域知识:对数据集具有领域知识,可以帮助理解数据的特点,并选择适合的评估指标和方法。
代码实现:
肘部法则(Elbow Method):
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 肘部法则(Elbow Method):绘制不同 n_clusters 下的聚类误差平方和(SSE)曲线。
# 观察 SSE 曲线的形状,找到一个"肘部弯曲点",
# 即在该点后,SSE 的下降速度变得缓慢。
# "肘部弯曲点"对应的 n_clusters 值就是一个合适的选择。
#
# 例如,在上述代码示例中,使用 plt.plot(k_range, sse, 'bx-') 绘制了 SSE 曲线。观察曲线,如果在某个 n_clusters 值处出现明显弯曲,且在该点之后 SSE 的下降速度变得缓慢,那么该 n_clusters 值可以被认为是一个合适的选择。
# 加载Iris数据集
iris = load_iris()
# 构造K-Means聚类模型
model = KMeans()
# 肘部法则选择n_clusters
sse = []
k_range = range(2, 10) # 需要尝试的n_clusters范围
for k in k_range:
model.set_params(n_clusters=k)
model.fit(iris.data)
sse.append(model.inertia_)
plt.plot(k_range, sse, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('SSE')
plt.title('The Elbow Method')
plt.show()
# 轮廓系数选择n_clusters
silhouette_scores = []
for k in k_range:
model.set_params(n_clusters=k)
labels = model.fit_predict(iris.data)
score = silhouette_score(iris.data, labels)
silhouette_scores.append(score)
plt.plot(k_range, silhouette_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Coefficient')
plt.title('Silhouette Score')
plt.show()
轮廓系数(Silhouette Coefficient)
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 加载Iris数据集
iris = load_iris()
# 构造K-Means聚类模型
model = KMeans()
k_range = range(2, 10) # 需要尝试的n_clusters范围
silhouette_scores = []
for k in k_range:
model.set_params(n_clusters=k)
labels = model.fit_predict(iris.data)
score = silhouette_score(iris.data, labels)
silhouette_scores.append(score)
plt.plot(k_range, silhouette_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Coefficient')
plt.title('Silhouette Score')
plt.show()
-
Gap Statistic(间隙统计量):
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances
from sklearn.metrics import silhouette_score
# 选择 Gap Statistic 最大的 n_clusters 值。
# 加载Iris数据集
iris = load_iris()
# 构造K-Means聚类模型
model = KMeans()
k_range = range(2, 10) # 需要尝试的n_clusters范围
gap_scores = []
for k in k_range:
model.set_params(n_clusters=k)
labels = model.fit_predict(iris.data)
dist_matrix = pairwise_distances(iris.data)
gap = np.mean(np.log(np.mean(np.min(dist_matrix[:, labels], axis=1))))
gap_scores.append(gap)
plt.plot(k_range, gap_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Gap Statistic')
plt.title('Gap Statistic')
plt.show()
-
Calinski-Harabasz Index(Calinski-Harabasz指数):
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_score
# 选择具有最大 Calinski-Harabasz 指数的 n_clusters 值。
# 加载Iris数据集
iris = load_iris()
# 构造K-Means聚类模型
model = KMeans()
k_range = range(2, 10) # 需要尝试的n_clusters范围
calinski_scores = []
for k in k_range:
model.set_params(n_clusters=k)
labels = model.fit_predict(iris.data)
score = calinski_harabasz_score(iris.data, labels)
calinski_scores.append(score)
plt.plot(k_range, calinski_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Calinski-Harabasz Index')
plt.title('Calinski-Harabasz Index')
plt.show()