K 均值聚类是一种流行的无监督机器学习算法,用于将数据集划分为 K 个不同的、不重叠的子集(聚类)。以下是有关 K 均值聚类的要点摘要:
-
目的:
- **最小化集群内差异:**K-means 旨在最小化数据点与其各自的聚类质心之间的平方距离之和。它通过迭代地将数据点分配给聚类并更新聚类质心来实现此目的。
-
算法步骤:
- **初始化:**随机选择 K 个数据点作为初始聚类质心。
- **分配步骤:**将每个数据点分配给最近的质心,形成 K 个聚类。
- **更新步骤:**重新计算质心作为每个聚类中数据点的平均值。
- **迭 代:**重复赋值和更新步骤,直到收敛(当质心不再发生重大变化时)。
-
簇数 (K):
- K 的选择至关重要,通常需要领域知识或其他技术(例如,弯头法或轮廓分析)来确定最佳值。
-
对初始质心的敏感性:
- K-means 对初始质心选择敏感。不同的初始化可能会导致不同的最终集群。
-
缩放:
- 特征缩放非常重要,因为 K 均值是基于距离的。StandardScaler 通常用于标准化功能。
-
应用:
- K-means广泛应用于各个领域,包括图像分割、客户分割、异常检测和文档聚类。
-
局限性:
- 对异常值的敏感度:K-means 对异常值很敏感,因为它们会显著影响聚类分配。
- 假设是球形聚类:当聚类是球形、大小相等且密度相似时,K-means 效果很好,但对于大小不均匀或非球形聚类时,它可能难以处理。
- 固定的簇数:该算法需要预先指定的簇数 (K)。
-
评估指标:
- 内部评估指标(例如,集群内的平方和)和外部指标(例如,调整后的兰德指数)可用于评估聚类结果的质量。
import pandas as pd
import os
os.environ['LOKY_MAX_CPU_COUNT'] = '4' # Set to the number of cores you want to use
import os
os.environ['OMP_NUM_THREADS'] = '1'beer = pd.read_csv('data.txt', sep=' ')
print(beer)X=beer[['calories','sodium','alcohol','cost']]
K-means 聚类
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, n_init=10).fit(X)
km2 = KMeans(n_clusters=2, n_init=10).fit(X)beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
print(beer.sort_values('cluster'))from pandas.plotting import scatter_matrix
cluster_centers=km.cluster_centers_
cluster_centers_2=km2.cluster_centers_print(beer.groupby('cluster').mean())
print(beer.groupby('cluster2').mean())centers=beer.groupby('cluster').mean().reset_index()
import matplotlib.pyplot as plt
plt.rcParams['font.size']=14import numpy as np
colors = np.array(['red', 'green', 'blue', 'yellow'])plt.scatter(beer["calories"], beer["alcohol"],c=colors[beer["cluster"]])
plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')
plt.xlabel("Calories")
plt.ylabel("Alcohol")plt.show()
scatter_matrix(beer[['calories','sodium','alcohol','cost']],s=100,alpha=1,c=colors[beer['cluster']],figsize=(10,10))
plt.suptitle('With 3 centroids initialized')plt.show()
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10,10))
plt.suptitle("With 2 centroids initialized")
plt.show()缩放数据
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_scaled=scaler.fit_transform(X)此线使用缩放器的方法缩放"X"中的要素。该方法计算"X"的平均值和标准差,然后对其进行标准化。
print(X_scaled)
km = KMeans(n_clusters=3,n_init=10).fit(X_scaled)
此行创建一个包含 3 个聚类的 KMeans 聚类对象,并对缩放的要素"X_scaled"执行 k 均值聚类。
该参数表示使用不同的质心种子运行 k 均值算法的次数。
beer["scaled_cluster"] = km.labels_
将新列"scaled_cluster"添加到"beer"DataFrame,并分配从 k 均值聚类中获得的聚类标签。
beer.sort_values("scaled_cluster")
按"scaled_cluster"列对"beer"DataFrame 进行排序。
如前所述,请注意,此操作不会修改原始 DataFrame,除非重新分配或使用
beer.groupby("scaled_cluster").mean()
from pandas.plotting import scatter_matrix
scatter_matrix(X, c=colors[beer.scaled_cluster], alpha=1, figsize=(10,10), s=100)
此线为"X"中的原始要素创建散点图矩阵,其中点根据缩放的聚类标注 ('colors[beer.scaled_cluster]') 进行着色。
'alpha'、'figsize' 和 's' 参数分别控制透明度、图形大小和标记大小。
plt.show()
聚类评估 : 轮廓系数
from sklearn import metrics
score_scaled=metrics.silhouette_score(X,beer.scaled_cluster)这将计算存储在"beer"DataFrame 的"scaled_cluster"列中的聚类结果的轮廓分数。
轮廓分数的范围从 -1 到 1,其中高值表示对象与其自己的聚类匹配良好,而与相邻聚类的匹配度较差。
score=metrics.silhouette_score(X,beer.cluster)
同样,这将计算存储在"beer"数据帧的"cluster"列中的聚类结果的轮廓分数。
print(score_scaled,score)
#这将打印两个聚类结果的计算轮廓分数。scores = []
for k in range(2,20):
labels = KMeans(n_clusters=k,n_init=10).fit(X).labels_
score = metrics.silhouette_score(X, labels)
scores.append(score)print(scores)
plt.plot(list(range(2,20)),scores)
plt.xlabel('Number of Clusters Initialized')
plt.ylabel('Sihouette Score')plt.show()
DBSCAN 群集
from sklearn.cluster import DBSCAN
db=DBSCAN(eps=10,min_samples=2).fit(X)此行创建具有指定参数的 DBSCAN 对象(用于在邻域中考虑的两个样本之间的最大距离,
以及形成密集区域所需的最小样本数)。然后,它将 DBSCAN 模型拟合到数据"X"。
labels=db.labels_
此行检索 DBSCAN 分配给每个数据点的群集标签。这些标签包括聚类分配以及噪声点(标记为 -1)。
beer['cluster_db']=labels
此行将新列"cluster_db"添加到"beer"数据帧中,并将聚类标签分配给每个相应的数据点。
beer.sort_values('cluster_db')
此行按"cluster_db"列对"beer"DataFrame 进行排序。但是,请注意,此操作不会修改原始 DataFrame。
如果要使用排序后的值更新"beer",则需要将其分配回去或使用参数。
beer.groupby('cluster_db').mean()
此行使用 pandas 中的方法计算每个聚类的每个要素的平均值。
from pandas.plotting import scatter_matrix
scatter_matrix(X, c=colors[beer.cluster_db], alpha=1, figsize=(10, 10), s=100)此线为"X"中的要素创建散点图矩阵,其中点根据聚类标签("colors[beer.cluster_db]")进行着色。
'alpha'、'figsize' 和 's' 参数分别控制透明度、图形大小和标记大小。
plt.show()