【机器学习】常用聚类算法 整理

数据挖掘常用算法整理 前言:   找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大。   纵观IT行业的招聘岗位,机器学习之类的岗位还是挺 阅读详情

sparkML 常用聚类算法 

http://spark.apache.org/docs/latest/mllib-clustering.html

如下为 机器学习聚类算法的理论知识:

在机器学习中,无监督学习一直是追求的方向,因为,这样可以更加自动化,减少人工参与等好处,而其中的聚类算法更是发现隐藏数据结构与知识的有效手段。目前如谷歌新闻等很多应用都将聚类算法作为主要的实现手段,它们能利用大量的未标注数据构建强大的主题聚类。本文从最基础的 K 均值聚类到基于密度的强大方法介绍了 6 类主流方法,它们各有擅长领域与情景,且基本思想并不一定限于聚类方法。

本文将从简单高效的 K 均值聚类开始,依次介绍均值漂移聚类、基于密度的聚类、利用高斯混合和最大期望方法聚类、层次聚类和适用于结构化数据的图团体检测。我们不仅会分析基本的实现概念,同时还会给出每种算法的优缺点以明确实际的应用场景。

聚类是一种包括数据点分组的机器学习技术。给定一组数据点,我们可以用聚类算法将每个数据点分到特定的组中。理论上,属于同一组的数据点应该有相似的属性和/或特征,而属于不同组的数据点应该有非常不同的属性和/或特征。聚类是一种无监督学习的方法,是一种在许多领域常用的统计数据分析技术。

K-Means(K 均值)聚类

Kmeans是一个非常非常知名、基础且简单实用的聚类(分类)算法,使用了迭代的思想

kmeans有几个缺点:

1、最终簇的类别数目(即中心点或者说种子点的数目)k并不一定能事先知道,所以如何选一个合适的k的值是一个问题。
2、最开始的种子点的选择的好坏会影响到聚类结果。
3、对噪声和离群点敏感。
4、等等。

kmeans++算法的主要工作体现在种子点的选择上,基本原则是使得各个种子点之间的距离尽可能的大,但是又得排除噪声的影响。基本思路:

1、从输入的数据点集合(要求有k个聚类)中随机选择一个点作为第一个聚类中心
2、对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x)
3、选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大
4、重复2和3直到k个聚类中心被选出来
5、利用这k个初始的聚类中心来运行标准的k-means算法

假定数据点集合X有n个数据点,依次用X(1)、X(2)、……、X(n)表示,那么,在第2步中依次计算每个数据点与最近的种子点(聚类中心)的距离,依次得到D(1)、D(2)、……、D(n)构成的集合D。在D中,为了避免噪声,不能直接选取值最大的元素,应该选择值较大的元素,然后将其对应的数据点作为种子点。

如何选择值较大的元素呢,下面是一种思路(暂未找到最初的来源,在资料[2]等地方均有提及,笔者换了一种让自己更好理解的说法):
把集合D中的每个元素D(x)想象为一根线L(x),线的长度就是元素的值。将这些线依次按照L(1)、L(2)、……、L(n)的顺序连接起来,组成长线L。L(1)、L(2)、……、L(n)称为L的子线。根据概率的相关知识,如果我们在L上随机选择一个点,那么这个点所在的子线很有可能是比较长的子线,而这个子线对应的数据点就可以作为种子点。下文中kmeans++的两种实现均是这个原理。

基本的K均值算法描述如下:

根据数据点到新质心的距离,再次对数据集中的数据进行分类,如图13-2(c)所示。然后,算法根据新的分类来计算新的质心,并再次根据数据点到新质心的距离,对数据集中的数据进行分类。结果发现簇内数据点不再改变,所以算法执行结束,最终的聚类结果如图13-2(d)所示。

对于距离函数和质心类型的某些组合,算法总是收敛到一个解,即K均值到达一种状态,聚类结果和质心都不再改变。但为了避免过度迭代所导致的时间消耗,实践中,也常用一个较弱的条件替换掉“质心不再发生变化”这个条件。例如,使用“直到仅有1%的点改变簇”。

尽管K均值聚类比较简单,但它也的确相当有效。它的某些变种甚至更有效, 并且不太受初始化问题的影响。但K均值并不适合所有的数据类型。它不能处理非球形簇、不同尺寸和不同密度的簇,尽管指定足够大的簇个数时它通常可以发现纯子簇。对包含离群点的数据进行聚类时,K均值也有问题。在这种情况下,离群点检测和删除大有帮助。K均值的另一个问题是,它对初值的选择是敏感的,这说明不同初值的选择所导致的迭代次数可能相差很大。此外,K值的选择也是一个问题。显然,算法本身并不能自适应地判定数据集应该被划分成几个簇。最后,K均值仅限于具有质心(均值)概念的数据。一种相关的K中心点聚类技术没有这种限制。在K中心点聚类中,我们每次选择的不再是均值,而是中位数。这种算法实现的其他细节与K均值相差不大,我们不再赘述。
 

