百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

如何评估聚类模型?兰德指数、轮廓系数、Calinski Harabaz指数

toyiye 2024-07-09 22:58 12 浏览 0 评论

我们可以通过对一系列曲目进行聚类来创建歌曲的自动播放列表,我们可以展示如何自动创建相似歌曲的子组。通过我们现有的歌曲知识,我们能够验证该聚类练习的结果。

但是,如果我们对数据没有这种先验知识怎么办?如果数据甚至都没有被标记怎么办(在许多实际的聚类案例中就是这种情况)?即使是这样,如果这些标签最初对我们没有意义,该怎么办?有很多我从未听说过的艺术家,如果我们要对数千首曲目进行分组,那么手动验证每个集群显然是不切实际的。在这些情况下,我们需要某种数学方法来衡量聚类的"成功"程度。

为了探索如何做到这一点,我们再次转向Spotify的API。假设我们从四个完全不同的播放列表中选取歌曲:

  • Rap UK
  • Smooth Jazz
  • Classical Essentials
  • Essential K-Pop

如果我们将它们合并到一个数据集中,则无监督的机器学习算法应该能够将其歌曲分组为四个群集,这些群集在某种程度上类似于原始的四个播放列表。

在开始之前,我们确实可能需要检查一下我们的假设,即来自这些不同播放列表的歌曲确实"与众不同"。当然,在单个图表上同时可视化两个以上的特征是一项挑战。但是,如果我们绘制所有功能的散布矩阵,并按播放列表进行颜色编码,则可以看到有很多度量组合可以证明每种流派的独特特征。



我们在上中看到,在Scikit-Learn中运行聚类算法非常简单:

#We scale the data to ensure that
#feature units don't impact distances
from sklearn.preprocessing import StandardScaler
sclaer = StandardScaler()
X_scaled = scaler.fit_transform(X)#This scaled data can then be fed into the HAC algorithm
from sklearn.cluster import AgglomerativeClustering
#We can tell it how many clusters we're aiming for
agg_clust = AgglomerativeClustering(n_clusters=4)
assigned_clusters = agg_clust.fit_predict(X_scaled)

我们还看到,HAC具有三个不同的"链接标准",即该算法将群集逐渐连接在一起的方法:

  • ward(默认):选择两个聚类,以所有聚类中的方差增加最小的方式合并。通常,这会导致大小相当相等的群集。
  • complete(或最大链接):合并两个点之间最大距离最小的两个聚类。
  • ·average:合并所有点之间平均距离最小的两个聚类。

让我们看看这三个链接标准如何处理类型播放列表数据集。我们用矩阵表示结果,显示每个播放列表的歌曲在每个群集中所占的百分比(群集被任意命名为" A"," B"," C"和" D")。

当然,如果聚类是完美的,我们希望矩阵的每一行和每一列都恰好包含一个100%的条目(当然,它不需要成对角线,因为聚类名称的分配是任意的)。

默认的"向后"链接试图最小化群集中的方差,尽管这四个群集都有一些泄漏,但在所有四种类型中都表现出色。

"完全"链接显然效果不佳。它已将许多数据集放入群集A。群集C由一首说唱歌曲组成。

"平均"链接与"完全"链接具有类似的问题。许多数据点已放置在一个群集中,其中两个群集由一首歌曲组成。

值得一提的是,还有另一种常见的聚类类型,即K-Means,其工作原理略有不同。HAC通过将它们合并在一起来迭代地减少聚类的数量,而K-Means聚类保持固定数量的聚类(名义上的k),但是迭代地更改每个聚类的成员。



每个群集的"中心"由带有黑色" +"号的"大"标记表示。所有点都分配给它们最接近中心的聚类。在此分配步骤之后,将重新计算群集中心以包括新成员,然后发生另一个重新分配步骤。如果在重新分配步骤中没有点更改聚类,则算法结束(动画:)。

K-Means很容易在Python中实现:

#We scale the data to ensure that
#feature units don't impact distances
from sklearn.preprocessing import StandardScaler
sclaer = StandardScaler()
X_scaled = scaler.fit_transform(X)#This scaled data can then be fed into the K-Means alorithm
from sklearn.cluster import KMeans
#We can tell it how many clusters we're aiming for
km_clust = KMeans(n_clusters=4)
assigned_clusters = km_clust.fit_predict(X_scaled)

如果将K-Means聚类应用于播放列表数据集,则会得到以下信息:

与使用"ward"链接的HAC算法一样,K-Means聚类在大多数算法中都做得很好,一些爵士乐和说唱歌曲对K-Pop来说是"错误的"。

尽管这些矩阵可以很好地"盯住"我们的结果,但它们在数学上还不够严格。让我们考虑一些指标,这些指标实际上可以帮助我们为集群质量分配一个数字。



调整后的Rand Index(兰德指数)

该是对经典兰德指数的变化,并试图表达什么群集分配比例是"正确"。通过考虑所有样本对,并根据预测的真实聚类对分配在预测的相同或不同聚类中的对进行计数,并针对随机机会进行调整,计算出两个不同聚类之间的相似性度量。

可以使用Scikit-Learn评估此(以及我们将考虑的其他指标)。

from sklearn import metrics
metrics.adjusted_rand_score(predicted_labels, actual)

调整后的兰德指数限制在-1和1之间。接近1表示好,而接近-1表示差。

我们看到K均值和Ward Linkage得分很高。基于我们先前观察到的矩阵,我们期望得到这一结果。

Fowlkes Mallows Score

该是相似的,在尽可能多的,它会告诉你哪个集群分配是"正确"的程度。特别是,它计算精度和召回率之间的几何平均值。它的范围是0到1,值越高越好。

metrics.fowlkes_mallows_score(predicted_labels,actual)

我们的排名与调整后的兰德指数相似,这是我们期望的,因为它们是尝试回答同一问题的两种方法。

值得注意的是,我们需要了解原始标签才能计算这些指标。鉴于处理无标签数据是无监督学习的主要用例之一,因此我们需要一些其他指标来评估聚类结果,而无需引用"真实"标签。

假设我们从三个单独的聚类分析中得到以下结果。

显然,我们可以使集群更加"紧密"。是否可以通过某种方式将这种"紧度"归因于数字?



轮廓分数

该试图描述一个数据点的相似程度在其集群的其他数据点,相对于数据点并不在其集群(这是汇聚了所有数据点来获得总体集群分数)。换句话说,它考虑了集群在空间中的"区别度"-实际上人们可以使用任何"距离"度量来计算分数。

它的范围是-1和1。接近-1表示群集不正确,而接近+1则表示每个群集都非常密集。

metrics.silhouette_score(scaled_feature_data,cluster_labels)

我们看到,所有聚类都没有超高的轮廓分数。有趣的是,我们看到平均链接集群的得分最高。但是请记住,该算法产生了两个群集,每个群集仅包含一个数据点,这在现实情况下不太可能是理想的结果(这是一个教训,您通常不能依靠单个指标来做出决策算法的质量!)

Calinski Harabaz指数

所述Calinski Harabaz指数是相对于点的数据点的方差相比,在其它簇的点的比率,对所述方差中的集群。由于我们希望第一部分较高,而第二部分较低,因此需要较高的CH指数。与我们看到的其他指标不同,此分数没有界限。

metrics.calinski_harabasz_score(scaled_feature_data,cluster_labels)

在这里,我们看到我们的K均值和Ward Linkage算法得分很高。完全和平均链接算法因具有一个或两个较大的聚类而受到惩罚,这将具有较高水平的内部方差。


相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码