当前位置: 首页 > news >正文

判断聚类 n_clusters

目录

基本原理

代码实现:

肘部法则(Elbow Method):

轮廓系数(Silhouette Coefficient)

Gap Statistic(间隙统计量):

Calinski-Harabasz Index(Calinski-Harabasz指数):


基本原理

这些方法(肘部法则、轮廓系数、Gap Statistic、Calinski-Harabasz Index)都是用于确定聚类算法中的 n_clusters(簇的数量)参数,但它们之间存在一些区别。下面是它们的主要特点以及适用情况的总结:

  1. 肘部法则(Elbow Method):

    • 特点:通过绘制聚类结果的损失函数值与 n_clusters 的关系图,找到“肘部”处的拐点作为最佳 n_clusters
    • 适用情况:当数据集的聚类结构明显时,该方法通常有效。但是,对于数据集没有明显的肘部的情况,或者肘部并不明显时,该方法可能无法提供确定的最佳 n_clusters
  2. 轮廓系数(Silhouette Coefficient):

    • 特点:计算每个样本的轮廓系数(介于-1和1之间),并计算出所有样本的平均轮廓系数。最大化平均轮廓系数可以确定最佳的 n_clusters
    • 适用情况:适用于各种类型的数据集,尤其是数据分布相对均匀且没有明显的几何形状的聚类结构。需要注意的是,轮廓系数的计算复杂度较高,对于大型数据集可能会有一定的性能开销。
  3. Gap Statistic(间隙统计量):

    • 特点:通过比较聚类结果与随机数据模拟结果的区别,使用统计学原理来选择最佳 n_clusters。Gap Statistic 值越大,表示聚类效果越好。
    • 适用情况:适合于具有明显聚类结构的数据集,对于不同密度、大小和形状的聚类表现较好。需要注意的是,该方法对数据集的假设要求较高,在某些情况下可能会得到不准确的结果。
  4. Calinski-Harabasz Index(Calinski-Harabasz指数):

    • 特点:通过计算聚类之间的离散度与聚类内部的紧密度之比,确定最佳的 n_clusters。Calinski-Harabasz 指数值越大,表示聚类效果越好。
    • 适用情况:适合于具有清晰、凸形状的聚类结构的数据集。对噪声和异常值比较敏感,处理非凸形状的聚类时可能出现一些偏差。

在选择适当的方法时,应综合考虑以下因素:

  • 数据特征:数据集的聚类结构、形状、噪声以及是否具有明显的几何形态等特征。
  • 算法要求:不同的方法可能对数据集的假设和计算复杂度有不同的要求。
  • 领域知识:对数据集具有领域知识,可以帮助理解数据的特点,并选择适合的评估指标和方法。

代码实现:

