【机器学习】聚类算法、社区发现

目录

前言

聚类和社区发现

社区发现

聚类算法

聚类-评估指标

社区发现-模块度


前言

最近方向是团案挖掘,关于聚类算法和社区发现,其实之前不怎么了解,最近得补补了。

聚类和社区发现

首先要先明白这两者的差别。

[参考地址]

社团检测通常是指将网络中联系紧密的部分找出来,这些部分就称之为社团,那么也可以认为社团内部联系稠密,而社团之间联系稀疏 。显而易见,其中有一个非常重要的点,稠密是如何定义的。不管现在想到的定义是什么,但都包含顶点,边,度,或许还有路径这些字眼,它们有一个共同的特征–网络的结构。所以,社团检测侧重于找到网络中联系紧密的部分,而经常忽略节点的属性(attributes)。

聚类,顾名思义是将属于同一类的目标聚在一起,通常在聚类之前我们是不知道目标有哪些类型,这也是一种典型的无监督学习方法。那么现在来想想我们熟知的聚类方法:k-means,层次聚类等。其中,最核心的一个部分是计算两个目标之间的距离(或者称为相似度),距离近则它俩是一类,距离远,那就自成一派,或者去找其它距离近的。当然,距离近只是其中一种方法,还有距离远或者怎么样,就看自己的判断。判断标准不是讨论的重点,重点是如何计算距离。欧式距离,曼哈顿距离,余弦相似度等,都是直接用目标特征构成的向量来计算的,没有考虑目标的边,度。所以,聚类侧重于找到一堆属性相似的目标,从而忽略了目标与目标之间的联系。

两者之间的关系已经很清楚啦, 社团检测和聚类存在区别,但是呢,两者又是可以结合起来的。比如,我们现在有一个网络,只知道顶点和边的情况,顶点的属性是未知的。那么在做社团检测的时候,可以将顶点与顶点之间的关系构成一个邻接矩阵,通过一系列变化或者就这个邻接矩阵而言,将每个行看作一个属性,每个列看作目标,就可以很轻松的转为聚类,用聚类的方法求解。当邻接矩阵高维时,还可以先做降维处理。所以,两者并没有完全独立,只是考虑的角度不同,可以结合使用。现在社交网络方向有一个很热门的就是用attributes来辅助进行社团检测,是对传统的社团检测和聚类方法的一种改进,两者优势互补。
 

社区发现

  • LPA(Label Propagation Algorithm)

LPA算法的稳定性不是很好,但优点是可扩展性强,时间复杂度接近线性,且可以控制迭代次数来划分节点类别,不需要预先给定社区数量,适合处理大规模复杂网络。LPA的计算步骤也十分简单:

第一步:为所有节点指定一个唯一标签;

第二步:刷新标签:对于某一个节点,考察其所有邻居节点的标签,并进行统计,将出现个数最多的那个标签赋给当前节点(如果最多的标签不唯一,随机选择一个);

第三步:重复步骤二,直到收敛为止。

  • 优化算法:SLPA (Speaker-listener Label Propagation Algorithm)

SLPA是一种改进的LPA,是一种重叠社区发现算法,其中涉及一个重要的阈值参数r。通过对r的适当选取,可将其退化为非重叠型。

SLPA中引入了listener和speaker两个比较形象的概念。可以这么理解:在刷新节点的过程中,我们将要被刷新的节点定义为listener,其临近节点就是它的speaker,speaker通常不止一个,在众多speaker七嘴八舌时,listener该听谁的呢?这时我们就要制定一个规则。

在LPA中,我们以出现次数最多的标签来做决断,这其实就是一种规则。只不过在SLPA框架里,规则的选取方式多由用户指定(通常结合业务逻辑和场景决定,给出一个先验或者统计的概率阈值)。

与LPA相比,SLPA最大的特点在于它不是仅仅的刷新替代原标签,而是记录每一个节点在刷新迭代过程中的历史标签序列(例如迭代T次,则每一个节点将保留一个长度为T的序列,见上面著名的手绘图)。当迭代停止时,对每一个节点历史标签序列中各标签出现的频率做统计,按照某一个给定的阈值过滤掉那些出现概率小的标签,剩下的标签为该节点的标签(通常有多个)。

  • Louvain算法

Louvain算法的思想很简单:

       1)将图中的每个节点看成一个独立的社区,社区的数目与节点个数相同;

  2)对每个节点i,依次尝试把节点i分配到其每个邻居节点所在的社区,计算分配前与分配后的模块度变化Δ𝑄,并记录Δ𝑄最大的那个邻居节点,如果𝑚𝑎𝑥Δ𝑄>0,则把节点i分配Δ𝑄最大的那个邻居节点所在的社区,否则保持不变;

  3)重复2),直到所有节点的所属社区不再变化;

  4)对图进行压缩,将所有在同一个社区的节点压缩成一个新节点,社区内节点之间的边的权重转化为新节点的环的权重,社区间的边权重转化为新节点间的边权重;

  5)重复1)直到整个图的模块度不再发生变化。

  • GN算法

GN算法是社区发现中的第一个算法,也就是它开启了这个研究领域。它的基本思想是删除掉那些社区之间的连接,那么剩下的每个连通部分就是一个社区。那么问题来了,就是那些是社区之间的边呢?作者巧妙地借助最短路径解决了这个问题,他们定义一条边的介数(betweeness)为网络中所有结点之间的最短路径中通过这条边的数量,而介数高的边要比介数低的边更可能是社区之间的边。其实,这也比较好理解,因为两个社区中的结点之间的最短路径都要经过那些社区之间的边,所以它们的介数会很高。

    GN算法每次都删除网络中介数最大的边,直至网络中的所有边都被删除。这样GN的过程对应着一颗自顶向下构建的层次树。在层次树中选择一个合适的层次分割即可。

  • infomap