K-means聚类最优k值的选取

数据挖掘的项目,挖掘过程中用到了K-means聚类方法,但是由于根据行业经验确定的聚类数过多并且并不一定是我们获取到数据的真实聚类数,所以,我们希望能从数据自身出发去确定真实的聚类数,也就是对数据而言的最佳聚类数。主流的确定聚类数k的方法有以下两类。

1.手肘法

手肘法的核心指标是SSE(sum of the squared errors,误差平方和),

其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。

2. 轮廓系数法

该方法的核心指标是轮廓系数(Silhouette Coefficient),某个样本点Xi的轮廓系数定义如下:

其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度。

其中p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。

       求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

 

K-Means 聚类

1.首先,我们选择一些类/组,并随机初始化它们各自的中心点。为了算出要使用的类的数量,最好快速查看一下数据,并尝试识别不同的组。中心点是与每个数据点向量长度相同的位置,在上图中是「X」。

2.通过计算数据点与每个组中心之间的距离来对每个点进行分类,然后将该点归类于组中心与其最接近的组中。

3.根据这些分类点,我们利用组中所有向量的均值来重新计算组中心。

4.重复这些步骤来进行一定数量的迭代,或者直到组中心在每次迭代后的变化不大。你也可以选择随机初始化组中心几次,然后选择看起来提供了最佳结果的运行。

K-Means 的优势在于速度快,因为我们真正在做的是计算点和组中心之间的距离:非常少的计算!因此它具有线性复杂度 O(n)。

另一方面,K-Means 有一些缺点。首先,你必须选择有多少组/类。这并不总是仔细的,并且理想情况下,我们希望聚类算法能够帮我们解决分多少类的问题,因为它的目的是从数据中获得一些见解。K-means 也从随机选择的聚类中心开始,所以它可能在不同的算法中产生不同的聚类结果。因此,结果可能不可重复并缺乏一致性。其他聚类方法更加一致。

K-Medians 是与 K-Means 有关的另一个聚类算法,除了不是用均值而是用组的中值向量来重新计算组中心。这种方法对异常值不敏感(因为使用中值),但对于较大的数据集要慢得多,因为在计算中值向量时,每次迭代都需要进行排序。

 

均值漂移聚类

均值漂移聚类是基于滑动窗口的算法,它试图找到数据点的密集区域。这是一个基于质心的算法,这意味着它的目标是定位每个组/类的中心点,通过将中心点的候选点更新为滑动窗口内点的均值来完成。然后,在后处理阶段对这些候选窗口进行过滤以消除近似重复,形成最终的中心点集及其相应的组。请看下面的图例。

1.为了解释均值漂移,我们将考虑二维空间中的一组点,如上图所示。我们从一个以 C点(随机选择)为中心,以半径r为核心的圆形滑动窗口开始。均值漂移是一种爬山算法,它包括在每一步中迭代地向更高密度区域移动,直到收敛。

2.在每次迭代中,滑动窗口通过将中心点移向窗口内点的均值(因此而得名)来移向更高密度区域。滑动窗口内的密度与其内部点的数量成正比。自然地,通过向窗口内点的均值移动,它会逐渐移向点密度更高的区域。

3.我们继续按照均值移动滑动窗口直到没有方向在核内可以容纳更多的点。请看上面的图;我们一直移动这个圆直到密度不再增加(即窗口中的点数)。

4.步骤1到3的过程是通过许多滑动窗口完成的,直到所有的点位于一个窗口内。当多个滑动窗口重叠时,保留包含最多点的窗口。然后根据数据点所在的滑动窗口进行聚类。

下面显示了所有滑动窗口从头到尾的整个过程。每个黑点代表滑动窗口的质心,每个灰点代表一个数据点。

与 K-means 聚类相比,这种方法不需要选择簇数量,因为均值漂移自动发现这一点。这是一个巨大的优势。聚类中心朝最大点密度聚集的事实也是非常令人满意的,因为理解和适应自然数据驱动的意义是非常直观的。它的缺点是窗口大小/半径「r」的选择可能是不重要的。

 

基于密度的聚类方法(DBSCAN)

DBSCAN 是一种基于密度的聚类算法,它类似于均值漂移,但具有一些显著的优点。请看下面的另一个有趣的图形,让我们开始吧!

 

DBSCAN 聚类

1.DBSCAN 从一个没有被访问过的任意起始数据点开始。这个点的邻域是用距离 ε(ε 距离内的所有点都是邻域点)提取的。

2.如果在这个邻域内有足够数量的点(根据 minPoints),则聚类过程开始,并且当前数据点成为新簇的第一个点。否则,该点将会被标记为噪声(稍后这个噪声点可能仍会成为聚类的一部分)。在这两种情况下,该点都被标记为「已访问」。

