K-means 聚类算法

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()

相关推荐
这个男人是小帅8 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
Shy9604184 小时前
Doc2Vec句子向量
python·语言模型
ChoSeitaku6 小时前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
Fuxiao___7 小时前
不使用递归的决策树生成算法
算法
我爱工作&工作love我7 小时前
1435:【例题3】曲线 一本通 代替三分
c++·算法
秀儿还能再秀7 小时前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
学术搬运工7 小时前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
白-胖-子7 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级