[参考地址]

通过构造转移概率,在图上进行随机游走来生成序列,在通过对序列做层次编码,最小化目标,从而完成聚类。

聚类算法

[参考地址]

  • K-Means(K均值)聚类

算法步骤:

(1) 首先我们选择一些类/组,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置。这需要我们提前预知类的数量(即中心点的数量)。

(2) 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。

(3) 计算每一类中中心点作为新的中心点。

(4) 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个。

优点:

(1) 速度快,计算简便

缺点:

(1) 我们必须提前知道数据有多少类/组。

(2) K-Medians是K-Means的一种变体,是用数据集的中位数而不是均值来计算数据的中心点。

(3) K-Medians的优势是使用中位数来计算中心点不受异常值的影响;缺点是计算中位数时需要对数据集中的数据进行排序,速度相对于K-Means较慢。

  • 基于密度的聚类算法(DBSCAN)

具体步骤:

1. 首先确定半径r和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点标记为central point,反之则会被标记为noise point。

2. 重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,直到所有的点都被访问过。

优点:

(1) 不需要知道簇的数量

缺点:

(1) 需要确定距离r和minPoints

  • 高斯混合模型(GMM)

具体步骤:

1. 选择簇的数量(与K-Means类似)并随机初始化每个簇的高斯分布参数(均值和方差)。也可以先观察数据给出一个相对精确的均值和方差。

2. 给定每个簇的高斯分布,计算每个数据点属于每个簇的概率。一个点越靠近高斯分布的中心就越可能属于该簇。

3. 基于这些概率我们计算高斯分布参数使得数据点的概率最大化,可以使用数据点概率的加权来计算这些新的参数,权重就是数据点属于该簇的概率。

4. 重复迭代2和3直到在迭代中的变化不大。

GMMs的优点:

(1)GMMs使用均值和标准差,簇可以呈现出椭圆形而不是仅仅限制于圆形。K-Means是GMMs的一个特殊情况,是方差在所有维度上都接近于0时簇就会呈现出圆形。

(2)GMMs是使用概率,所有一个数据点可以属于多个簇。例如数据点X可以有百分之20的概率属于A簇,百分之80的概率属于B簇。也就是说GMMs可以支持混合资格。

  • 层次聚类Hierarchical Clustering

[参考地址]
(公式有几个地方有点误导性,聚类树的图也有点问题,阅读时需要注意)

层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复迭代这一过程。简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。

聚类-评估指标

[参考地址]

外部度量:需要知道真实标签的度量

内部度量:在真实的分群label不知道的情况下

团案挖掘中,都是要剔除真实label,尽可能发现团的,所以聚类我看的都是内部度量。

  • 轮廓系数(Silhouette Coefficient)

轮廓系数(Silhouette Coefficient),是聚类效果好坏的一种评价方式。它结合内聚度和分离度两种因素。可以用来在相同原始数据的基础上用来评价不同算法、或者算法不同运行方式对聚类结果所产生的影响。

对于其中的一个点 i 来说:

计算 a(i) = average(i向量到所有它属于的簇中其它点的距离)

计算 b(i) = min (i向量到与它相邻最近的一簇内的所有点的平均距离)

那么 i 向量轮廓系数就为:

取值范围在[-1, 1],越趋近于1代表内聚度和分离度都相对较优。

上部分中所说的“距离”,指的是不相似度(区别于相似度)。“距离“值越大,代表不相似度程度越高。

欧氏距离就满足这个条件,而Tanimoto Measure 则用做相似度度量。

当簇内只有一点时,我们定义轮廓系数s(i)为0。

  • CH分数(Calinski Harabasz Score )

CH指标通过计算类中各点与类中心的距离平方和来度量类内的紧密度,通过计算各类中心点与数据集中心点距离平方和来度量数据集的分离度,CH指标由分离度与紧密度的比值得到。从而,CH越大代表着类自身越紧密,类与类之间越分散,即更优的聚类结果。

类内的协方差越小越好,类间的协方差越大越好,整体来说CH越大越好。

社区发现-模块度

[参考地址]

  • 15
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
聚类算法是一种常用的聚类算法,可以用于无监督学习和数据分析。在谱聚类算法中,首先构建数据点之间的相似度矩阵,然后对该矩阵进行特征值分解或拉普拉斯矩阵分解,最后通过KMeans等聚类算法将数据点划分为不同的簇。 谱聚类算法的优点是能够发现非常复杂的数据结构,对噪声数据有较好的鲁棒性,并且能够处理非球形和非凸形状的簇。谱聚类算法还可以避免传统聚类算法中的距离度量问题和簇的数目选择问题。此外,由于谱聚类算法在计算相似度矩阵时不需要事先确定各个数据点的簇归属,因此可以用于无监督学习。 CSDN是一个技术社区,提供了大量的软件、编程、开发等方面的资源和知识。在CSDN上,可以搜索到谱聚类算法的相关资料,并进行下载学习。CSDN上提供了很多从理论到实践的教程、博客和教学视频,可以帮助我们更好地理解和掌握谱聚类算法。 对于想要学习谱聚类算法的人来说,可以通过CSDN下载相关的代码和资料,进行学习和实践。可以找到一些开源的Python或MATLAB代码,也可以看到其他人的代码解析和实例应用。此外,在CSDN的技术问答社区中,我们还可以向其他热心的技术人员请教问题,获得更深入的理解和指导。 总之,CSDN是一个提供谱聚类算法相关资源和知识的平台,可以帮助我们更好地学习和应用谱聚类算法。通过下载相关资料和与其他技术人员交流,我们可以更好地理解算法原理,掌握谱聚类算法的应用技巧,提高数据分析和聚类的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值