3.对于新簇中的第一个点,其 ε 距离邻域内的点也成为该簇的一部分。这个使所有 ε 邻域内的点都属于同一个簇的过程将对所有刚刚添加到簇中的新点进行重复。

4.重复步骤 2 和 3,直到簇中所有的点都被确定,即簇的 ε 邻域内的所有点都被访问和标记过。

5.一旦我们完成了当前的簇,一个新的未访问点将被检索和处理,导致发现另一个簇或噪声。重复这个过程直到所有的点被标记为已访问。由于所有点都已经被访问,所以每个点都属于某个簇或噪声。

DBSCAN 与其他聚类算法相比有很多优点。首先,它根本不需要固定数量的簇。它也会将异常值识别为噪声,而不像均值漂移,即使数据点非常不同,也会简单地将它们分入簇中。另外,它能够很好地找到任意大小和任意形状的簇。

DBSCAN 的主要缺点是当簇的密度不同时,它的表现不如其他聚类算法。这是因为当密度变化时,用于识别邻域点的距离阈值 ε 和 minPoints 的设置将会随着簇而变化。这个缺点也会在非常高维度的数据中出现,因为距离阈值 ε 再次变得难以估计。

 

用高斯混合模型(GMM)的最大期望(EM)聚类

  1. Means 的一个主要缺点是它对于聚类中心均值的简单使用。通过下面的图,我们可以明白为什么这不是最佳方法。在左侧,可以非常清楚的看到有两个具有不同半径的圆形簇,以相同的均值作为中心。K-Means 不能处理这种情况,因为这些簇的均值是非常接近的。K-Means 在簇不是圆形的情况下也失败了,同样是由于使用均值作为聚类中心。

高斯混合模型(GMMs)比 K-Means 给了我们更多的灵活性。对于 GMMs,我们假设数据点是高斯分布的;相对于使用均值来假设它们是圆形的,这是一个限制较少的假设。这样,我们有两个参数来描述簇的形状:均值和标准差!以二维为例,这意味着,这些簇可以采取任何类型的椭圆形(因为我们在 x 和 y 方向都有标准差)。因此,每个高斯分布被分配给单个簇。

为了找到每个簇的高斯参数(例如均值和标准差),我们将用一个叫做最大期望(EM)的优化算法。请看下面的图表,这是一个高斯适合于簇的例子。然后我们可以使用 GMMs 继续进行最大期望聚类的过程。

 

 

使用 GMMs 的 EM 聚类

1.我们首先选择簇的数量(如 K-Means 所做的),并随机初始化每个簇的高斯分布参数。也可以通过快速查看数据来尝试为初始参数提供一个好的猜测。但是请注意,正如上图所看到的,这不是 100% 必要的,因为高斯开始时我们很穷,但是很快就得到了优化。

2.给定每个簇的高斯分布,计算每个数据点属于一个特定簇的概率。一个点越靠近高斯的中心,它就越可能属于该簇。这应该是很直观的,因为对于高斯分布我们假设大部分数据更靠近簇的中心。

3.基于这些概率,我们计算一组新的高斯分布参数使得簇内的数据点的概率最大化。我们使用数据点位置的加权和来计算这些新参数,其中权重是数据点属于该特定簇的概率。为了用可视化的方式解释它,我们可以看一下上面的图,特别是黄色的簇,我们以它来作为例子。分布在第一次迭代时随即开始,但是我们可以看到大部分的黄点都在分布的右侧。当我们计算一个概率加权和时,即使中心附近有一些点,但它们大部分都在右侧。因此,分布的均值自然会接近这些点。我们也可以看到大部分的点分布在「从右上到左下」。因此改变标准差来创建更适合这些点的椭圆,以便最大化概率加权和。

4.重复步骤 2 和 3 直到收敛,其中分布在迭代中的变化不大。

使用 GMMs 有两个关键的优势。首先,GMMs 比 K-Means 在簇协方差方面更灵活;因为标准差参数,簇可以呈现任何椭圆形状,而不是被限制为圆形。K-Means 实际上是 GMM 的一个特殊情况,这种情况下每个簇的协方差在所有维度都接近 0。第二,因为 GMMs 使用概率,所以每个数据点可以有很多簇。因此如果一个数据点在两个重叠的簇的中间,我们可以简单地通过说它百分之 X 属于类 1,百分之 Y 属于类 2 来定义它的类。即 GMMs 支持混合资格。

 

高斯混合聚类算法

1高斯分布

高斯分布(即正态分布)概念,通常最常见的是一元正态分布的公式和曲线如下:

2贝叶斯公式

2.1数理统计概率三个公式

数理统计中概率公式的概念。

假设,有三个箱子X、Y、Z,箱子里有红黄蓝色的球若干。

事件A:把手伸向一个箱子准备抽取球。

事件B:从某个箱子里抽出一个球。

