?
K 均值聚类是一种流行的无监督机器学习算法,用于将数据集划分为 K 个不同的、不重叠的子集(聚类)。以下是有关 K 均值聚类的要点摘要:
目的:
算法步骤:
簇数 (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']=14
import 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()