用Python进行AI数据分析进阶教程55:
确定聚类数K的方法
关键词:K-Means聚类、肘部法则、轮廓系数法、间隙统计量法、簇内误差平方和
摘要:本文介绍了在Python机器学习中确定K-Means聚类算法中合适聚类数K的三种常用方法。肘部法则通过计算不同K值下的簇内误差平方和来确定K值,寻找误差平方和下降幅度明显变缓的点。轮廓系数法衡量样本与所属簇的紧密程度及与其他簇的分离程度,选择轮廓系数最大的K值作为最佳聚类数。间隙统计量法通过比较实际数据的簇内分散程度与参考分布的期望簇内分散程度来确定K值,选择间隙统计量最大的K值。每种方法均包括原理、关键点、注意点及示例代码,并通过图形形式呈现结果,帮助直观确定最优聚类数K。
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
在 Python 机器学习中,确定 K - Means 聚类算法里合适的聚类数 K 至关重要。以下详细介绍几种常用方法,包含原理、关键点、注意点、示例代码及重点语句解读。
一、肘部法则(Elbow Method)
1、原理
肘部法则借助计算不同 K 值下的簇内误差平方和(Inertia)来确定合适的 K 值。簇内误差平方和指的是每个样本到其所属簇质心的距离的平方和。随着 K 值增大,每个簇包含的数据点减少,簇内误差平方和会逐步减小。当 K 达到合适的值时,再增加 K,簇内误差平方和的下降幅度会显著变缓,此转折点对应的 K 值就是适宜的聚类数,因其曲线形状类似肘部而得名。
2、关键点
- 精确计算簇内误差平方和:要准确算出每个 K 值下的簇内误差平方和,这是判断肘部的关键依据。
- 找准肘部位置:仔细观察误差平方和随 K 值变化的曲线,找出下降幅度明显变缓的点。
3、注意点
- 肘部不清晰:部分数据集上,肘部可能不明显,难以精准确定 K 值。
- 受局部最优解影响:K - Means 算法可能陷入局部最优解,不同运行结果会影响误差平方和的计算,进而干扰肘部的判断。
4、示例代码
Python脚本
# 导入 numpy 库,用于数值计算和数组操作
import numpy as np
# 导入 matplotlib 库的 pyplot 模块,用于绘制图形
import matplotlib.pyplot as plt
# 从 sklearn 库的 cluster 模块导入 KMeans 类,用于执行 K-Means 聚类算法
from sklearn.cluster import KMeans
# 从 sklearn 库的 datasets 模块导入 make_blobs 函数,用于生成聚类分析所需的示例数据
from sklearn.datasets import make_blobs
def generate_sample_data():
"""
生成示例数据
"""
# 调用 make_blobs 函数生成数据,n_samples 表示样本数量,centers 表示聚类中心数量
# cluster_std 表示簇的标准差,random_state 是随机数种子,保证结果可复现
# 取返回结果的第一个元素(即生成的数据点矩阵)作为返回值
return make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)[0]
def calculate_inertia(X, k_range):
"""
计算不同 K 值下的簇内误差平方和
:param X: 数据集
:param k_range: K 值的范围
:return: 包含不同 K 值下簇内误差平方和的列表
"""
# 初始化一个空列表,用于存储不同 K 值下的簇内误差平方和
inertia = []
# 遍历 k_range 中的每个 K 值
for k in k_range:
# 创建一个 KMeans 模型,n_clusters 为当前的 K 值,random_state 固定随机种子
kmeans = KMeans(n_clusters=k, random_state=0)
try:
# 使用数据集 X 拟合 KMeans 模型
kmeans.fit(X)
# 将当前 K 值下的簇内误差平方和添加到 inertia 列表中
inertia.append(kmeans.inertia_)
except Exception as e:
# 如果在拟合过程中出现异常,打印错误信息
print(f"在 K={k} 时发生错误: {e}")
# 返回存储不同 K 值下簇内误差平方和的列表
return inertia
def plot_elbow_curve(K, inertia):
"""
绘制肘部曲线
:param K: K 值的范围
:param inertia: 不同 K 值下的簇内误差平方和
"""
# 绘制 K 值和对应的簇内误差平方和的折线图,'bx-' 表示用蓝色的 x 标记和实线连接
plt.plot(K, inertia, 'bx-')
# 设置 X 轴的标签为 'Number of clusters (K)'
plt.xlabel('Number of clusters (K)')
# 设置 Y 轴的标签为 'Inertia'
plt.ylabel('Inertia')
# 设置图形的标题为 'The Elbow Method showing the optimal K'
plt.title('The Elbow Method showing the optimal K')
# 添加网格线,方便观察曲线走势
plt.grid(True)
# 自动调整图形布局,避免标签重叠
plt.tight_layout()
# 显示绘制好的图形
plt.show()
if __name__ == "__main__":
# 调用 generate_sample_data 函数生成示例数据
X = generate_sample_data()
# 定义 K 值的范围,从 1 到 10
K = range(1, 11)
# 调用 calculate_inertia 函数,计算不同 K 值下的簇内误差平方和
inertia = calculate_inertia(X, K)
# 调用 plot_elbow_curv

38

被折叠的 条评论
为什么被折叠?