事件A、B中各个情况发生的概率是不等的。例如:

(1)概率乘法公式

概率乘法公式:P(AB)=P(A)P(B∣A)

  • Question1:随机抽一个球,从Y箱抽到黄球的概率是多少?

  • Answer:很明显,乘法公式告诉我们,先随机决定手伸向Y箱(即事件A2​)的概率是0.5,在已经决定在YY箱抽的前提下然后抽到黄球(即事件P(B∣A)P(B∣A)的概率是0.7。它们相乘就是所求。

(2)全概率公式

(3)贝叶斯公式

2.2 假如概率是连续的

在Y箱中球的颜色概率分布图如下。颜色只有三个,概率是三个常数,这是一个散点图。

假如,箱里的球的标签是数字,并且是连续的呢?比如从箱子里抽,可以任意抽到1~20的数字,包括这个区间内的任何整数或小数例如2、4.52、8.1等。那么,这个概率分布图可能是一条连续的直线。再假如,它是一条曲线,甚至它不是在平面上的,是三维立体的曲线呢?比如文章开头所说的多元高斯曲线。

现在问题就稍微变得复杂了一点点了。我们的事件A依然是3个箱子,概率是离散的。事件B变成了连续的曲线(三维的曲线、甚至更多维)。

2.3高斯混合分布

周志华《机器学习》30个西瓜聚类的例子,我们只有西瓜的两个特征向量:密度和含糖率。目标是用高斯混合聚类把这堆西瓜分为3簇(即设定k=3)。

用西瓜聚类的例子,理解贝叶斯公式。假设可分为三类瓜:坏瓜、一般瓜和好瓜。通常一般瓜占大多数,坏瓜和好瓜分别占小部分,且各类瓜均符合高斯分布,即坏瓜、一般瓜、好瓜分别有自己的二元高斯分布曲线,可能如下的三条曲线:

显然混合系数即上文中的P(A)P(A),上图中的公式(9.29)(9.29)其实就是全概率公式。我们已知样本集30个瓜的含量糖、密度的值。先重点研究其中一个编号为xx的样本瓜xx,Pm(x)Pm(x)是指我们在自然界中随机选一个瓜,选中恰好的是这个样本瓜x的概率。

公式(9.29)说明:

3极大似然法

极大似然法比较有趣,它是在讲一件事会发生,我们已经看到了发生了这事件这个结果,那么我们就假设这件事可能是冥冥之中会发生的概率本来就很大。

比如,根据我们已知的条件,已知a、μ、Σ 。一般瓜占三类瓜最大比例,每类中含糖量和密度整体又服从高斯分布。如果在自然界中随机抽一个瓜,那我们可以猜这个瓜是来自一般瓜类并且含糖量和密度在平均值附近的可能性最大(乘法公式)。

反过来想,假如已知μ、Σ ,现在我们已经拿到了一个瓜,已知这个瓜的含糖量和密度数值,但不知道这个瓜来自哪个类,怎么办?我们可以将这个瓜的含糖量和密度数值分别代入3类瓜的高斯分布曲线,在哪类瓜中的概率高,即说明这个瓜来自哪类瓜的可能性最大。(下图公式是贝叶斯)

换一个角度,假如已知的是30个瓜的含糖量和密度数值,现在要求α、μ、Σ,即猜出自然界已有但不知道的西瓜规律,怎么办?

因为我们相信这30个瓜是冥冥之中的天选之瓜,并且随机选的第1个瓜和第2个瓜是独立事件。先假设自然界中α、μ、Σ是存在,那么,算出这30个瓜的Pm(x),然后将30个Pm(x)相乘,得到的结果值 理论上应该是最大的。

所以,假如在α、μ、Σ为某值时算出了最大的结果值,此时猜的西瓜规律很有可能是对的,这些天选之瓜才会随机地恰好地被我们选中,出现在我们面前。这就是我们这样设置求解限制条件和算法流程中迭代的停止条件的原因。

上述就是极大似然法做的事情。我们在已有的结果面前推测我们未知但存在的规律。至于具体的解法,因为是求30个Pm(x)的乘积的最大值,先将这个式子取对数,就可以将多个数的乘法转化成加法了。接下来的变换、化简、求解就可以交给高数和计算机来解决啦。

求出 α、μ、Σ之后,相当于已经掌握了自然界分类瓜的神秘规律,那么这时按照这个规律来给瓜分类并贴上分类标签,就是很简单的事情了。把某个瓜代进3条我们求出来的高斯曲线,选出所在最大概率的曲线,就说明这个瓜来自这个类的可能性最大。这就是高斯混合聚类算法的最后一步:根据已知参数来分类。

 

高斯混合聚类的步骤:

1)首先假设样本集具有一些规律,包括可以 α 参数作为比例分为 k 类且每类内符合高斯分布。

2)根据贝叶斯原理利用极大似然法,求出决定分类比例的 α 和决定类内高斯分布的μ、Σ。

