精华内容
下载资源
问答
  • 聚类算法

    2021-03-08 11:19:31
    6.1聚类算法简介 1.聚类算法的分类 粗聚类 细聚类 ...n_clusters:开始的聚类中心数量 6.3聚类算法实现流程 k-means其实包含两层 k --- 选几个中心点 means ---均值计算 流程: 1、随机设置K个

    6.1聚类算法简介

    1.聚类算法的分类
    
    	粗聚类
    
    	细聚类
    
    2.定义:
    
    	一种典型的无监督学习算法,主要用于将相似的的样本自动轨道一个类别中,计算样本和样本之间的相似性,一般使用欧氏距离
    

    6.2聚类算法api初步使用

    1.api
    
    	sklearn.cluster.KMeans(n_clusters=8)
    

    参数:

    n_clusters:开始的聚类中心数量
    

    6.3聚类算法实现流程

    k-means其实包含两层

    	k --- 选几个中心点
    
    	means ---均值计算
    

    流程:

    • 1、随机设置K个特征空间内的点作为初始的聚类中心
    • 2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
    • 3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
    • 4、如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程

    kmeans小结

    kmeans由于要计算质心到每个样本的距离,所以其收敛速度比较慢
    

    6.4模型评估

    0.误差平方值

    误差平方和
    
    值越小越好
    
    1. 肘部法
    
    	下降率突然变缓时即认为是最佳的k值
    	
    2. SC系数
    
    	取值为[-1, 1],其值越大越好
    	
    3. CH系数
    
    	分数s高则聚类效果越好
    

    CH需要达到的目的:

    	用尽量少的类别聚类尽量多的样本,同时获得较好的聚类效果。
    
    展开全文
  • matlab实现k聚类算法

    2020-05-13 22:46:59
    matlab实现k聚类算法实例,从excel表格中读取二维数据点(x,y),然后将数据点分类,可以自主调节类别数量。压缩包包含如下内容:kmeans聚类函数(kmeans_clustering.m),测试代码(main.m),测试数据(testdata....
  • 包含10个clusters,在用k个worker进行分布式训练时,最后输出embedding可视化后会产生10*k个clusters。已经调试过每个workersample_node和sample_edge可以采样到0-9不同尾号node,请问这个...
  • 聚类分析 之 凝聚层次聚类

    千次阅读 2019-12-17 19:46:59
    需要定义簇邻近性概念(开始每个点都是一个簇,然后不断合并减少簇的数量)。 分裂; 从包含所有点某个簇开始,每一步分裂一个簇,直到仅剩下单点簇。 在这种情况下,我们需要确定每一步分裂哪个簇,以及...

    old , but useful .

    两种产生层次聚类的基本方法:

    • 凝聚的: 从点作为个体簇开始,每一步合并两个最近的簇,
      需要定义簇的邻近性概念(开始每个点都是一个簇,然后不断合并减少簇的数量)。

    • 分裂的; 从包含所有点的某个簇开始,每一步分裂一个簇,直到仅剩下单点簇。
      在这种情况下,我们需要确定每一步分裂哪个簇,以及如何分裂?

       下面将先介绍凝聚层次聚类技术。
      

    2. 层次聚类

    层次聚类常常使用称作树状图(dendrogram)的类似树的图显示,该图显示簇-子簇联系和簇合并(凝聚)或分裂的次序。度域二维点的集合,层次聚类也可以使用嵌套簇图(nested cluster diagram)表示,在这里插入图片描述

    2.1 基本凝聚层次聚类算法

    许多凝聚层次聚类技术都是这个方法的变种,从个体点作为簇开始,相继合并两个最接近的簇,直到剩下一个簇。

    2.1.1 如何定义簇之间的邻近性——簇之间满足什么条件才可以认为是邻近的?

    簇的邻近性通常用特定的簇类型定义,如许多凝聚层次聚类技术都源于簇的基于图的观点。

    • MIN / 单链(single link) 定义簇的邻近度为不同簇的两个最近的点之间的邻近度,(或者使用图的术语:不同的结点子集中两个结点之间的最短边)
    • MAX / 全链(complete link) 取不同簇中两个最远的点之间的邻近度作为簇的邻近度(或者使用图的术语: 不同的结点子集中两个结点之间的最长边。)
    • 组平均(group average)技术 它定义簇邻近度为取自不同簇的所有点对邻近度的平均值(平均边长)。在这里插入图片描述
    • 矩心之间的距离:在这里插入图片描述
    • 由目标函数驱动的其他方法,如 Ward 的方法使用平方误差

    2.1.2 时间和空间复杂性

    基本凝聚层次聚类算法使用邻近度矩阵,这需要存储 m 2 / 2 个邻近度(假定邻近度矩阵是对称的),其中 m 是数据点的个数。 记录簇所需要的空间正比于簇的个数为 m-1,不包括单点簇,因此总的空间复杂度为 O (m2)。总的时间复杂度为 O(m2log m)。
    不够详细,实践中总结

    凝聚层次聚类过程

    1. 从单个点的簇和邻近矩阵开始:在这里插入图片描述
    2. 在一些合并步骤后,我们有一些聚类:在这里插入图片描述
    3. 我们想合并两个最近的聚类(C2 和 C5)并更新邻近矩阵
      在这里插入图片描述

    聚类相似性——MIN 或单链

    两个簇的相似性基于不同簇中的两个最相似(最接近)点。

    • 由一对点确定,即由邻近图中的一个链接确定。如果从所有点作为单点簇开始,每次在点之间加上一条链,最短的链先加,则这些链将点合并成簇。
    • 单链 擅长处理非椭圆形状的簇,但对噪声和离群点很敏感(可以从下面的演示过程看出)
    1. 下图中显示了 6 个点的坐标以及他们之间的欧几里得距离矩阵。树状图中两个簇合并出的高度反映了两个簇的距离。如 点 3 和 点 6 的距离是 0.11,这就是他们在树状图里合并处的高度。
      在这里插入图片描述在这里插入图片描述
    2. 一开始坐标中的 6 个点都作为单点簇。
      在这里插入图片描述
    3. 由于点 3 和 点 6 的距离最小,所以先合并点 3 和 点 6 作为一个簇,现在有 5 个簇。

    在这里插入图片描述

    1. 之后 点 2 和 点 5 合并成一个簇。
      在这里插入图片描述

    2. 之前的新簇(点 3 和 点 6 合并)与刚才形成的簇(点 2 和 点 5 合并) 继续合并成新簇。

    在这里插入图片描述

    6.最终形成如图的一个簇。
    在这里插入图片描述

    聚类相似性——全链或MAX或团

    • 对于层次聚类的全链或 MAX版本,两个簇的邻近度定义为两个不同簇中任意两个之间的最长距离(最小相似度)。
    • 如果所有点作为单点簇开始,每次在点之间加上一条链,最短的链先加,则一组点直到其中所有的点都完全被连接(即形成团)才形成一个簇。挑选两簇(两簇中之间最长的链与其他簇的最长相比链最短)
    • 完全连接对噪声和离群点不太敏感,但是它可能使大的簇破裂,并且偏好球形。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    聚类相似性——组平均

    对于层次聚类的组平均版本,两个簇的邻近度定义为不同簇的所有点对邻近度的平均值。这是一种界于单链和全链之间的折中办法。对于组平均,簇 C i 和 Cj 的邻近度 proximity(Ci,Cj)由下式定义:
    在这里插入图片描述
    在这里插入图片描述
    mi ,mj 为簇的点个数,分子为两个簇点与点的链距离之和。

    聚类相似性分析——Ward方法和质心方法

    对于 Ward 方法,两个簇的邻近度定义为两个簇合并时导致的平方误差的增量。,这样一来,该方法使用的目标函数和K均值相同,好像这一特点让Ward 方法不同与其他层次聚类技术,但是可以从数学上证明,当两个点之间的邻近度取它们之间距离的平方是, Ward 方法与组平均非常相似。

    质心方法通过计算簇质心之间的距离来计算两个簇之间的邻近度。看起来和 K 均值类似,但是只有 Ward 方法才真正与它类似。

    质心方法还具有一种我们讨论过的其他层次聚类技术所不具备的特性(常被认为是坏的):倒置(inversion)的可能性。合并的两个簇可能比前一步合并的簇对更相似。对于其他方法,被合并的簇之间的距离随层次聚类进展单调地增加(或者,在最坏的情况下不增加)。

    簇邻近度的 Lance-Williams公式

    本节讨论的任何簇邻近度都可以看做簇 Q 和 R 之间邻近度的不同参数(Lance-Williams公式)的一种选择,其中 R 是合并簇 A 和 簇 B 形成的。
    在这里插入图片描述
    任何可以使用 Lance-Williams 公式表示的层次聚类技术都不需要保留原来的数据点。

    层次聚类——时间和空间要求

    • O(n)空间复杂度,因为它使用邻近矩阵。n 是点数。
    • O(n3)在多数情况下的时间复杂度,有 n 个步骤,并且每个步骤,必须更新和搜索大小 n2 ,邻近矩阵。
    • 对于一些方法,时间复杂度可以减少到 O(n2log n)。

    层次聚类的主要问题

    1. 一旦决定组合两个集群,无法退回。
    2. 没有目标函数被直接最小化。
      凝聚层次聚类不能被视为全局优化目标函数,凝聚层次聚类技术使用各种标准,在每一步局部地确定哪些簇应当合并(或分裂),这种方法产生的聚类算法避开了解决困难的组合优化问题,这样的方法没有局部极小问题或很难选择初始点的问题。
    3. 不同的方案具有以下一个或多个问题:
    • 对噪声和异常值的敏感性
    • 难以处理不同大小的簇和凸形
    • 分离大集群

    就计算量和存储需求而言,凝聚层次算法是昂贵的,所有合并都是最终的,对于噪声、高维数据,这也可能造成问题,先使用其他技术进行部分聚类,这两个问题都可以在某种程度上解决。

    展开全文
  • 结果,相应的聚类中心和主方向确定了一条直线,被聚类边缘截取的部分就是我们想要的断层。 所提出的方法减少了传统方法相关计算的时间消耗。 简化了计算工作,获得了地震断层的断层数。 为了证实该方法的可行性和...
  • 1. K-Means(K均值)聚类算法步骤:(1) 首先我们选择一些类/组,并随机初始化它们各自中心点。中心点是与每个数据点向量长度相同位置。这需要我们提前预知类的数量(即中心点的数量)。(2) 计算每个数据点到中心点...

    1. K-Means(K均值)聚类

    算法步骤:(1) 首先我们选择一些类/组,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置。这需要我们提前预知类的数量(即中心点的数量)。(2) 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。(3) 计算每一类中中心点作为新的中心点。(4) 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个。下图演示了K-Means进行分类的过程:

    0eac07d9c90ecc42a4a1071bac432b5b.gif

    优点:速度快,计算简便缺点:我们必须提前知道数据有多少类/组。K-Medians是K-Means的一种变体,是用数据集的中位数而不是均值来计算数据的中心点。K-Medians的优势是使用中位数来计算中心点不受异常值的影响;缺点是计算中位数时需要对数据集中的数据进行排序,速度相对于K-Means较慢。

    2. 均值漂移聚类

    均值漂移聚类是基于滑动窗口的算法,来找到数据点的密集区域。这是一个基于质心的算法,通过将中心点的候选点更新为滑动窗口内点的均值来完成,来定位每个组/类的中心点。然后对这些候选窗口进行相似窗口进行去除,最终形成中心点集及相应的分组。具体步骤:1. 确定滑动窗口半径r,以随机选取的中心点C半径为r的圆形滑动窗口开始滑动。均值漂移类似一种爬山算法,在每一次迭代中向密度更高的区域移动,直到收敛。2. 每一次滑动到新的区域,计算滑动窗口内的均值来作为中心点,滑动窗口内的点的数量为窗口内的密度。在每一次移动中,窗口会想密度更高的区域移动。3. 移动窗口,计算窗口内的中心点以及窗口内的密度,知道没有方向在窗口内可以容纳更多的点,即一直移动到圆内密度不再增加为止。4. 步骤一到三会产生很多个滑动窗口,当多个滑动窗口重叠时,保留包含最多点的窗口,然后根据数据点所在的滑动窗口进行聚类。下图演示了均值漂移聚类的计算步骤:

    8b47cef6e3d20297bbc4da473bbcc613.gif

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

    eb4e4b9adac9a9684a02bff6ee671704.gif

    优点:(1)不同于K-Means算法,均值漂移聚类算法不需要我们知道有多少类/组。(2)基于密度的算法相比于K-Means受均值影响较小。缺点:(1)窗口半径r的选择可能是不重要的。

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

    与均值漂移聚类类似,DBSCAN也是基于密度的聚类算法。具体步骤:1. 首先确定半径r和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点被标记为central point,反之则会被标记为noise point。2. 重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,知道所有的点都被访问过。优点:不需要知道簇的数量缺点:需要确定距离r和minPoints

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

    K-Means的缺点在于对聚类中心均值的简单使用。下面的图中的两个圆如果使用K-Means则不能作出正确的类的判断。同样的,如果数据集中的点类似下图中曲线的情况也是不能正确分类的。

    633350e33d2b8387f8f60b758d78164c.png

    使用高斯混合模型(GMM)做聚类首先假设数据点是呈高斯分布的,相对应K-Means假设数据点是圆形的,高斯分布(椭圆形)给出了更多的可能性。我们有两个参数来描述簇的形状:均值和标准差。所以这些簇可以采取任何形状的椭圆形,因为在x,y方向上都有标准差。因此,每个高斯分布被分配给单个簇。所以要做聚类首先应该找到数据集的均值和标准差,我们将采用一个叫做最大期望(EM)的优化算法。下图演示了使用GMMs进行最大期望的聚类过程。

    6ebaaa6a1856dc0c5aafb225458d6f07.gif

    具体步骤:1. 选择簇的数量(与K-Means类似)并随机初始化每个簇的高斯分布参数(均值和方差)。也可以先观察数据给出一个相对精确的均值和方差。2. 给定每个簇的高斯分布,计算每个数据点属于每个簇的概率。一个点越靠近高斯分布的中心就越可能属于该簇。3. 基于这些概率我们计算高斯分布参数使得数据点的概率最大化,可以使用数据点概率的加权来计算这些新的参数,权重就是数据点属于该簇的概率。4. 重复迭代2和3直到在迭代中的变化不大。GMMs的优点:(1)GMMs使用均值和标准差,簇可以呈现出椭圆形而不是仅仅限制于圆形。K-Means是GMMs的一个特殊情况,是方差在所有维度上都接近于0时簇就会呈现出圆形。(2)GMMs是使用概率,所有一个数据点可以属于多个簇。例如数据点X可以有百分之20的概率属于A簇,百分之80的概率属于B簇。也就是说GMMs可以支持混合资格。

    5. 凝聚层次聚类

    层次聚类算法分为两类:自上而下和自下而上。凝聚层级聚类(HAC)是自下而上的一种聚类算法。HAC首先将每个数据点视为一个单一的簇,然后计算所有簇之间的距离来合并簇,知道所有的簇聚合成为一个簇为止。下图为凝聚层级聚类的一个实例:

    3efd6cc8dff831e83b7288ed63a684bd.gif

    具体步骤:1. 首先我们将每个数据点视为一个单一的簇,然后选择一个测量两个簇之间距离的度量标准。例如我们使用average linkage作为标准,它将两个簇之间的距离定义为第一个簇中的数据点与第二个簇中的数据点之间的平均距离。2. 在每次迭代中,我们将两个具有最小average linkage的簇合并成为一个簇。3. 重复步骤2知道所有的数据点合并成一个簇,然后选择我们需要多少个簇。层次聚类优点:(1)不需要知道有多少个簇(2)对于距离度量标准的选择并不敏感缺点:效率低

    6. 图团体检测(Graph Community Detection)

    当我们的数据可以被表示为网络或图是,可以使用图团体检测方法完成聚类。在这个算法中图团体(graph community)通常被定义为一种顶点(vertice)的子集,其中的顶点相对于网络的其他部分要连接的更加紧密。下图展示了一个简单的图,展示了最近浏览过的8个网站,根据他们的维基百科页面中的链接进行了连接。

    23362b463858daaa5484641fff6aa9ad.png

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

    efedbd08127d69a84e98d19e09f29644.png

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

    b3bd9f17c031072941e901138cf47032.png

    代表了该网络的真实结构和随机组合时的预期结构之间的差。当Aij为1时,且

    0e07eeb8e46247b9a4f2f2da3e1176a1.png

    很小的时候,其返回值最高。也就是说,当在定点i和j之间存在一个非预期边是得到的值更高。

    481b3cb40c0a7a5319692a40dee1c1e1.png

    是克罗内克δ函数(Kronecker-delta function). 下面是其Python解释:

    def Kronecker_Delta(ci,cj):    if ci==cj:        return 1    else:        return 0

    通过上述公式可以计算图的模块性,且模块性越高,该网络聚类成不同团体的程度越好,因此通过最优化方法寻找最大模块性就能发现聚类该网络的最佳方法。组合学告诉我们对于一个仅有8个顶点的网络,就存在4140种不同的聚类方式,16个顶点的网络的聚类方式将超过100亿种。32个顶点的网络的可能聚类方式更是将超过10^21种。因此,我们必须寻找一种启发式的方法使其不需要尝试每一种可能性。这种方法叫做Fast-Greedy Modularity-Maximization(快速贪婪模块性最大化)的算法,这种算法在一定程度上类似于上面描述的集聚层次聚类算法。只是这种算法不根据距离来融合团体,而是根据模块性的改变来对团体进行融合。具体步骤:1. 首先初始分配每个顶点到其自己的团体,然后计算整个网络的模块性 M。2. 第 1 步要求每个团体对(community pair)至少被一条单边链接,如果有两个团体融合到了一起,该算法就计算由此造成的模块性改变 ΔM。3. 第 2 步是取 ΔM 出现了最大增长的团体对,然后融合。然后为这个聚类计算新的模块性 M,并记录下来。4. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。5. 重复第 1 步和 第 2 步——每一次都融合团体对,这样最后得到 ΔM 的最大增益,然后记录新的聚类模式及其相应的模块性分数 M。

    版权声明:本文为CSDN博主「诗蕊」的原创文章,遵循 CC 4.0 BY-SA 版权协议

    原文链接:https://blog.csdn.net/Katherine_hsr/article/details/79382249

    【数据小盐罐儿】一个“咸”的无聊的数据分析公众号,不定期分享一些有趣好玩的项目以及大量的学习资源

    展开全文
  • 其次,采用投票机制对得到的聚类结果进行簇标识,即以簇中最多文本的类别作为簇的类别,得到的识别模型由具有标识的簇组成;最后,结合最近邻分类思想,对输入的邮件进行自动识别。实验结果表明,该方法可大幅度地降低邮件...
  • 层次聚类算法主要优点在于...命名规则在我们开始之前,我们先设定一下命名规则来帮助理解本篇教程:X - 实验样本(n 乘 m 数组)n - 样本数量m - 样本特征数量Z - 集群关系数组(包含层次聚类信息)k - 集群数量导...

    层次聚类算法的主要优点在于我们无需事先知道最终所需集群数量。很遗憾的是,网上并没有很详细的教程讲述如何使用 SciPy 的层次聚类包进行层次聚类。本教程将帮助你学习如何使用 SciPy 的层次聚类模块。

    命名规则

    在我们开始之前,我们先设定一下命名规则来帮助理解本篇教程:

    X - 实验样本(n 乘 m 的数组)

    n - 样本数量

    m - 样本特征数量

    Z - 集群关系数组(包含层次聚类信息)

    k - 集群数量

    导入所需模块及环境搭配

    from matplotlib import pyplot as plt

    from scipy.cluster.hierarchy import dendrogram, linkage

    import numpy as np

    %matplotlib inline

    np.set_printoptions(precision=5, suppress=True)

    生成实验样本

    如果你已经有自己的实验样本了,那么你可以选择跳过此步骤。但是要注意的是,你必须确保你的实验样本是一个 NumPy 矩阵 X,包含 n 个实验样本以及 m 个样本特征,即 X.shape == (n, m)。

    # 生成两个集群: 集群 a 有100个数据点, 集群 b 有50个数据点:

    np.random.seed(1029)

    a = np.random.multivariate_normal([10, 0], [[3, 1], [1, 4]], size=[100,])

    b = np.random.multivariate_normal([0, 20], [[3, 1], [1, 4]], size=[50,])

    X = np.concatenate((a, b),)

    plt.figure(figsize=(25, 10))

    plt.scatter(X[:, 0], X[:, 1])

    plt.show()

    进行层次聚类

    我们现在已经有了非常简单的实验样本,那我们来进行真正的聚类算法吧:

    # 建立集群关系数组

    Z = linkage(X, 'ward')

    聚类结束。很简单吧 :smile:。不用惊讶,毕竟这是 Python 嘛。

    在这一行代码中,根据 SciPy 的 linkage 模块文档所述,'ward' 是一种用于计算集群之间距离的方法。'ward' 表明 linkage() 方法会使用离差平方和算法。

    使用 'ward' 是一个不错的选择。当然还有其他通用的距离算法,例如 'single','complete','average'。如果你了解这些算法,那么你可以选择使用这些方法进行层次聚类。

    你可以使用 cophenet() 计算同表象相关系数来判断集群的性能。这个方程非常简单的比对了所有实验样本之间的距离和聚类之后的样本距离。如果这个值越接近于1,集群结果就更加完整的保存了实验样本间的实际距离。在我们的实验中,这个值非常接近于1:

    from scipy.cluster.hierarchy import cophenet

    from scipy.spatial.distance import pdist

    c, coph_dists = cophenet(Z, pdist(X))

    print c

    0.9840295755

    不管你使用了何种 method 和 metric,linkage() 方程都会利用这些方法计算集群间的距离,并在每一步合并距离最短的两个集群。linkage() 方程会返回一个长度为 n - 1 的数组,包含在每一步合并集群的信息:

    print Z[0]

    [ 124. 141. 0.07372 2. ]

    这个矩阵的每一行的格式是这样的 [idx, idx2, dist, sample_count]。

    在第一步中,linkage 算法决定合并集群124和集群141,因为他们之间的距离为0.07372,为当前最短距离。这里的124和141分别代表在原始样本中的数组下标。在这一步中,一个具有两个实验样本的集群诞生了。

    print Z[1]

    [ 131. 139. 0.0753 2. ]

    在第二步中,linkage 算法决定合并集群131和集群139,因为他们之间的距离为0.0753,为当前最短距离。在这一步中,另一个具有两个实验样本的集群诞生了。

    直到这一步,集群的下标和原本实验样本的下标是互相对应的,但是记住,我们只有150个实验样本,所以我们一共只有下标0至149。让我们来看看前20步:

    print Z[:20]

    [[ 124. 141. 0.07372 2. ]

    [ 131. 139. 0.0753 2. ]

    [ 136. 142. 0.07767 2. ]

    [ 10. 18. 0.08463 2. ]

    [ 60. 90. 0.09049 2. ]

    [ 30. 44. 0.1052 2. ]

    [ 4. 17. 0.1214 2. ]

    [ 56. 153. 0.15189 3. ]

    [ 58. 63. 0.16933 2. ]

    [ 2. 92. 0.17203 2. ]

    [ 118. 119. 0.18263 2. ]

    [ 26. 99. 0.19047 2. ]

    [ 39. 64. 0.19385 2. ]

    [ 117. 148. 0.20185 2. ]

    [ 50. 84. 0.20299 2. ]

    [ 55. 89. 0.2113 2. ]

    [ 3. 98. 0.2115 2. ]

    [ 134. 144. 0.21395 2. ]

    [ 120. 123. 0.21464 2. ]

    [ 23. 156. 0.21636 3. ]]

    直到前7步,此算法都在直接合并原有实验样本数据,也不难看出每一步的最短距离都在单调递增。在第8步中,此算法决定合并集群56和集群153。是不是很奇怪,我们只有150个数据点,何来的下标153?此算法中,任何 idx >= len(X) 的下标都指向在 Z[idx - len(X)] 中建立的集群。所以,第8步中,样本62与在第四步 Z[153 - 150] 中合并的集群(样本10和样本18)进行了合并。

    让我们来看看这些数据点的坐标是不是反应了这一情况:

    print X[[10, 18, 56]]

    [[ 8.91446 -1.95095]

    [ 8.95663 -2.02432]

    [ 8.96876 -1.86035]]

    看上去很接近,但是让我们再画图看看是不是这样:

    idxs = [10, 18, 56]

    plt.figure(figsize=(10, 8))

    plt.scatter(X[:, 0], X[:, 1])

    plt.scatter(X[idxs, 0], X[idxs, 1], c='r')

    plt.show()

    不难看出,这三个红点非常的接近,很好。

    接下来我们先来看看这次层次聚类的树状图结果。

    建立树状图

    树状图展现了层次聚类中集群合并的顺序以及合并时集群间的距离。

    plt.figure(figsize=(50, 10))

    plt.title('Hierarchical Clustering Dendrogram')

    plt.xlabel('sample index')

    plt.ylabel('distance')

    dendrogram(Z, leaf_rotation=90., leaf_font_size=8.

    )

    plt.show()

    在树状图中,x 轴上的标记代表数据点在原有实验样本 X 中的下标,y 轴上表明集群间的距离。图像中,横线所在高度表明集群合并时的距离。

    我们可以看到在 y 轴20处我们只有两个集群,但在最后的合并后,集群间的距离直线上升至180左右。让我们看看最后4步的集群间距离:

    print Z[-4:, 2]

    [ 15.2525 16.79548 21.75623 185.07009]

    这样的大距离跨度表明了在这一步中虽然有两个集群被合并了,但是它们可能不应该被合并。换句话说,它们可能本来就不属于同一个集群,它们就应该属于两个不同的集群。

    在树状图中,我们可以看到绿色集群只包含了大于等于100的下标,而红色集群只包含了小于100的下标。看来我们的算法成功找出了实验样本中的两个集群。

    缩减树状图

    上一步得到的树状图非常大,然而它却仅仅包含了150个数据点。现实情况中,数据点可能更多。让我们来看看 dendrogram() 方程的其他参数:

    plt.title('Hierarchical Clustering Dendrogram (truncated)')

    plt.xlabel('sample index')

    plt.ylabel('distance')

    dendrogram(Z, truncate_mode='lastp', p=12, show_leaf_counts=False, leaf_rotation=90., leaf_font_size=12., show_contracted=True)

    plt.show()

    这幅树状图只包含了一共149次中的最后 p=12 次合并。你可能会发现 x 轴上的标签消失了,这是因为这些数据点已经被合并了。如果我们想更加直观的获得集群信息,我们可以通过以下代码:

    plt.title('Hierarchical Clustering Dendrogram (truncated)')

    plt.xlabel('sample index or (cluster size)')

    plt.ylabel('distance')

    dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12., show_contracted=True)

    plt.show()

    我们现在可以看到集群在最后12次合并中所包含的数据点数量。

    更加好看的树状图

    我们可以在树状图中显示集群间距离让树状图变得更加直观:

    def fancy_dendrogram(*args, **kwargs):

    max_d = kwargs.pop('max_d', None)

    if max_d and 'color_threshold' not in kwargs:

    kwargs['color_threshold'] = max_d

    annotate_above = kwargs.pop('annotate_above', 0)

    ddata = dendrogram(*args, **kwargs)

    if not kwargs.get('no_plot', False):

    plt.title('Hierarchical Clustering Dendrogram (truncated)')

    plt.xlabel('sample index or (cluster size)')

    plt.ylabel('distance')

    for i, d, c in zip(ddata['icoord'], ddata['dcoord'], ddata['color_list']):

    x = 0.5 * sum(i[1:3])

    y = d[1]

    if y > annotate_above:

    plt.plot(x, y, 'o', c=c)

    plt.annotate("%.3g" % y, (x, y), xytext=(0, -5), textcoords='offset points', va='top', ha='center')

    if max_d:

    plt.axhline(y=max_d, c='k')

    return ddata

    fancy_dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12., show_contracted=True, annotate_above=10)

    plt.show()

    选择临界距离决定集群数量

    就像我们在之前解释的那样,大距离跨度通常是我们所感兴趣的地方。在我们的例子中,我们把距离临界值设为50,因为在这里距离跨度非常明显:

    max_d = 50

    fancy_dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12., show_contracted=True, annotate_above=10, max_d=max_d)

    plt.show()

    不难看出,在这一临界值内,我们有2个集群。

    max_d = 16

    fancy_dendrogram(Z, truncate_mode='lastp', p=12, leaf_rotation=90., leaf_font_size=12., show_contracted=True, annotate_above=10, max_d=max_d)

    plt.show()

    当临界值为16的时候,我们有4个集群。

    获取集群信息

    我们可以使用 fcluster 方程获取集群信息。

    已知距离临界值

    如果我们已经通过树状图知道了最大临界值,我们可以通过以下代码获得每个实验样本所对应的集群下标:

    from scipy.cluster.hierarchy import fcluster

    max_d = 50

    clusters = fcluster(Z, max_d, criterion='distance')

    print clusters

    [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

    1 1]

    已知集群数量

    如果我们已经知道最终会有2个集群,我们可以这样获取集群下标:

    k = 2

    fcluster(Z, k, criterion='maxclust')

    [2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

    1 1]

    可视化集群

    如果你的实验样本特征数量很少,你可以可视化你的集群结果:

    plt.figure(figsize=(10, 8))

    plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='prism')

    plt.show()

    希望本教程对你有所帮助 :smile:

    参考资料

    展开全文
  • 在监督学习里,某特定数据集类(class)的数量,在一开始就是知道——每个数据实例,都被标记归属于某个类。最坏情况下,我们还可以盘查类属性( class attribute),计算其中包含的独特元素。 但在无监督...
  • kmeans聚类算法是一种简单实用的聚类算法,matlab自带函数kmeans可直接对数据进行kmeans聚类。为了方便更好地掌握kmeans聚类算法,今天我们自己来实现一个弱化的版本mykmeans。mykmeans输入包含三项,分别为聚类所...
  • 一些聚类问题

    2020-03-21 00:34:13
    假设我们是一家大型零售公司, 客户分布在全国各地. 为了方便管理和提供更好的服务, 我们需要把客户按照地理位置进行分类, 例如按城市或街道的维度把客户划分成 区块, 每个区块是客户的集合....1. 等量的聚类问题(E...
  • 由于具有出色的速度和良好的可扩展性,K-Means聚类算法算得上是最著名的聚类方法。K-Means算 法是一个重复移动类中心点的过程,把类的中心点,也称重心(centroids),移动到其包含成员的平 均位置,然后重新划分...
  • 作者:钱烽摘要:提出最小...而后者虽然能够聚类任意形状和尺寸的类簇,但却涉及复杂的概念和技术,包含较多数量的算法参数,也无法产生完整的系统树图结构.本文定义出一种满足弱单调递减特性的相似性度量,在保留上述两...
  • K-means是最常用的聚类算法之一,它将数据点聚类为预定义数量的聚类。该spark.mllib实现包括一个名为kmeans ||的k-means ++方法的并行变体 。实现中包含以下参数:spark.mllib k是所需簇的数量。 maxIterations是...
  • 文献聚类结果可视分析方法研究1 论文概述1.1 摘要1.2 引言1.3 脉络2 可视分析框架2.1 框架概述2.2 框架组成3 可视化设计3.1 语料结构可视化3.2 ...方法4.2 调整聚类数量4.3 优化和诊断聚类结果4.4 用户反馈5 结论6 收获...
  • Arcgis for JS之Cluster聚类分析实现在做项目时候,碰见了这样一个问题:给地图上标注点对象,数据是从数据库来 包含XY坐标信息,通过graphic和graphiclayer 方式添加到地图上,其中有一个对象的数量很...
  • matlab实现kmeans聚类算法

    千次阅读 2019-09-06 13:26:27
    kmeans聚类算法是一种简单实用的聚类算法,matlab自带函数kmeans可直接对数据进行kmeans聚类。为了方便更好地掌握kmeans聚类算法,今天我们自己来实现一个弱化的版本mykmeans。 mykmeans输入包含三项,分别为聚类所...
  • 在本研究中,需要使用多元技术来减少尼罗河上游开罗饮用水厂(CDWPs)尼罗河水质大变量数量,并确定它们之间关系,以便进行简单而可靠评估。 通过主成分分析(PCA),模糊C均值(FCM)和K均值算法多元统计...
  • kmeans聚类算法是一种简单实用的聚类算法,matlab自带函数kmeans可直接对数据进行kmeans聚类。为了方便更好地掌握kmeans聚类算法,今天我们自己来实现一个弱化的版本mykmeans。mykmeans输入包含三项,分别为聚类所...
  • 前面提到kmeans 算法需要提前设定簇个数,我们也可以根据数据进行简单簇数目估计,但是有一类称为近似聚类算法技术可以根据给定数据集估计簇的数量以及近似中心位置,其中有一个典型算法就是canopy生成算法。...
  • 同样,此步骤将使我们减少在分析中要考虑参数数量。 特征 id :车辆标识符。 odo :车辆里程表读数,以km为单位。 dist :时间段内行驶距离。 fuelc :报告期内行驶,空转和使用取力器时总油耗(升)。 ...

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

包含数量的聚类