Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >确定聚类算法中的超参数

确定聚类算法中的超参数

作者头像
老齐
发布于 2022-12-09 12:39:14
发布于 2022-12-09 12:39:14
3.6K00
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

确定聚类算法中的超参数

聚类是无监督学习的方法,它用于处理没有标签的数据,功能强大,在参考资料 [1] 中已经介绍了几种常用的算法和实现方式。其中 K-均值(K-Means)算法是一种常用的聚类方法,简单且强大。

K-均值算法首先要定义簇的数量,即所谓的 k ——这是一个超参数。另外还需要定义初始化策略,比如随机指定 k 个簇的初始质心。但是如何更科学地确定这些参数,关系到 K-均值算法聚类结果的好坏。例如,分析网络用户的上网行为,假设收集到一些关于用户在网上的行为数据,要对这些数据进行聚类,那么应该有多少个聚类呢,也就是 k 应该是多少?如果是监督学习,由于数据集中有标签,可以利用训练集训练模型,让后用测试集评估模型的好坏,包括初始设置的各项超参数。但是,现在我们使用的数据集没有标签,这种方法在无监督学习中不再适用了。那么,这时候的超参数应该怎么设置?

对于 K-均值算法而言,可以通过惯性(Inertia)解决这个问题,找到最佳的聚类数量 k。

惯性

惯性的定义如下所示:

\sum_{i=1,\mu\in C_k}^n\begin{Vmatrix}x_i-\mu_j\end{Vmatrix}^2

其中

\mu_j

为数据点

x_i

所在簇

C_k

的质心(关于簇的质心或中心,详见参考资料 [1] 的介绍)。或者说,惯性就是簇内的样本与质心的距离(偏差)的平方和。惯性表示了聚类的一致性程度,它的值越小,则样本之间的一致性程度越高。

寻找最佳簇数

下面以一个示例,说明如何确定最佳的聚类数量。使用 Scikit-Learns 的 make_blobs 函数创建了一个具有二维特征的数据集。

必要的准备:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = [8,8]
sns.set_style("whitegrid")
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']

# 去掉 scikit-learns 的各种警告
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

def plot_data(X, kmeans_model=None, num_clusters=0, colors=colors):
    '''
    可视化地显示数据的聚类效果
    '''
    if num_clusters == 0:
        plt.scatter(X[:, 0], X[:, 1], c=colors[0])
    else:
        # 循环聚类的簇
        for cluster in range(num_clusters):
            plt.scatter(X[kmeans_model.labels_ == cluster, 0], X[kmeans_model.labels_ == cluster, 1],
                        c=colors[cluster])
    plt.show()

创建数据集,并可视化显示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.datasets import make_blobs
n_samples = 2000
n_features = 2
centers = 3
cluster_std = 2.5
X, y = make_blobs(n_samples=n_samples, n_features=n_features, centers=centers, 
                  cluster_std=cluster_std, random_state=42)
plot_data(X)

通过观察,可以断定,这个数据集中有 3 簇,因此 K-均值的最佳聚类数应该是 3。当然,我们还是假装不知道。

如果用 KMeans 模型,并假设 n_clusters=4 ,会得到如下所示结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=4, init="k-means++")
kmeans_model.fit(X)
plot_data(X, kmeans_model, num_clusters=4)

从图示中会发现,如果设定为 4 个聚类,显然不适合。

为了找到最适合的簇数,可以用下面所示的方法:绘制惯性的曲线,使用肘部方法找到最适合的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inertia_list = []
for num_clusters in range(1, 11):
    kmeans_model = KMeans(n_clusters=num_clusters, init="k-means++")
    kmeans_model.fit(X)
    inertia_list.append(kmeans_model.inertia_)
    
# 绘制惯性曲线
plt.plot(range(1,11),inertia_list)
plt.scatter(range(1,11),inertia_list)
plt.scatter(3, inertia_list[3], marker="X", s=300, c="r")
plt.xlabel("Number of Clusters", size=13)
plt.ylabel("Inertia Value", size=13)
plt.title("Different Inertia Values for Different Number of Clusters", size=17)

图中红色 X 号即为拐点,由此可知最佳聚类数值是 3。图中显示,如果簇的数量增加增加,惯性的值会继续减小,这致使聚类内包含的样本点进一步减少。过多的聚类会导致模型的性能下降,也会导致不理想的聚类结果。假设对用户进行了一次聚类分析,并且有许多小的簇。当某个个小簇的客户购买某件商品时,就只能针对少数其他潜在的买家进行推荐。但是,如果簇中的用户是一个大的一致性集合时,就可以直接针对更多的潜在买家。