3)将样本根据 α、μ、Σ 再次通过贝叶斯原理求出样本该分在哪个簇。

整个步聚就是一种原型聚类:通过找到可以刻画样本的原型(α、μ、Σ参数),迭代得到α、μ、Σ参数的最优解。

将逻辑思路理清楚之后,高斯混合聚类并不复杂,只是因为它同时运用了高斯分布、贝叶斯公式、极大似然法和聚类的原理和思想,加上高数化简求解的步骤,而导致初读时比较容易感到有些混乱。

 

 

凝聚层次聚类

层次聚类算法实际上分为两类:自上而下或自下而上。自下而上的算法首先将每个数据点视为一个单一的簇,然后连续地合并(或聚合)两个簇,直到所有的簇都合并成一个包含所有数据点的簇。因此,自下而上层次聚类被称为凝聚式层次聚类或 HAC。这个簇的层次用树(或树状图)表示。树的根是收集所有样本的唯一簇,叶是仅仅具有一个样本的簇。在进入算法步骤前,请看下面的图例。

凝聚式层次聚类

1.我们首先将每个数据点视为一个单一的簇,即如果我们的数据集中有 X 个数据点,那么我们就有 X 个簇。然后,我们选择一个测量两个簇之间距离的距离度量标准。作为例子,我们将用 average linkage,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。

2.在每次迭代中,我们将两个簇合并成一个。这两个要合并的簇应具有最小的 average linkage。即根据我们选择的距离度量标准,这两个簇之间的距离最小,因此是最相似的,应该合并在一起。

3.重复步骤 2 直到我们到达树根,即我们只有一个包含所有数据点的簇。这样我们只需要选择何时停止合并簇,即何时停止构建树,来选择最终需要多少个簇!

层次聚类不需要我们指定簇的数量,我们甚至可以选择哪个数量的簇看起来最好,因为我们正在构建一棵树。另外,该算法对于距离度量标准的选择并不敏感;他们都同样表现很好,而对于其他聚类算法,距离度量标准的选择是至关重要的。层次聚类方法的一个特别好的例子是当基础数据具有层次结构,并且你想要恢复层次时;其他聚类算法不能做到这一点。与 K-Means 和 GMM 的线性复杂度不同,层次聚类的这些优点是以较低的效率为代价的,因为它具有 O(n³) 的时间复杂度。

 

图团体检测(Graph Community Detection)

当我们的数据可以被表示为一个网络或图(graph)时,我们可以使用图团体检测方法完成聚类。在这个算法中,图团体(graph community)通常被定义为一种顶点(vertice)的子集,其中的顶点相对于网络的其它部分要连接得更加紧密。

也许最直观的案例就是社交网络。其中的顶点表示人,连接顶点的边表示他们是朋友或互粉的用户。但是,若要将一个系统建模成一个网络,我们就必须要找到一种有效连接各个不同组件的方式。将图论用于聚类的一些创新应用包括:对图像数据的特征提取、分析基因调控网络(gene regulatory networks)等。

下面是一个简单的图,展示了最近浏览过的 8 个网站,根据他们的维基百科页面中的链接进行了连接。

这些顶点的颜色表示了它们的团体关系,大小是根据它们的中心度(centrality)确定的。这些聚类在现实生活中也很有意义,其中黄色顶点通常是参考/搜索网站,蓝色顶点全部是在线发布网站(文章、微博或代码)。

假设我们已经将该网络聚类成了一些团体。我们就可以使用该模块性分数来评估聚类的质量。分数更高表示我们将该网络分割成了「准确的(accurate)」团体,而低分则表示我们的聚类更接近随机。如下图所示:

模块性可以使用以下公式进行计算:

其中L代表网络中边的数量,k_i和 k_j是指每个顶点的degree,它可以通过将每一行和每一列的项加起来而得到。两者相乘再除以 2L表示当该网络是随机分配的时候顶点 i和 j之间的预期边数。

整体而言,括号中的项表示了该网络的真实结构和随机组合时的预期结构之间的差。研究它的值可以发现,当A_ij = 1且( k_i k_j ) / 2L很小时,其返回的值最高。这意味着,当在定点i和j之间存在一个「非预期」的边时,得到的值更高。

最后的δc_i, c_j就是大名鼎鼎的克罗内克δ函数(Kronecker-delta function)。下面是其 Python 解释:

通过以上公式可以计算图的模块性,且模块性越高,该网络聚类成不同团体的程度就越好。因此通过最优化方法寻找最大模块性就能发现聚类该网络的最佳方法。

组合学(combinatorics)告诉我们对于一个仅有 8 个顶点的网络,就存在 4140 种不同的聚类方式。16个顶点的网络的聚类方式将超过 100亿种。32 个顶点的网络的可能聚类方式更是将超过 128 septillion(10^21)种;如果你的网络有 80个顶点,那么其可聚类的方式的数量就已经超过了可观测宇宙中的原子数量。