肘部法则(Elbow Method):

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 肘部法则(Elbow Method):绘制不同 n_clusters 下的聚类误差平方和(SSE)曲线。
# 观察 SSE 曲线的形状,找到一个"肘部弯曲点",
# 即在该点后,SSE 的下降速度变得缓慢。
# "肘部弯曲点"对应的 n_clusters 值就是一个合适的选择。
#
# 例如,在上述代码示例中,使用 plt.plot(k_range, sse, 'bx-') 绘制了 SSE 曲线。观察曲线,如果在某个 n_clusters 值处出现明显弯曲,且在该点之后 SSE 的下降速度变得缓慢,那么该 n_clusters 值可以被认为是一个合适的选择。# 加载Iris数据集
iris = load_iris()# 构造K-Means聚类模型
model = KMeans()# 肘部法则选择n_clusters
sse = []
k_range = range(2, 10)  # 需要尝试的n_clusters范围
for k in k_range:model.set_params(n_clusters=k)model.fit(iris.data)sse.append(model.inertia_)plt.plot(k_range, sse, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('SSE')
plt.title('The Elbow Method')
plt.show()# 轮廓系数选择n_clusters
silhouette_scores = []
for k in k_range:model.set_params(n_clusters=k)labels = model.fit_predict(iris.data)score = silhouette_score(iris.data, labels)silhouette_scores.append(score)plt.plot(k_range, silhouette_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Coefficient')
plt.title('Silhouette Score')
plt.show()

轮廓系数(Silhouette Coefficient)

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score# 加载Iris数据集
iris = load_iris()# 构造K-Means聚类模型
model = KMeans()k_range = range(2, 10)  # 需要尝试的n_clusters范围
silhouette_scores = []
for k in k_range:model.set_params(n_clusters=k)labels = model.fit_predict(iris.data)score = silhouette_score(iris.data, labels)silhouette_scores.append(score)plt.plot(k_range, silhouette_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Silhouette Coefficient')
plt.title('Silhouette Score')
plt.show()
  1. Gap Statistic(间隙统计量):

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances
from sklearn.metrics import silhouette_score
# 选择 Gap Statistic 最大的 n_clusters 值。
# 加载Iris数据集
iris = load_iris()# 构造K-Means聚类模型
model = KMeans()k_range = range(2, 10)  # 需要尝试的n_clusters范围
gap_scores = []
for k in k_range:model.set_params(n_clusters=k)labels = model.fit_predict(iris.data)dist_matrix = pairwise_distances(iris.data)gap = np.mean(np.log(np.mean(np.min(dist_matrix[:, labels], axis=1))))gap_scores.append(gap)plt.plot(k_range, gap_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Gap Statistic')
plt.title('Gap Statistic')
plt.show()
  1. Calinski-Harabasz Index(Calinski-Harabasz指数):

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_score
# 选择具有最大 Calinski-Harabasz 指数的 n_clusters 值。
# 加载Iris数据集
iris = load_iris()# 构造K-Means聚类模型
model = KMeans()k_range = range(2, 10)  # 需要尝试的n_clusters范围
calinski_scores = []
for k in k_range:model.set_params(n_clusters=k)labels = model.fit_predict(iris.data)score = calinski_harabasz_score(iris.data, labels)calinski_scores.append(score)plt.plot(k_range, calinski_scores, 'bx-')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('Calinski-Harabasz Index')
plt.title('Calinski-Harabasz Index')
plt.show()

http://www.lryc.cn/news/149437.html

相关文章:

  • 基于深度学习的网络异常检测方法研究
  • SSM 基于注解的整合实现
  • 工具类APP如何解决黏性差、停留短、打开率低等痛点?
  • 使用Java MVC开发高效、可扩展的Web应用
  • wandb安装方法及本地部署教程
  • stable diffusion实践操作-提示词插件安装与使用
  • 【SpringBoot】详细介绍SpringBoot中的bean
  • 【Nuxt实战】在Nuxt3项目中如何按需引入Element-plus
  • 专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发
  • Linux工具
  • Java项目-苍穹外卖-Day07-redis缓存应用-SpringCache/购物车功能
  • 零知识证明(zk-SNARK)(一)
  • linux中打印数据的行缓冲模式
  • 香橙派OrangePi zero H2+ 驱动移远4G/5G模块
  • 自动驾驶——【规划】记忆泊车特殊学习路径拟合
  • 【跟小嘉学 Rust 编程】十六、无畏并发(Fearless Concurrency)
  • Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)
  • SQL Server开启变更数据捕获(CDC)
  • 八、性能测试
  • 景芯SoC 芯片全流程培训
  • 目标检测后的图像上绘制边界框和标签
  • Leetcode: 1. 两数之和 【题解超详细】
  • PHP 通过 Redis 解决并发请求的操作问题
  • 浅谈信息论和信息编码
  • 【测试】笔试02
  • 公司内部网段多管控乱,该如何规范跨网文件传输交换?
  • Ceph入门到精通-OSD waring 设置建议
  • 软件测试工程师如何快速理解业务?
  • 【教程】部署apprtc服务中安装google-cloud-cli组件的问题及解决
  • C++——shared_ptr:make_shared的用处,与shared_ptr直接构造的区别