机器学习:K-means算法及代码实现

1、K-means算法原理

        K-means算法是一种常用的聚类算法,其目的是将数据集划分为K个簇(clusters),使得每个簇内部的数据点尽可能相似,而簇与簇之间的数据点尽可能不同。以下是K-means算法的基本原理和步骤:

  1. 初始化:随机选择K个数据点作为初始的簇中心(centroids)。

  2. 分配:将每个数据点分配到最近的簇中心,形成K个簇。这里的“最近”通常是指欧氏距离最小。

  3. 更新:重新计算每个簇的中心,通常是簇内所有点的均值。

  4. 迭代:重复步骤2和3,直到簇中心不再发生显著变化,或者达到预设的迭代次数。

  5. 终止:当簇中心的变化小于某个阈值,或者达到最大迭代次数时,算法终止。

2、K-means算法的关键点包括:

  • K值的选择:K值的选择对算法的结果有很大影响,通常需要根据具体问题和数据集来确定。可以使用肘部法则(Elbow Method)来帮助选择K值。

  • 初始化的敏感性:K-means算法对初始簇中心的选择比较敏感,不同的初始化可能导致不同的聚类结果。为了减少这种影响,可以采用K-means++算法来选择更好的初始簇中心。

  • 局部最优解:K-means算法容易陷入局部最优解,即找到一个局部的簇中心配置,但可能不是全局最优的。可以通过多次运行算法,每次使用不同的初始簇中心,然后选择最佳结果来缓解这个问题。

  • 数据的尺度:K-means算法对数据的尺度敏感,因此在应用K-means之前,通常需要对数据进行标准化处理。

3、代码

数据预处理

# 读取数据文件,这里假设数据文件是制表符分隔的文本文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')

# 选择数据集中的四列作为特征
x = beer[['calories', 'sodium', 'alcohol', 'cost']]

运用循环尝试不同的聚类数目

# 初始化一个空列表来存储轮廓系数
scores = []

# 遍历2到9的整数,尝试不同的聚类数目
for k in range(2, 10):
    # 用KMeans算法进行聚类,n_clusters指定聚类数目,n_init指定初始化质心的次数
    labels = KMeans(n_clusters=k, n_init='auto').fit(x).labels_
    
    # 计算轮廓系数,用于评估聚类效果
    score = metrics.silhouette_score(x, labels)
    
    # 将计算得到的轮廓系数添加到scores列表中
    scores.append(score)

使用KMeans算法进行2类聚类

# 使用KMeans算法进行2类聚类
label = KMeans(n_clusters=2, n_init='auto').fit(x).labels_

# 计算并打印2类聚类的轮廓系数
score = metrics.silhouette_score(x, label)

4、结果

5、完整代码

# 导入必要的库
import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics

# 读取数据文件,这里假设数据文件是制表符分隔的文本文件
beer = pd.read_table("data.txt", sep=' ', encoding='utf8', engine='python')

# 选择数据集中的四列作为特征
x = beer[['calories', 'sodium', 'alcohol', 'cost']]

# 初始化一个空列表来存储轮廓系数
scores = []

# 遍历2到9的整数,尝试不同的聚类数目
for k in range(2, 10):
    # 用KMeans算法进行聚类,n_clusters指定聚类数目,n_init指定初始化质心的次数
    labels = KMeans(n_clusters=k, n_init='auto').fit(x).labels_
    
    # 计算轮廓系数,用于评估聚类效果
    score = metrics.silhouette_score(x, labels)
    
    # 将计算得到的轮廓系数添加到scores列表中
    scores.append(score)

# 打印不同聚类数目对应的轮廓系数
print(scores)

# 使用KMeans算法进行2类聚类
label = KMeans(n_clusters=2, n_init='auto').fit(x).labels_

# 计算并打印2类聚类的轮廓系数
score = metrics.silhouette_score(x, label)
print(score)

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值