因此,我们必须求助于一种启发式的方法,该方法在评估可以产生最高模块性分数的聚类上效果良好,而且并不需要尝试每一种可能性。这是一种被称为 Fast-Greedy Modularity-Maximization(快速贪婪模块性最大化)的算法,这种算法在一定程度上类似于上面描述的 agglomerative hierarchical clustering algorithm(集聚层次聚类算法)。只是 Mod-Max 并不根据距离(distance)来融合团体,而是根据模块性的改变来对团体进行融合。

下面是其工作方式:

  1. 首先初始分配每个顶点到其自己的团体,然后计算整个网络的模块性 M。
  2. 第 1 步要求每个团体对(community pair)至少被一条单边链接,如果有两个团体融合到了一起,该算法就计算由此造成的模块性改变 ΔM。
  3. 第 2 步是取 ΔM 出现了最大增长的团体对,然后融合。然后为这个聚类计算新的模块性 M,并记录下来。
  4. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。
  5. 当所有的顶点都被分组成了一个巨型聚类时,就可以停止了。然后该算法会检查这个过程中的记录,然后找到其中返回了最高 M 值的聚类模式。这就是返回的团体结构。

团体检测(community detection)是现在图论中一个热门的研究领域,它的局限性主要体现在会忽略一些小的集群,且只适用于结构化的图模型。但这一类算法在典型的结构化数据中和现实网状数据都有非常好的性能。

结语

以上就是数据科学家应该知道的 6 大聚类算法!我们将以展示各类算法的可视化效果结束本文! 

ML随记之聚类算法整理总结(各类聚类算法比较+聚类算法选取衡量标准) 聚类分析的算法可以分为划分法(Partitioning Methods)、层次法(Hierarchical Methods)、基于密度的方法(density-based methods)、基于网格的方法(grid-based methods)、基于模型的方法(Model-Based Methods)。 划分法: 给定一个有N个元组或者纪录的数据集,分裂法将构造K个分组,每一个分组就代表一个聚类,... 阅读详情

相关推荐

聚类算法汇总(附代码)

聚类算法汇总(附代码) 本次整理了聚类工程里面常见算法,以及给出合适的工程结构方便调用,编写常用的聚类指标当作聚类结果函数,并Github链接在文末,供大家交流学习。 文章目录聚类算法汇总(附代码)前言一、KMeans算法二、Kernel-Kmeans算法三、AP聚类算法四、谱聚类算法五、总结 前言 “物以类聚,人以群分” 下面介绍几种聚类算法 一、KMeans算法 主要实现了肘部法确定聚类簇数,以及调用python的库函数进行聚类,可以参考我前面的博文 二、Kernel-Kmeans算法 这一部分在

North_City_的博客 7358

dbscan js 实现_DBSCAN在PySpark上的实现

dbscan js 实现DBSCAN is a well-known clustering algorithm that has stood the test of time. Though the algorithm is not included in Spark MLLib. There are a few implementations (1, 2, 3) though they are ...

weixin_26632369的博客 801

PySpark 机器学习、自然语言处理与推荐系统配套代码+数据集.zip

使用Python开发的完整的前后台系统项目源码,可用于毕业设计、课程设计、练手学习等

pyspark环境使用dbscan聚类经纬度

DBSCAN on Spark我关注到的有三种实现 https://github.com/alitouka/spark_dbscan scala写的。作者还带有两个R写的小工具,which will help you choose parameters of the DBSCAN algorithm。 https://github.com/irvingc/dbscan-on-spark 用scala写的,据说占用较大内存。 An Implementation of DBSCAN on PySpa...

rover 3067

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 410

从零到一:基于Docker与OSM数据构建Valhalla路径规划服务及Mapbox风格可视化

本文详细介绍了如何从零开始,基于Docker容器技术快速部署开源的Valhalla路径规划服务。通过获取免费的OSM地图数据并构建路网,最终实现服务调用与Mapbox风格的地图可视化,为出行应用原型开发或本地化路径规划服务提供了一套完整、高效的实践方案。

weixin_29297127的博客 161

Pyspark:ml包中Classification\Clustering\Regression包的使用

本篇博客主要介绍pyspark.ml.Classification包的使用。

读万卷书 行万里路 1341

LightRAG实战:5分钟快速搭建一个轻量级法律问答系统(附完整代码)

本文通过实战指南,详细介绍了如何使用LightRAG技术快速搭建一个轻量级法律问答系统。该方案通过构建扁平化实体关系网络和混合检索策略,在5分钟内即可完成从环境准备到智能问答的完整流程,并附有完整代码,为中小团队和个人开发者提供了高效、低成本的AI应用解决方案。

time3的博客 277

实战:使用Spark MLlib进行聚类任务

