热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

谱聚类:直觉以及背后的数学原理

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”作者:NeerjaDoshi编译:ronghuaiyang导读谱聚

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”


作者:Neerja Doshi

编译:ronghuaiyang

导读

谱聚类,了解直觉以及背后的数学原理

什么是聚类?

聚类是一种广泛使用的无监督学习方法。聚类是这样分组的:集群中的点彼此相似,而与其他集群中的点不太相似。因此,如何在数据中寻找模式并为我们分组取决于算法,根据使用的算法,我们可能最终得到不同的集群。

有两种广泛使用的聚类方法:

  1. 紧密性——相互靠近的点落在同一个集群中,并且在紧密聚集在集群中心周围。这种密切的关系可以用观测值之间的距离来衡量。比如:k—means聚类

  2. 连接性——相互连接或相邻的点放在同一个集群中。即使两点之间的距离更小,如果它们不相连,它们也不会聚集在一起。谱聚类是遵循这种方法的一种技术。

两者之间的区别可以很容易地通过这个例子来说明:

640?wx_fmt=png

谱聚类如何工作?

在谱聚类中,数据点被视为图的节点。因此,集群被视为一个图的分割问题。然后将节点映射到一个低维空间,该空间可以很容易地进行隔离,从而形成集群。需要注意的重要一点是,没有对集群的形状/形式做任何假设。

谱聚类的步骤有哪些?

谱聚类包括三个步骤:

  1. 计算相似图

  2. 将数据投影到低维空间

  3. 创建集群

步骤1—计算相似图

我们首先创建一个无向图G = (V, E),顶点集V = {v1, v2,…,vn} = 1,2,…,n个数据中的观察值。这可以用一个邻接矩阵来表示,该矩阵将每个顶点之间的相似性作为其元素。要做到这一点,我们可以计算:

  1. ε-neighborhood图:这里我们连接所有两两距离小于ε的点。所有连接的点之间的距离大致都是相同的尺度(最多是ε),对边进行加权不会包含进图中数据的更多的信息,因此,ε-neighborhood图通常被认为是一个无权重的图。

  2. KNN图:这里我们使用K最近邻来连接顶点vi和顶点vj,如果vjvi的K个最近邻中,我们就把vivj连接起来。但是有个问题,最近邻可能不是对称的,也就是说如果有一个顶点vivj为最近邻,那么vi不一定是vj的最近邻。因此,我们最终得到一个有向图,这是一个问题,因为我们不知道在这种情况下,两点之间的相似性意味着什么。有两种方法可以使这个图变成无向图。

    第一种方法是直接忽略边缘的方向,即如果vivj的k近邻中,或者如果vjvi的k近邻中,我们用无向边连接vivj。得到的图通常称为k近邻图。

    第二个选择是连接vivj互为k近邻点的情况,得到的图称为相互k近邻图。

    在这两种情况下,在连接适当的顶点后,我们通过相邻点的相似性对边进行加权。

  3. 全连接图:为了构造这个图,我们简单地将所有点连接起来,并通过相似性sij对所有边进行加权。该图应该对局部邻域关系进行建模,因此使用了高斯相似函数等相似函数。

640?wx_fmt=png

这里的参数σ控制邻域的宽度,类似于ε-neighborhood图中的参数ε。

因此,当我们为这些图中的任意一个创建邻接矩阵时,当点很近时Aij ~ 1,当点很远时Aij→0。

考虑一下拥有1~4节点的图,权值(或相似度)wij及其邻接矩阵:

640?wx_fmt=png

步骤2—将数据投影到低维空间

正如我们在图1中所看到的,相同集群中的数据点可能也很远—甚至比不同集群中的数据点还要远。我们的目标是空间转换,当这两个点很近的时候,它们总是在同一个集群中,当它们很远的时候,它们是在不同的集群中。我们需要把观测结果投射到低维空间。为此,我们计算图的拉普拉斯矩阵,这只是图的另一种矩阵表示形式,对于查找图的有趣的属性非常有用。这可以计算为:

640?wx_fmt=png

计算图的拉普拉斯矩阵

640?wx_fmt=png


我们上面例子的图的拉普拉斯矩阵


计算图的拉普拉斯矩阵L的全部目的是找到它的特征值和特征向量,以便将数据点嵌入低维空间。现在,我们可以继续查找特征值。我们知道:

640?wx_fmt=png

640?wx_fmt=png

我们考虑下面的例子:

640?wx_fmt=png

我们计算L的特征值和特征向量。

步骤3—创建集群

对于这一步,我们使用对应于第二个特征值的特征向量来为每个节点赋值。计算时,第二个特征值为0.189,对应的特征向量v2 =[0.41, 0.44, 0.37, -0.4, -0.45, -0.37]。

