寻求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
相关产品推荐
相关产品推荐