1.背景介绍 聚类是一种无监督学习方法,它可以帮助我们在数据中发现隐藏的结构和模式。在大数据时代,Spark MLlib库提供了一系列的聚类算法,可以帮助我们更高效地处理大规模数据。本文将介绍Spark MLlib中的聚类算法,以及如何使用它们进行聚类任务。 聚类算法的主要目标是将数据点分为多个群集,使得同一群集内的数据点之间的距离较小,而同一群集之间的距离较大。聚类算法可以用于许多应用,如图...

AI天才研究院 1350

android OTA升级之后,apk崩溃无法启动

也就是说,我们这个高低版本是fingerprint相同的情况,这个问题追述到jenkins编译,启动job时会初始化一个BUILD_NUMBER值,这个值正好跟Android的build系统的名称重复,这就导致Android build系统那一套拼接时间戳的值不会走,因为jenkins一启动就会定义该值,而我们jenkins服务器迁移过,这个值又会从1开始累计,导致前后版本都是16,从而导致fingerprint一致。问题背景:系统版本从低版本升级到高版本后,apk崩溃启动失败。硬件平台:QCS6125。

kevin's cache的专栏 1346

【八股】JUC并发编程篇

👉抽象队列同步器,就是一种锁,内部维护的是一个先进先出的双向队列,队列中存储的是排队的线程,用state来标识是否有线程获得锁【0是无锁状态】👉流程:当一个线程拿到锁后会修改state = 1,这时如果有其他线程访问则会进入队列进行排序,直到state变成0后,队头线程才会拿到锁。在对state进行修改时,用的是CAS操作,所以可以保证原子性。👉它可以实现公平锁或非公平锁【默认】,上述是一个公平锁。如果新线程和队头线程抢锁资源就是非公平锁。

qq_44768318的博客 551

用Spark和DBSCAN对地理定位数据进行聚类

用Spark和DBSCAN对地理定位数据进行聚类 2017-01-21 大数据文摘 转自OReilly Data 机器学习,特别是聚类算法,可以用来确定哪些地理区域经常被一个用户访问和签到而哪些区域不是。这样的地理分析使多种服务成为可能,比如基于地理位置的推荐系统,先进的安全系统,或更通常来说,提供更个性化的用户体验。 在这篇文章中,我会确定对每个人来说特定

张伟的专栏 4963

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程BACnet MS/TP BACnet IP调试说明

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程mstp,bacnet ip调试说明

shufawangzhang的博客 2222

机器学习常用的算法整理:线性回归、逻辑回归、贝叶斯分类、支持向量机、K-means聚类、决策树、随机森林以及常用的应用场景整理

什么是机器学习? 机器学习是计算机利用已有的数据(经验)得出了某种模型,并利用这些模型预测未来的一种方法。这个过程其实与人的学习过程极为相似,只不过机器是一个可以进行大维度数据分析而且可以不知疲倦地学习的“怪兽”而已。 具体的机器学习过程如下: 机器学习算法纵览常见的机器学习算法: 产品视角的14种常见算法简单总结 决策树 无监督机器学习中,最常见4类聚类算法总结 :K-means聚类 Dbscan聚类 ...

古月哲亭 3155

AI 学术科研与论文写作的正确打开方式!不套提示词模板,靠这个思路完美实现人机共创

真正的“人机共创”,也就是AI引导我思考的过程,如果你想用你的模糊需求,去写出专业化的学术内容,那是不可能的。对想快速完成某些学术任务的同仁来说,我们完全不用去抠提示词的细节,直接用魔法打败魔法,设计一段优化提示词的结构化提示词(提示词架构),辅助优化你的模糊需求。创建好之后,可以对它提你的任何模糊学术需求,比如写论文、写综述、学术润色等等,它绝不会直接帮你生成,而是先搞懂你的真实意图。以上整个流程,完全没有一句废话,先是思考,再是向你提问弄懂你的意图,最后整合你给出的关键信息,直接优化你给的模糊需求。

智能AI让学术科研更容易 477

用 Custom Entity 打造 RAP Value Help:从能跑到好用的深度踩坑笔记

本文介绍了在RAP项目中实现Value Help(Fiori输入帮助)的完整流程。通过Custom Entity方式,开发者可以灵活构建不依赖数据库实体的值帮助功能,但需手动实现CDS原本提供的过滤、排序、分页等能力。文章以一个典型场景为例,详细说明了如何为Partner维护界面的City字段创建可搜索的值帮助,包括创建查询实现类、绑定CDS Custom Entity、服务发布等关键步骤,并特别指出了处理排序分页请求等常见问题。最后强调在ABAP Cloud环境下需要自行实现查询能力,而非依赖传统工具类。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 134

【亲测免费】 超详细机器学习12种常用算法PPT介绍

