问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

K-means聚类算法中K值选择的肘部法则

创作时间:
作者:
@小白创作中心

K-means聚类算法中K值选择的肘部法则

引用
CSDN
1.
https://m.blog.csdn.net/m0_53244394/article/details/143945143

在K-means聚类算法中,确定最佳的聚类数K值是一个关键问题。本文将介绍如何使用肘部法则(Elbow Method)来确定最佳的K值,并通过Python代码实现这一过程。

WCSS的概念

WCSS(Within-Cluster Sum of Squares)是衡量聚类结果紧密程度的指标,表示每个样本点与其所属簇中心的距离平方和。简言之,就是样本类里面每个点到中心点的距离的平方,然后全部相加。

肘部法的详细步骤

  1. 确定K值范围
    选择一个合理的K值范围,一般从1开始,逐步增加,直到达到一个预设的最大K值(例如,K=10)。

  2. 计算不同K值下的WCSS
    对于每一个K值,执行以下步骤:

  • 运行K均值算法:将数据集划分为K个簇。
  • 计算WCSS:计算簇内误差平方和,即所有样本点到其所属簇中心的距离平方和。
  1. 绘制肘部图
    在图中,横轴表示簇的数量K,纵轴表示对应的WCSS值。绘制K值与WCSS的关系曲线。

  2. 识别“肘部”位置
    观察曲线中WCSS下降速度显著减缓的位置,即曲线出现“肘部”的点。该K值被认为是最佳的聚类数。

Python代码实现

下面通过Python代码实现上述过程:

import random
import matplotlib.pyplot as plt

# 一些数据点
data = [
    [1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0], [1, 6], [5, 6], [9, 9], [2, 7], [3, 3], [6, 4], [2, 5], [3, 5], [4, 5], [5, 5]
]

# K的取值范围
K = range(1, 10)
WCSS = []  # 存放各个K对应的WCSS

# 遍历K值
for i in K:
    index_list = []
    for j in range(i):
        while True:  # 随机选择中心点,但不能重复
            index_ = random.randint(0, len(data) - 1)
            if index_ in index_list:
                continue
            else:
                index_list.append(index_)
                break
    centerPoint = [data[x] for x in index_list]

    # 确定每个点在K值下的分类
    cate_data = {}
    for z in range(len(data)):
        distance = []
        for y in centerPoint:
            distance.append(((y[0] - data[z][0]) ** 2 + (y[1] - data[z][1]) ** 2) ** 0.5)
        cate_data[f"{data[z]}"] = distance.index(min(distance))

    # 计算每个K值对应的WCSS
    wcss_list = []
    for p in range(i):
        points = [eval(key) for key in cate_data.keys() if cate_data[key] == p]
        wcss_list.append(sum([((points[n][0] - centerPoint[p][0]) ** 2 + (points[n][1] - centerPoint[p][1]) ** 2) ** 0.5 for n in range(len(points))]))
    WCSS.append(sum(wcss_list))

# 绘制肘部图
plt.figure(figsize=(8, 5))
plt.plot(K, WCSS, 'bo-', markersize=8)
plt.xlabel('K')
plt.ylabel('WCSS')
plt.title('Elbow Method => K')
plt.xticks(K)
plt.grid(True)
plt.show()

运行上述代码,可以得到如下的图像:

从图中可以看出,K在4或者5这个点附近有一个明显的拐点,因此我们可以认为最佳的K值为4或者5。

通过本文的介绍和代码实现,读者应该能够掌握如何使用肘部法则来确定K-means聚类算法中的最佳K值。这种方法在实际应用中非常实用,能够帮助我们更好地进行聚类分析。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号