You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求K-modes聚类肘部法最优K值自动选择的Python代码

自动选择K-modes聚类最优K值的Python实现

针对二进制数据集的K-modes聚类,我们可以通过自动检测肘部点的方式替代人工判断,核心思路是计算成本曲线各点到首尾连线的垂直距离,距离最大的点即为最优K值——该点之后成本的下降速度会显著放缓,符合肘部法的核心逻辑。

完整实现代码

import numpy as np
import matplotlib.pyplot as plt
from kmodes.kmodes import KModes

# 计算不同聚类数K对应的成本值
cost = []
k_range = range(1, 10)
for num_clusters in k_range:
    kmode = KModes(n_clusters=num_clusters, init="Huang", n_init=10)
    kmode.fit_predict(newdf_matrix)
    cost.append(kmode.cost_)

# 定义自动检测肘部点的函数
def find_elbow_point(k_values, cost_values):
    k = np.array(k_values)
    cost = np.array(cost_values)
    
    # 计算成本曲线首尾点的直线方程
    x1, y1 = k[0], cost[0]
    x2, y2 = k[-1], cost[-1]
    slope = (y2 - y1) / (x2 - x1)
    intercept = y1 - slope * x1
    
    # 计算每个点到直线的垂直距离
    distances = np.abs(slope * k - cost + intercept) / np.sqrt(slope**2 + 1)
    
    # 排除K=1(无实际聚类意义),取距离最大的点为肘部点
    elbow_idx = np.argmax(distances[1:]) + 1
    optimal_k = k[elbow_idx]
    return optimal_k, distances

# 获取最优K值并输出
optimal_k, _ = find_elbow_point(k_range, cost)
print(f"自动选择的最优聚类数K为: {optimal_k}")

# 可视化结果
plt.figure(figsize=(8,5))
plt.plot(k_range, cost, 'bo-', label='成本曲线')
plt.scatter(optimal_k, cost[optimal_k-1], color='red', s=120, label=f'肘部点(K={optimal_k})')
plt.xlabel('聚类数K')
plt.ylabel('成本值')
plt.title('K-modes聚类肘部曲线及自动选择结果')
plt.legend()
plt.show()

说明

  • 该方法通过数学方式量化肘部点的位置,避免人工判断的主观性和代码中断问题。
  • 可根据数据集调整k_range的范围(比如扩展为range(2,15)),或修改距离计算逻辑(如改用斜率二阶差分)适配不同场景。
  • 若需要更严谨的评估,也可结合轮廓系数(针对分类数据的适配版本)交叉验证最优K值。

内容的提问来源于stack exchange,提问作者Mr.Slow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:15:37