超详细机器学习12种常用算法PPT介绍 去发现同类优质开源项目:https://gitcode.com/ 此资源文件包含了一系列机器学习领域中常用的12种算法的详细讲解,并以PPT形式呈现。内容涉及以下算法: 回归算法:涵盖了线性回归、岭回归和套索回归等。 逻辑回归:一种广泛应用的分类算法。 决策树与集成算法:包括决策树、随机森林、Adaboost等。 聚类算法:介绍了K-means、层次聚类、...

gitblog_06700的博客 472

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

机器学习文献整理

机器学习文献整理 1.数据集 COIL-20图像集 http://www.cs.columbia.edu/CAVE/databases

GYY8023的博客 2025

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

机器学习电话面/视频面 cheetsheet ——常用机器学习算法优缺点一览(可直接打印)

机器学习电话面/视频面 cheetsheet ——常用机器学习算法优缺点一览(可直接打印)

数据分析之路 1040

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【机器学习】常用聚类算法原型

1. 聚类简介 在机器学习中,分为监督学习、无监督学习和半监督学习。前一篇博客中提到的回归和分类都属于监督学习,本文着重探讨无监督学习中的聚类算法。 博主之前看过一些资料,这两天也翻阅了网上的各大博客后,也想总结一下,写一写聚类相关的知识点,对自己所看的知识也算是总结,以后回想也有翻的资料。 聚类算法是数据在没有标签的情况下,但是还是认为数据具有各自族群,不属于同一类,对这些数据进行聚类后,...

JasonLeeeeeeeeee的博客 2276

聚类分析算法整理汇总大集合

开始学习聚类算法,网上查找资料,在这里整合一下。 概念 聚类是一种机器学习技术,它涉及到数据点的分组。给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组。理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中常用的统计数据分析技术。 算法思想:“物以类聚,人以群分” 如何将数据划分不同类别 通过计算样本之间的相识度,将相识度大的划分为一个类别。衡量样本之间的相识度的大小的方式有下面几种: 1、闵可夫

leiyulu的博客 8042

聚类算法:K-means聚类与系统(层次)聚类SPSS操作

1. 聚类模型的概念 “物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。 聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测; 也可以探究不同类之间的相关性和主要差异。 聚类和上一讲分类的区别:分类是已知类别的,聚类未知 2. K-means聚类算法(K均值) 2.1 步骤 指定需要划分的簇[cù]的个数K值(...

yanyanwenmeng的博客 2万+

机器学习常用算法整理

机器学习常面算法整理 机器学习领域有一条“没有免费的午餐”定理,没有任何一种算法能适用于所有问题,特别是在监督学习中。要判断算法优劣,数据集的大小和结构等众多因素都至关重要。 一、决策树 ...

工地搬砖第一年的博客 1551

【机器学习】聚类算法全解析:K-Means、层次聚类、DBSCAN在市场细分的应用

在机器学习的世界中,聚类算法是无监督学习的核心技术之一。它能在没有标签的数据中发现隐藏的模式和结构,帮助我们将数据分组。无论是电商平台根据客户行为划分群体,还是社交媒体分析用户兴趣,聚类算法都无处不在。本文将带你走进三种主流聚类算法——K-Means、层次聚类和DBSCAN,深入解析它们的原理、步骤和优缺点,并通过市场细分中的客户群体划分案例,展示它们的实际应用。无论你是初学者还是进阶开发者,这篇文章都能让你有所收获!聚类算法是无监督学习的重要分支,旨在将数据自动分组。

吴师兄大模型的博客 1777

机器学习笔记整理

关于我的Github 以下是机器学习部分的学习笔记的集合整理: 1.《机器学习前言之基本概念》 2.《机器学习之决策树》 3.《机器学习之最邻近规则分类KNN》 4.《机器学习之支持向量机SVM(一)》 5.《机器学习之支持向量机SVM(二)》 6.《机器学习之神经网络NN》 7.《机器学习之简单线性回归》 8.《机器学习之多元线性回归》 9.《机器学习之目标函数,损失函数和代价函数》 10.《机...

ShaneHolmes 3172

机器学习中的聚类算法有哪几种?

目前,聚类算法被广泛应用于用户画像、广告推荐、新闻推送和图像分割等等。聚类算法是机器学习中一种“数据探索”的分析方法,它帮助我们在大量的数据中探索和发现数据的结构。那么机器学习中的聚类算法有哪几种呢?下面我将为大家一一介绍常见的几种聚类算法,分别是高斯聚类模型、基于密度的聚类算法、凝聚层次聚类和均值漂移算法。机器学习中的聚类算法有哪几种?1、高斯聚类模型事实上,GMM 和 k-means 很像,不过 GMM 是学习出一些概率密度函数来,简单地说,k-means 的结果是每个数据点被 assign 到其中某一

gu1857035894的博客 2737
上一篇: java OOP面向对象三大特性五大原则 + 低耦合高内聚
下一篇: spark rdd详解 整理
CWS_chen
博客等级 码龄11年 220粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值