因此,在本例中,最佳的聚类数是 3。按照这个值,训练模型,并可视化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kmeans_model = KMeans(n_clusters=3, init="k-means++")
kmeans_model.fit(X)
plot_data(X, kmeans_model, num_clusters=3)

寻找最优的初始化策略

KMeans 模型中,有一个参数 init ,用它可以设置初始质心的策略,也是一个超参数。它的值怎么确定,下面继续使用惯性。一般我们会在 k-means++random 两个值中进行选择,假设现在就如此。我们可以为每种初始化策略训练一个 K-均值模型,并比较其惯性值。获得较小惯性值的策略可作为最优策略。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
init_list = ["k-means++", "random"]
inertia_list = []
for init in init_list:
    kmeans_model = KMeans(n_clusters=4, init=init)
    kmeans_model.fit(X)
    inertia_list.append(kmeans_model.inertia_)
results = pd.DataFrame(data=inertia_list, columns=["Inertia Value"], index=init_list)
results

由输出结果可知,当 init='random' 时,惯性值较小,可以用选用这个初始化策略。

参考资料

[1] 聚类[DB/OL]. http://math.itdiffer.com/clustering.html , 2022.10.31.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
机器学习——KMeans
导入类库 1 from sklearn.cluster import KMeans 2 from sklearn.datasets import make_blobs 3 import numpy as np 4 import matplotlib.pyplot as plt   KMeans算法的过程:(假如有两类) 随机选择两个点作为聚类的中心 计算所有点距离两个中心的距离,选择距离较近的点作为类别。(例如:距离蓝点近,类别是蓝色) 计算已经分好类的各组数据的平均值,使用各组数据的平均值中心作为新的中心
py3study
2020/01/19
4370
通透!十大聚类算法全总结!!
这些聚类算法各有优缺点,适用于不同类型的数据和不同的应用场景。选择合适的聚类算法通常取决于具体的需求、数据的特性和计算资源。
Python编程爱好者
2023/11/28
5.1K0
通透!十大聚类算法全总结!!
机器学习(7)——聚类算法聚类算法
聚类算法 前面介绍的集中算法都是属于有监督机器学习方法,这章和前面不同,介绍无监督学习算法,也就是聚类算法。在无监督学习中,目标属性是不存在的,也就是所说的不存在“y”值,我们是根据内部存在的数据特征,划分不同的类别,使得类别内的数据比较相似。 我们对数据进行聚类的思想不同可以设计不同的聚类算法,本章主要谈论三种聚类思想以及该聚类思想下的三种聚类算法。666 本章主要涉及到的知识点有: “距离” K-Means算法 几种优化K-Means算法 密度聚类 算法思想:“物以类聚,人以群分” 本节首先通过聚类算法
DC童生
2018/04/27
3.7K0
机器学习(7)——聚类算法聚类算法
聚类-KMeans算法(图解算法原理)
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,也就是将数据分成K个簇的算法,其中K是用户指定的。
唔仄lo咚锵
2022/10/04
2.9K0
聚类-KMeans算法(图解算法原理)
Sklearn参数详解—聚类算法
聚类是一种非监督学习,是将一份给定数据集划分成k类,这一份数据集可能是某公司的一批用户,也可能是某媒体网站的一系列文章,如果是某公司的一批用户,那么k-means做的就是根据用户的表现对用户的分类;如果媒体的文章,那么k-means做的就是根据文章的类型,把他分到不同的类别。
张俊红
2018/07/30
1.6K0
Sklearn参数详解—聚类算法
k均值聚类
n_digits: 10, n_samples 1797, n_features 64 _______________________________________________________________________________ init time inertiahomo compl v-meas ARI AMI silhouette k-means++ 0.43s 69684 0.683 0.722 0.702 0.573 0.699 0.154 random 0.30s 69656 0.673 0.713 0.692 0.558 0.689 0.120 PCA-based 0.05s 70793 0.667 0.695 0.681 0.553 0.677 0.156 _______________________________________________________________________________
裴来凡
2022/05/29
5130
k均值聚类
嘿,敢不敢来聚个类!
A 某和 B 某青梅竹马,A 某通过 B 某认识了 C 某,发现兴趣爱好出奇一致,这三人就搞到了一起,成为了一个形影不离的小团体。这个小团体的形成,是自下而上的迭代过程。
Jack_Cui
2021/04/27
9700
嘿,敢不敢来聚个类!
机器学习中的聚类
聚类算法是一种无监督的机器学习算法。 它将一组数据分成若干个不同的群组,使得每个群组内部的数据点相似度高,而不同群组之间的数据点相似度低。常用的相似度计算方法有欧式距离法。
@小森
2024/05/24
820
机器学习中的聚类
AI - 聚类算法
💥聚类算法是一种无监督学习方法,用于将数据集中的对象划分为若干个簇,使得同一个簇内的对象之间具有较高的相似性,而不同簇的对象之间具有较大的差异性。
@小森
2024/03/22
2170
K-Means算法实例
版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/chengyuqiang/article/details/88819658
程裕强
2019/07/01
8130
K-Means算法实例
【机器学习】K-means聚类的最优k值的选取(含代码示例)
数据科学领域中,聚类是一种无监督学习方法,它旨在将数据集中的样本划分成若干个组,使得同一组内的样本相似度高,而不同组之间的样本相似度低。K-means聚类是其中最流行的一种算法,因其简单、高效而广受青睐。然而,选择合适的K值(即聚类数)对于聚类结果至关重要。本文将探讨如何选取最优的K值,以确保K-means聚类算法能够揭示数据中的潜在模式。
程序员洲洲
2024/06/07
1.1K0
【机器学习】K-means聚类的最优k值的选取(含代码示例)
使用Python实现K均值聚类算法
K均值(K-Means)算法是一种常用的聚类算法,它将数据集分成K个簇,每个簇的中心点代表该簇的质心,使得每个样本点到所属簇的质心的距离最小化。在本文中,我们将使用Python来实现一个基本的K均值聚类算法,并介绍其原理和实现过程。
Echo_Wish
2024/04/12
3080
k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)
该文章介绍了如何使用K-means算法进行聚类,以及如何使用scikit-learn库中的KMeans函数进行实现。同时,文章还介绍了如何对数据进行标准化处理,以及如何使用scikit-learn库中的StandardScaler函数进行标准化处理。最后,文章介绍了如何使用K-means算法进行聚类,并给出了具体的代码示例和注释说明。
悟乙己
2018/01/02
13.1K0
k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)
【机器学习-无监督学习】聚类
  本文开始我们讲解无监督学习算法。在之前的文章中,我们给模型的任务通常是找到样本
