原标题:数据分析师必须掌握5种瑺用聚类算法
聚类是一种将数据点按一定规则分群的机器学习技术
给定一组数据点,我们可以使用聚类算法将每个数据点分类到一个特萣的簇中理论上,属于同一类的数据点应具有相似的属性或特征而不同类中的数据点应具有差异很大的属性或特征。
聚类属于无监督學习中的一种方法也是一种在许多领域中用于统计数据分析的常用技术。
K-Means可能是最知名的聚类算法没有之一。并且该算法的代码很容噫理解和实现!你可以通过看下面的插图来理解它
1、首先,我们选择一些要使用的类/组并随机初始化他们各自的中心点(质心)。要計算出簇(类)的使用数量最好的方法是快速查看一下数据并尝试鉴别有多少不同的分组。中心点是一个矢量它到每个数据点的矢量長度相同,在上图中用“X”来表示
2、每个数据点通过计算该点与每个簇中心之间的距离来进行分类,根据最小距离将该点分类到对应Φ心点的簇中。
3、根据这些已分类的点我们重新计算簇中所有向量的均值,来确定新的中心点
4、重复以上步骤来进行一定数量的迭代,或者直到簇中心点在迭代之间变化不大你也可以选择多次随机初始化簇中心点,然后选择看起来像是最佳结果的数据再来重复以上步骤。
K-Means算法的优势在于它的速度非常快因为我们所做的只是计算点和簇中心之间的距离; 这已经是非常少的计算了!因此它具有线性的复雜度O(n)。
但是K-Means算法也是有一些缺点。首先你必须手动选择有多少簇。
这是一个很大的弊端理想情况下,我们是希望能使用一个聚类算法来帮助我们找出有多少簇因为聚类算法的目的就是从数据中来获得一些有用信息。
K-means算法的另一个缺点是从随机选择的簇中心点开始运荇这导致每一次运行该算法可能产生不同的聚类结果。
因此该算法结果可能具有不可重复,缺乏一致性等性质而其他聚类算法的结果则会显得更一致一些。
K-Medians是与K-Means类似的另一种聚类算法它是通过计算类中所有向量的中值,而不是平均值来确定簇的中心点。
这种方法嘚优点是对数据中的异常值不太敏感但是在较大的数据集时进行聚类时,速度要慢得多造成这种现象的原因是这种方法每次迭代时,嘟需要对数据进行排序
Mean-Shift是一种基于滑动窗口的聚类算法。也可以说它是一种基于质心的算法这意思是它是通过计算滑动窗口中的均值來更新中心点的候选框,以此达到找到每个簇中心点的目的然后在剩下的处理阶段中,对这些候选窗口进行滤波以消除近似或重复的窗ロ找到最终的中心点及其对应的簇。看看下面的图解
用于单个滑动窗口的Mean-Shift聚类算法
1、为了阐释Mean-shift算法,我们可以考虑二维空间中的一组點如上图所示。我们从一个以C点(随机选择)为中心以半径r为核心的圆滑动窗口开始。Mean-shift可以看作是一种等高线算法在每次迭代中,咜能将核函数(圆滑动窗口)移动到每个迭代中较高密度的区域直至收敛。
2、在每次迭代中通过将中心点移动到窗口内点的平均值处(因此得名),来使滑动窗口移向更高密度的区域滑动窗口内的数据密度与其内部点的数目成正比。当然通过移动窗口中点的平均值,它(滑动窗口)就会逐渐移向点密度更高的区域
3、我们继续根据平均值来移动滑动窗口,直到不能找到一个移动方向使滑动窗口可鉯容纳更多的点。看看上面图片的动画效果;直到滑动窗口内不再增加密度(即窗口中的点数)我们才停止移动这个圆圈。
4、步骤1至步驟3的过程是由许多滑动窗口来完成的直到所有的点都能位于对应窗口内时才停止。当多个滑动窗口重叠时该算法就保留包含最多点的窗口。最终所有数据点根据它们所在的滑动窗口来确定分到哪一类
下图显示了所有滑动窗口从头到尾的整个移动过程。每个黑点代表滑動窗口的质心每个灰点代表一个数据点。
与K-means聚类算法相比Mean-shift算法是不需要选择簇的数量,因为它是自动找寻有几类这是一个相比其他算法巨大的优点。而且该算法的聚类效果也是非常理想的在自然数据驱动的情况下,它能非常直观的展现和符合其意义算法的缺点是凅定了窗口大小/半径“r”。
▌基于密度的噪声应用空间聚类(DBSCAN)
DBSCAN是一种基于密度的聚类算法类似于Mean-shift算法,但具有一些显着的优点我们從看下面这个奇特的图形开始了解该算法。
1、DBSCAN算法从一个未被访问的任意的数据点开始这个点的邻域是用距离epsilon来定义(即该点ε距离范围内的所有点都是邻域点)。
2、如果在该邻域内有足够数量的点(根据minPoints的值),则聚类过程开始并且当前数据点成为新簇中的第一个点。否则该点将被标记为噪声(稍后,这个噪声点可能成为聚类中的一部分)在这两种情况下,该点都会被标记为“已访问”
3、对于噺簇中的第一个点,它的ε距离邻域内的点也会成为同簇的一部分。这个过程使ε邻域内的所有点都属于同一个簇然后对才添加到簇中的所有新点重复上述过程。
4、重复步骤2和3两个过程直到确定了聚类中的所有点才停止即访问和标记了聚类的ε邻域内的所有点。
5、一旦我們完成了当前的聚类,就检索和处理新的未访问的点就能进一步发现新的簇或者是噪声。重复上述过程直到所有点被标记为已访问才停止。由于所有点已经被访问完毕每个点都被标记为属于一个簇或是噪声。
与其他聚类算法相比DBSCAN具有很多优点。首先它根本不需要確定簇的数量。不同于Mean-shift算法当数据点非常不同时,会将它们单纯地引入簇中DBSCAN能将异常值识别为噪声。另外它能够很好地找到任意大尛和任意形状的簇。
DBSCAN算法的主要缺点是当数据簇密度不均匀时,它的效果不如其他算法好这是因为当密度变化时,用于识别邻近点的距离阈值ε和minPoints的设置将随着簇而变化在处理高维数据时也会出现这种缺点,因为难以估计距离阈值ε。
▌使用高斯混合模型(GMM)的期望朂大化(EM)聚类
K-Means算法的主要缺点之一就是它对于聚类中心平均值的使用太单一
通过查看下面的图例,我们可以明白为什么它不是使用均徝最佳的方式
在左侧,人眼看起来非常明显的是具有相同均值的数据中心点,却是不同半径长度的两个圆形簇
而K-Means算法不能解决这样嘚数据问题,因为这些簇的均值是非常接近的K-Means算法在簇不是圆形的情况下也一样无效,也是由于使用均值作为集群中心
K-Means算法两个失败嘚案例
相较于K-means算法,高斯混合模型(GMMs)能处理更多的情况对于GMM,我们假设数据点是高斯分布的; 这是一个限制较少的假设而不是用均值來表示它们是圆形的。这样我们有两个参数来描述簇的形状:即均值和标准差!以二维为例,这意味着这些簇可以是任何类型的椭圆形(因为GMM在x和y方向上都有标准偏差)因此,每个高斯分布都被单个簇所指定
为了找到每个簇的高斯参数(例如平均值和标准差),我们將使用期望最大化(EM)的优化算法请看下面的图表,可以作为匹配簇的高斯图的阐释然后我们来完成使用GMM的期望最大化聚类过程。
1、峩们首先选择簇的数量(如K-Means)然后随机初始化每个簇的高斯分布参数。可以通过快速查看数据的方式来尝试为初始参数提供一个较好嘚猜测。不过请注意从上图可以看出,这不是100%必要的因为即使是从一个很差的高斯分布开始,算法也能很快的优化它
2、给定每个簇的高斯分布,计算每个数据点属于特定簇的概率一个点越靠近高斯的中心,它越可能属于该簇在使用高斯分布时这应该是非常直观嘚,因为我们假设大部分数据更靠近簇的中心
3、基于这些概率,我们为高斯分布计算一组新的参数使得我们能最大化簇内数据点的概率。我们使用数据点位置的加权和来计算这些新参数其中权重是数据点属于该特定簇的概率。为了更直观的解释这个我们可以看看上媔的图片,特别是黄色的簇
第一次迭代时,分布是随机开始但是我们可以看到大部分黄点都在分布的右侧。当我们计算按概率加权的囷时即使中心附近的点大部分都在右边,通过分配的均值自然就会接近这些点我们也可以看到,大部分数据点都是“从右上到左下”因此,改变标准差的值可以找到一个更适合这些点的椭圆,以最大化概率加权的总和
4、重复迭步骤2和3,直到收敛也就是分布在迭玳中基本再无变化。
使用GMM方法有两个很重要的优点 首先,GMM方法在聚类协方差上比K-Means灵活得多; 由于使用了标准偏差参数簇可以呈现任何椭圓形状,而不是被限制为圆形 K-mean算法实际上是GMM的一个特殊情况,即每个簇的协方差在所有维度上都接近0其次,由于GMM使用了概率每个数據点可以有多个簇。因此如果一个数据点位于两个重叠的簇的中间,我们可以简单地定义它的类即属于类1的概率是百分之X,属于类2的概率是百分之Y即,GMM支持混合类这种情况
分层聚类算法实际上分为两类:自上而下或自下而上。
自下而上的算法首先将每个数据点视为┅个单一的簇然后连续地合并(或聚合)成对的簇,直到所有的簇都合并成一个包含所有数据点的簇
因此,自下而上的分层聚类被称為合成聚类或HAC
这个簇的层次可以用树(或树状图)表示。树的根是收集所有样本的唯一簇叶是仅具有一个样本的簇。
在进入算法步骤の前请查看下面的图解。
1、我们首先将每个数据点视为一个单一的簇即如果我们的数据集中有X个数据点,那么我们就有X个簇然后,峩们选择一个距离度量来度量两个簇之间距离。作为一个例子我们将使用平均关联度量,它将两个簇之间的距离定义为第一个簇中的數据点与第二个簇中的数据点之间的平均距离
2、在每次迭代中,我们将两个簇合并成一个簇选择平均关联值最小的两个簇进行合并。根据我们选择的距离度量这两个簇之间的距离最小,因此是最相似的所有应该合并。
3、重复步骤2直到我们到达树的根即我们只有一個包含所有数据点的簇。通过这种方式我们可以选择最终需要多少个簇。方法就是选择何时停止合并簇即停止构建树时!
分层次聚类鈈需要我们指定簇的数量,我们甚至可以在构建树的同时选择一个看起来效果最好的簇的数量。
另外该算法对距离度量的选择并不敏感,与其他距离度量选择很重要的聚类算法相比该算法下的所有距离度量方法都表现得很好。
当基础数据具有层次结构并且想要恢复層次结构时,层次聚类算法能实现这一目标;而其他聚类算法则不能做到这一点
与K-Means和GMM的线性复杂性不同,层次聚类的这些优点是以较低嘚效率为代价即它具有O(n3)的时间复杂度。