为了得到2聚类(2个不同的聚类),我们首先将v2的每个元素分配给节点,例如{node1:0.41, node2:0.44,…node6: -0.37}。然后,我们对节点进行拆分,使值为> 0的所有节点都位于一个集群中,而所有其他节点都位于另一个集群中。因此,在本例中,我们在一个集群中得到节点1、2和3,在第二个集群中得到节点4、5和6。

需要注意的是,第二个特征值表示图中节点的紧密连接程度。对于好的、干净的划分,降低第2个特征值,让聚类变得更好。

640?wx_fmt=png

特征向量v2给出一个2分聚类


对于k聚类,我们需要修改拉普拉斯矩阵,对它进行归一化

我们得到:

640?wx_fmt=png


归一化的拉普拉斯矩阵


640?wx_fmt=png

谱聚类的优缺点

优点:

  1. 没有对聚类的统计数据做出强有力的假设——聚类技术(如K-Means聚类)假设分配给聚类的点围绕聚类中心是球形的。这是一个强有力的假设,可能并不总是相关的。在这种情况下,谱聚类有助于创建更精确的聚类。

  2. 易于实现,聚类效果好。它可以正确地将实际属于同一簇但由于维数减少而比其他簇中的观测值更远的观测值进行聚类。

  3. 对于几千个元素的稀疏数据集,速度相当快。

缺点:

  1. 在最后一步中使用K-Means聚类意味着聚类并不总是相同的。它们可能随初始中心的选择而变化。

  2. 对于大型数据集来说,计算开销很大——这是因为需要计算特征值和特征向量,然后我们必须对这些向量进行聚类。对于大型、密集的数据集,这可能会大大增加时间复杂度。

640?wx_fmt=png—END—

英文原文:https://towardsdatascience.com/spectral-clustering-82d3cff3d3b7

640?wx_fmt=jpeg

请长按或扫描二维码关注本公众号

喜欢的话,请给我个好看吧!640?wx_fmt=gif


推荐阅读
  • 精通C++并非易事,为何它比其他语言更难掌握?这主要归因于C++的设计理念,即不强迫用户接受特定的编程风格或限制创新思维。本文探讨了如何有效学习C++,并介绍了几本权威的学习资源。 ... [详细]
  • 本文探讨了STL迭代器的最佳实践,包括iterator与const_iterator、reverse_iterator及其const版本之间的关系,以及如何高效地转换和使用这些迭代器类型。 ... [详细]
  • 利用 Jest 和 Supertest 实现接口测试的全面指南
    本文深入探讨了如何使用 Jest 和 Supertest 进行接口测试,通过实际案例详细解析了测试环境的搭建、测试用例的编写以及异步测试的处理方法。 ... [详细]
  • Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
    go,通过,map,filter,foreach,等,流,式,ap ... [详细]
  • 三大Python学习利器网站推荐
    本文将介绍三个在Python学习过程中极为有用的网站,特别是对于初学者而言,这些资源能提供巨大的帮助。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • addcslashes—以C语言风格使用反斜线转义字符串中的字符addslashes—使用反斜线引用字符串bin2hex—函数把包含数据的二进制字符串转换为十六进制值chop—rt ... [详细]
  • 本文详细介绍了C#中的基本选择结构(如if、if-else、if-else-if及嵌套if)、switch结构、数组与循环控制结构(包括while、do-while、for和foreach循环)以及跳转语句(break和continue)。此外,还简要探讨了二重循环的应用和冒泡排序算法。 ... [详细]
  • 深入探讨ASP.NET中的OAuth、JWT与OpenID Connect
    本文作为前文关于OAuth2.0和使用.NET实现OAuth身份验证的补充,详细阐述了OAuth与JWT及OpenID Connect之间的关系和差异,旨在提供更全面的理解。 ... [详细]
  • 本文讨论了从PHP5.6升级至PHP7过程中遇到的问题,特别是关于bcmath扩展的兼容性问题。bcmath用于执行高精度数学运算,类似于Java中的BigDecimal。升级后,在调用bcmath函数时出现了错误。 ... [详细]
  • 深入理解希尔排序算法
    本文详细介绍了希尔排序的原理及其相对于传统插入排序的优势,并通过实例解析了希尔排序的具体实现过程,包括代码示例及性能分析。 ... [详细]
  • 免费获取:全面更新的Linux集群视频教程及配套资源
    本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
  • 收割机|篇幅_国内最牛逼的笔记,不接受反驳!!
    收割机|篇幅_国内最牛逼的笔记,不接受反驳!! ... [详细]
  • 本文介绍了如何使用Direct3D API中的D3DSURFACE_DESC结构来获取纹理的具体尺寸信息,包括宽度和高度。通过调用GetLevelDesc方法,可以轻松获取这些关键参数。 ... [详细]
  • 本文通过C++代码示例,详细介绍了如何利用邻接矩阵构建无向图,并实现图的深度优先遍历(DFS)。文章包括了完整的代码实现,以及对关键函数的解释。 ... [详细]
author-avatar
梁琦rx1987_865
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有