自学内容网 自学内容网

《机器学习》——K-means聚类

k-means聚类简介

  • K - means 是一种无监督学习算法,用于聚类分析。它的主要目的是将给定的数据集划分成 K 个不同的簇(cluster),使得同一簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。这里的相似度通常是通过计算数据点之间的距离来衡量的,比如欧式距离。

k-means聚类流程

  • 1、初始化
    • 首先要确定聚类的数量 K。这个值通常是根据先验知识或者通过一些评估方法来确定的。例如,如果是对客户进行细分,可能根据业务经验确定大概分为几个不同的客户群体。
    • 随机选择 K 个数据点作为初始的聚类中心(centroid)。这些中心可以看作是每个簇的代表点。
  • 2、分配数据点到簇
    • 在这里插入图片描述
  • 3、更新聚类中心
    • 在这里插入图片描述
  • 4、重复步骤 2 和 3
    • 不断重复分配数据点和更新聚类中心的过程,直到聚类中心不再发生显著变化(例如,聚类中心的位置变化小于某个预先设定的阈值)或者达到最大的迭代次数。

k -means模型

  • 在这里插入图片描述

API参数

  • n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】
  • init:参初始化的方法,默认为’k-means++’
    • (1)‘k-means++’: 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.
    • (2) ‘random’: 随机从训练数据中选取初始质心。
    • (3) 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
  • n_init: 整形,缺省值=10
    • 用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
  • max_iter :
    • 执行一次k-means算法所进行的最大迭代数。
  • Tol: 与inertia结合来确定收敛条件。
  • precompute_distances:三个可选值,‘auto’,True 或者 False。
    • 预计算距离,计算速度更快但占用更多内存。
    • (1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。
    • (2)True:总是预先计算距离。
    • (3)False:永远不预先计算距离。
  • verbose:整形,默认值=0
  • random_state :随机状态
  • copy_x:布尔型,默认值=True
    • 当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。
  • algorithm:‘auto’,‘full’ or ‘elkan’.默认为’auto’
    • full:采用经典的EM算法
    • elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
    • auto:数据稀疏选择full模式,数据稠密选择elkan模式

属性

  • cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标
  • Labels_:
    • 每个点的分类标签。
  • inertia_:float型
    • 每个点到其簇的质心的距离之和。
  • n_iter_ : int
    • 迭代次数。

k-means聚类实例

对以下数据进行聚类处理,进行分类:

在这里插入图片描述

数据文件:通过网盘分享的文件:data.txt
链接: https://pan.baidu.com/s/19i7j4OttyWRkX13a7TXbRQ 提取码: hm1t
–来自百度网盘超级会员v2的分享

实例步骤

  • 导入所需库
  • 读取文件
  • 传入变量,自动计算轮廓系数得分
  • 绘制图像找到最佳簇值
  • 得到最佳轮廓系数得分

导入所需库

import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics
# 导入所需的库,pandas 用于数据处理,sklearn 中的 KMeans 用于聚类,metrics 用于评估聚类效果

读取文件

# 读取文件
beer = pd.read_table('data.txt', sep=' ', encoding='utf-8', engine='python')
# 从文本文件 data.txt 中读取数据,使用空格分隔,使用 utf-8 编码,使用 python 引擎

传入变量、自动计算轮廓系数得分

# 传入变量
x = beer[["calories", "sodium", "alcohol", "cost"]]
# 从 beer 数据集中选取 "calories", "sodium", "alcohol", "cost" 四列作为聚类的输入特征


"""根据分成不同的簇,自动计算轮廓系数得分"""
scores = []
# 创建一个空列表 scores 用于存储不同 k 值下的轮廓系数得分


for k in range(2, 10):
    labels = KMeans(n_clusters=k).fit(x).labels_
    # 使用 KMeans 算法对 x 进行聚类,将数据集分为 k 个簇,并获取聚类标签
    score = metrics.silhouette_score(x, labels)
    # 计算当前聚类结果的轮廓系数得分
    scores.append(score)
    # 将轮廓系数得分添加到 scores 列表中


print(scores)
# 打印存储轮廓系数得分的 scores 列表

结果:
在这里插入图片描述

绘制图像找到最佳簇值

# 绘制得分结果
import matplotlib.pyplot as plt
# 导入 matplotlib 库用于绘图


plt.plot(list(range(2, 10)), scores)
# 绘制 k 值(2 到 9)与轮廓系数得分的折线图


plt.xlabel('Number of Clusters Initialized')
# 设置 x 轴标签为 "Number of Clusters Initialized"


plt.ylabel('Sihouette Score')
# 设置 y 轴标签为 "Sihouette Score"


plt.show()
# 显示绘制的图像

在这里插入图片描述

得到最佳轮廓系数得分

km = KMeans(n_clusters=2).fit(x)
# 对 x 进行 KMeans 聚类,将数据集分为 2 个簇


beer['cluster'] = km.labels_
# 将聚类得到的标签添加到 beer 数据集中,列名为 cluster


score = metrics.silhouette_score(x, beer.cluster)
# 计算最终聚类结果(k=2)的轮廓系数得分


print(score)
# 打印最终聚类结果的轮廓系数得分

在这里插入图片描述


原文地址:https://blog.csdn.net/lou0720/article/details/145146689

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!