Francek Chen
2025/01/22
1790
【机器学习-无监督学习】聚类
机器学习 | KMeans聚类分析详解
大量数据中具有"相似"特征的数据点或样本划分为一个类别。聚类分析提供了样本集在非监督模式下的类别划分。聚类的基本思想是"物以类聚、人以群分",将大量数据集中相似的数据样本区分出来,并发现不同类的特征。
数据STUDIO
2021/06/24
4.2K0
机器学习第12天:聚类
某位著名计算机科学家有句话:“如果智能是蛋糕,无监督学习将是蛋糕本体,有监督学习是蛋糕上的糖霜,强化学习是蛋糕上的樱桃”
Nowl
2024/01/18
1920
机器学习第12天:聚类
【机器学习】聚类算法分类与探讨
文章链接:https://cloud.tencent.com/developer/article/2465572
小馒头学Python
2024/11/14
1680
【机器学习】聚类算法分类与探讨
K-means 在 Python 中的实现
K-means算法简介 K-means是机器学习中一个比较常用的算法,属于无监督学习算法,其常被用于数据的聚类,只需为它指定簇的数量即可自动将数据聚合到多类中,相同簇中的数据相似度较高,不同簇中数据相似度较低。 K-menas的优缺点: 优点: 原理简单 速度快 对大数据集有比较好的伸缩性 缺点: 需要指定聚类 数量K 对异常值敏感 对初始值敏感 K-means的聚类过程 其聚类过程类似于梯度下降算法,建立代价函数并通过迭代使得代价函数值越来越小 适当选择c个类的初始中心; 在第k次迭代中,对任意一个样本,
小莹莹
2018/04/23
1.8K0
K-means 在 Python 中的实现
数学建模--K-Means聚类分析
对数据进行自动分组,使得同一组内的数据样本尽可能相似,不同组之间的数据样本尽可能不同,以此来完成用户细分,这就是聚类。
阑梦清川
2025/02/24
3030
数学建模--K-Means聚类分析
详细介绍了Python聚类分析的各种算法和评价指标
较为详细介绍了聚类分析的各种算法和评价指标,本文将简单介绍如何用python里的库实现它们。
润森
2022/08/18
2.5K0
详细介绍了Python聚类分析的各种算法和评价指标
相关推荐
机器学习——KMeans
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验