在Python中,确定聚类个数可以通过多种方法,其中包括肘部法则(elbow method)、轮廓系数(Silhouette Coefficient)、Gap Statistic等。下面我将简要介绍这些方法:
1. 肘部法则(Elbow Method)
肘部法则通过计算不同聚类个数下的误差平方和(WCSS)来判断最优的聚类数量。WCSS随着聚类数量的增加而减少,当聚类数量增加时WCSS下降的幅度逐渐变小,这个“肘部”点就是最佳聚类数量。
```python
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
假设dataset是已经加载好的数据集
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
kmeans.fit(dataset)
wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.title('Elbow Method')
plt.show()
2. 轮廓系数(Silhouette Coefficient)
轮廓系数通过计算样本到同簇其他样本的平均距离(a)和样本到最近不同簇的平均距离(b)来衡量聚类效果。轮廓系数的值在-1到1之间,值越大表示聚类效果越好。
```python
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
假设dataset是已经加载好的数据集
silhouette_scores = []
for i in range(2, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42)
kmeans.fit(dataset)
cluster_labels = kmeans.labels_
silhouette_avg = silhouette_score(dataset, cluster_labels)
silhouette_scores.append(silhouette_avg)
plt.plot(range(2, 11), silhouette_scores)
plt.xlabel('Number of clusters')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Coefficient')
plt.show()
3. Gap Statistic
Gap Statistic通过比较数据集的实际聚类结果与随机分布的聚类结果来评估聚类个数。计算每个k值的Gap值,并选择Gap值最大的k作为最佳聚类数量。
```python
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import numpy as np
import matplotlib.pyplot as plt
假设dataset是已经加载好的数据集
def gap_statistic(dataset, k_range):
wcss = []
for k in k_range:
kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)
kmeans.fit(dataset)
cluster_labels = kmeans.labels_
wcss.append(kmeans.inertia_)
计算参考数据集的平均WCSS
B = 100 参考数据集的数量
ref_wcss = []
for _ in range(B):
X, _ = make_blobs(n_samples=len(dataset), centers=k_range, cluster_std=0.5)
kmeans = KMeans(n_clusters=k_range, init='k-means++', random_state=42)
kmeans.fit(X)
ref_wcss.append(kmeans.inertia_)
ref_wcss = np.mean(ref_wcss, axis=0)
gap_values = []
for k in k_range:
gap = np.log(ref_wcss[k-1]) - np.log(wcss[k-1])
gap_values.append(gap)
选择Gap值最大的k作为最佳聚类数量
optimal_k = k_range[np.argmax(gap_values)] + 1
return optimal_k
假设k_range是预定义的聚类个数范围
optimal_k = gap_statistic(dataset, k_range)
print(f"Optimal number of clusters: {optimal_k}")
以上方法可以帮助你确定最佳的聚类个数。你可以根据数据的特点和需求选择合适的方法