K-means 聚类算法

2023-12-26 06:27:40

?

K 均值聚类是一种流行的无监督机器学习算法,用于将数据集划分为 K 个不同的、不重叠的子集(聚类)。以下是有关 K 均值聚类的要点摘要:

  1. 目的:

    • 最小化集群内差异:K-means 旨在最小化数据点与其各自的聚类质心之间的平方距离之和。它通过迭代地将数据点分配给聚类并更新聚类质心来实现此目的。
  2. 算法步骤:

    • 初始化:随机选择 K 个数据点作为初始聚类质心。
    • 分配步骤:将每个数据点分配给最近的质心,形成 K 个聚类。
    • 更新步骤:重新计算质心作为每个聚类中数据点的平均值。
    • 迭 代:重复赋值和更新步骤,直到收敛(当质心不再发生重大变化时)。
  3. 簇数 (K):

    • K 的选择至关重要,通常需要领域知识或其他技术(例如,弯头法或轮廓分析)来确定最佳值。
  4. 对初始质心的敏感性:

    • K-means 对初始质心选择敏感。不同的初始化可能会导致不同的最终集群。
  5. 缩放:

    • 特征缩放非常重要,因为 K 均值是基于距离的。StandardScaler 通常用于标准化功能。
  6. 应用:

    • K-means广泛应用于各个领域,包括图像分割、客户分割、异常检测和文档聚类。
  7. 局限性:

    • 对异常值的敏感度:K-means 对异常值很敏感,因为它们会显著影响聚类分配。
    • 假设是球形聚类:当聚类是球形、大小相等且密度相似时,K-means 效果很好,但对于大小不均匀或非球形聚类时,它可能难以处理。
    • 固定的簇数:该算法需要预先指定的簇数 (K)。
  8. 评估指标:

    • 内部评估指标(例如,集群内的平方和)和外部指标(例如,调整后的兰德指数)可用于评估聚类结果的质量。
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()

文章来源:https://blog.csdn.net/m0_71778249/article/details/135201315
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。