精华内容
下载资源
问答
  • 聚类算法之层次聚类算法和应用举例 1.假设有N个待聚类的样本,对于层次聚类来说,步骤: 1、(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度; 2、寻找各个类之间最近的两...
    聚类算法之层次聚类算法和应用举例
    1.假设有N个待聚类的样本,对于层次聚类来说,步骤:
    1、(初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度;
    2、寻找各个类之间最近的两个类,把他们归为一类(这样类的总数就少了一个);
    3、重新计算新生成的这个类与各个旧类之间的相似度;
    4、重复2和3直到所有样本点都归为一类,结束

    2.描述:
    整个聚类过程其实是建立了一棵树,在建立的过程中,可以通过在第二步上设置一个阈值,当最近的两个类的距离大于这个阈值,则认为迭代可以终止。另外关键的一步就是第三步,如何判断两个类之间的相似度有不少种方法。这里介绍一下三种:
    SingleLinkage:又叫做 nearest-neighbor ,就是取两个类中距离最近的两个样本的距离作为这两个集合的距离,也就是说,最近两个样本之间的距离越小,这两个类之间的相似度就越大。容易造成一种叫做 Chaining 的效果,两个 cluster 明明从“大局”上离得比较远,但是由于其中个别的点距离比较近就被合并了,并且这样合并之后 Chaining 效应会进一步扩大,最后会得到比较松散的 cluster 。
    CompleteLinkage:这个则完全是 Single Linkage 的反面极端,取两个集合中距离最远的两个点的距离作为两个集合的距离。其效果也是刚好相反的,限制非常大,两个 cluster 即使已经很接近了,但是只要有不配合的点存在,就顽固到底,老死不相合并,也是不太好的办法。这两种相似度的定义方法的共同问题就是指考虑了某个有特点的数据,而没有考虑类内数据的整体特点。
    Average-linkage:这种方法就是把两个集合中的点两两的距离全部放在一起求一个平均值,相对也能得到合适一点的结果。
    average-linkage的一个变种就是取两两距离的中值,与取均值相比更加能够解除个别偏离样本对结果的干扰。
    3.Python例子代码:
    未完待续。。。。。。



    展开全文
  • 上篇博客介绍的层次聚类,尤其是AGNES这一传统的层次聚类算法。这篇博客介绍层次聚类的优化算法:BIRCH算法(平衡迭代削减聚类法),以及对BIRCH优化的CURE算法(使用代表点的聚类法)。

    上篇博客介绍的层次聚类,尤其是AGNES这一传统的层次聚类算法。这篇博客介绍层次聚类的优化算法。

    优化算法

    BIRCH算法
    BIRCH算法(平衡迭代削减聚类法):聚类特征使用3元组进行一个簇的相关信息,通过构建满足分枝因子和簇直径限制的聚类特征树来求聚类,聚类特征树其实是一个具有两个参数分枝因子和类直径的高度平衡树;分枝因子规定了树的每个节点的子女的最多个数,而类直径体现了对这一类点的距离范围;非叶子节点为它子女的最大特征值;聚类特征树的构建可以是动态过程的,可以随时根据数据对模型进行更新操作。

    优缺点:

    • 适合大规模数据集,线性效率;
    • 只适合分布呈凸形或者球形的数据集、需要给定聚类个数和簇之间的相关参数;

    CURE算法
    CURE(对BIRCH的优化,但很少有人用。因为不如后面讲的密度聚类方法)
    CURE算法(使用代表点的聚类法):该算法先把每个数据点看成一类,然后合并距离最近的类直至类个数为所要求的个数为止。但是和AGNES算法的区别是:取消了使用所有点或用中心点+距离来表示一个类,而是从每个类中抽取固定数量、分布较好的点作为此类的代表点,并将这些代表点乘以一个适当的收缩因子,使它们更加靠近类中心点。代表点的收缩特性可以调整模型可以匹配那些非球形的场景,而且收缩因子的使用可以减少噪音对聚类的影响。

    优缺点:

    • 能够处理非球形分布的应用场景
    • 采用随机抽样和分区的方式可以提高算法的执行效率

    代码实现

    基于scikit的API创建模拟数据,使用BRICH算法对数据进行聚类操作,并比较n_clusters参数的作用。
    API

    class sklearn.cluster.Birch(threshold=0.5, branching_factor=50, n_clusters=3, compute_labels=True, copy=True)

    代码

    from itertools import cycle
    from time import time
    import numpy as np
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import matplotlib.colors as colors
    
    from sklearn.preprocessing import StandardScaler
    from sklearn.cluster import Birch
    from sklearn.datasets.samples_generator import make_blobs
    
    ## 设置属性防止中文乱码
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    
    ## 产生模拟数据
    xx = np.linspace(-22, 22, 10)
    yy = np.linspace(-22, 22, 10)
    xx, yy = np.meshgrid(xx, yy)
    n_centres = np.hstack((np.ravel(xx)[:, np.newaxis],
                           np.ravel(yy)[:, np.newaxis]))
    #产生10万条特征属性是2,类别是100,符合高斯分布的数据集
    X, y = make_blobs(n_samples=100000,n_features=2, centers=n_centres, random_state=28)
    
    #创建不同的参数(簇直径)Birch层次聚类
    birch_models = [
        Birch(threshold=1.7, n_clusters=None),
        Birch(threshold=0.5, n_clusters=None),
        Birch(threshold=1.7, n_clusters=100)
    ]
    #threshold:簇直径的阈值,    branching_factor:大叶子个数
    #我们也可以加参数来试一下效果,比如加入分支因子branching_factor,给定不同的参数值,看聚类的结果 
    
    ## 画图
    final_step = [u'直径=1.7;n_lusters=None',u'直径=0.5;n_clusters=None',u'直径=1.7;n_lusters=100']
    
    plt.figure(figsize=(12,8),facecolor='w')
    plt.subplots_adjust(left = 0.02, right = 0.98, bottom = 0.1,top = 0.9)
    colors_ = cycle(colors.cnames.keys())
    cm = mpl.colors.ListedColormap(colors.cnames.keys())
    
    for ind, (birch_model, info) in enumerate(zip(birch_models, final_step)):
        t = time()
        birch_model.fit(X)
        time_ = time() - t
    #获取模型结果(label和中心点)    
        labels = birch_model.labels_
        centroids = birch_model.subcluster_centers_
        n_clusters = len(np.unique(centroids))
        print ("Birch算法,参数信息为:%s;模型构建消耗时间为:%.3f秒;聚类中心数目:%d" % (info, time_, len(np.unique(labels))))
        
        ## 画图
        subinx = 221 + ind
        plt.subplot(subinx)
        for this_centroid, k, col in zip(centroids, range(n_clusters), colors_):
            mask = labels == k
            plt.plot(X[mask, 0], X[mask, 1], 'w', markerfacecolor=col, marker='.')
            if birch_model.n_clusters is None:
                plt.plot(this_centroid[0], this_centroid[1], '*', markerfacecolor=col, markeredgecolor='k', markersize=2)
        plt.ylim([-25, 25])
        plt.xlim([-25, 25])
        plt.title(u'Birch算法%s,耗时%.3fs' % (info, time_))
        plt.grid(False)
    
    ## 原始数据集显示
    plt.subplot(224)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=1, cmap=cm, edgecolors='none')
    plt.ylim([-25, 25])
    plt.xlim([-25, 25])
    plt.title(u'原始数据')
    plt.grid(False)
        
    plt.show()
    

    Birch算法,参数信息为:直径=1.7;n_lusters=None;模型构建消耗时间为:12.264秒;聚类中心数目:158
    Birch算法,参数信息为:直径=0.5;n_clusters=None;模型构建消耗时间为:21.004秒;聚类中心数目:3205
    Birch算法,参数信息为:直径=1.7;n_lusters=100;模型构建消耗时间为:10.647秒;聚类中心数目:100

    看一下最后的效果:
    在这里插入图片描述

    展开全文
  • 聚类分析 | MATLAB实现HC(层次聚类)分析 ...使用这种方法,您可以选择最适合您的应用场景的聚类尺度或级别。 K 均值聚类是一种分区方法,它将数据中的观测值视为具有位置和相互间距离的对象。它将对象划分为 K

    聚类分析 | MATLAB实现HC(层次聚类)分析

    层次聚类简介

    层次聚类是通过创建聚类树,同时在多个距离尺度内调查数据分组的一种方法。与 K-均值法不同,树并不是一组簇的简单组合,而是一个多级层次结构,较低级别的簇在相邻的更高级别合并成新的簇。使用这种方法,您可以选择最适合您的应用场景的聚类尺度或级别。
    K 均值聚类是一种分区方法,它将数据中的观测值视为具有位置和相互间距离的对象。它将对象划分为 K 个互斥簇,使每个簇中的对象尽可能彼此靠近,并尽可能远离其他簇中的对象。每个簇的特性由其质心或中心点决定。当然,聚类中使用的距离通常不代表空间距离。

    数据下载

    • 20 世纪 20 年代,植物学家收集了 150 个鸢尾花标本(三个品种各取 50 个标本)的萼片长度、萼片宽度、花瓣长度和花瓣宽度的测量值。这些测量值被称为 Fisher 鸢尾花数据集。
    • 在此数据集中,每个观测值都来自一个已知的品种
    展开全文
  • 前言 K-means 聚类,介绍了 K-means 算法以及...层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止,传统的层次聚类算法主要分为两大类算法: 凝聚的层次聚类:AGNES算法(AGglomerative NESting) →...

    前言

    K-means 聚类,介绍了 K-means 算法以及一些优化改进的算法,通过此了解聚类分析,接下来我们进一步的介绍聚类分析的其他方法。

    本篇代码可见:Github

    一、层次聚类

    \quad\quad 层次聚类技术是第二类重要的聚类方法。层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止,传统的层次聚类算法主要分为两大类算法:

    • 凝聚的层次聚类AGNES算法(AGglomerative NESting) → \rightarrow 采用 自底向上 的策略。

    最初将每个对象作为一个簇,然后这些簇根据某些准则被一步一步合并,两个簇间的距离可以由这两个不同簇中距离最近的数据点的相似度来确定;聚类的合并过程反复进行直到所有的对象满足簇数目。

    • 分裂的层次聚类DIANA算法(DIvisive ANALysis) → \rightarrow 采用 自顶向下 的策略。

    首先将所有对象置于一个簇中,然后按照某种既定的规则逐渐细分为越来越小的簇(比如最大的欧式距离),直到达到某个终结条件(簇数目或者簇距离达到阈值)。

    到目前为止,凝聚层次聚类技术最常见,本篇主要介绍这类聚类方法

    层次聚类常常使用称作 树状图 的类似于树的图显示,该图显示簇-子簇联系和簇合并(凝聚)或分类的次序。对于二维点的集合,层次聚类也可以使用嵌套簇图表示。如下图:

    在这里插入图片描述

    1、基本凝聚层次聚类算法

    • 如果需要,计算邻近性矩阵
    • 合并最接近的两个簇
    • 更新邻近性矩阵,以反映新的簇与原来的簇之间的邻近性
    • 直到仅剩下一个簇

    2、定义簇之间的邻近性

    上面算法的关键操作是计算两个簇之间的邻近性,主要有以下几种:

    • 最小距离(MIN):两个聚簇中最近的两个样本之间的距离(single/word-linkage聚类法),最终得到模型容易形成链式结构

    • 最大距离(MAX):两个聚簇中最远的两个样本的距离(complete-linkage聚类法),如果存在异常值,那么构建可能不太稳定

    • 组平均:两个聚簇中样本间两两距离的平均值(average-linkage聚类法),两个聚簇中样本间两两距离的中值(median-linkage聚类法)

    在这里插入图片描述

    上图是基于图的定义,什么是基于图,可参考前篇;

    • 如果取基于原型的观点,簇用质心代表,则不同的簇邻近度定义就更容易,使用质心时,簇的邻近度一般定义为簇质心之间的邻近度。
    • 另一种技术,Ward 方法,也假定簇用其质心代表,但它使用两个簇导致的SSE增加来度量两个簇之间的邻近性,类似于 K均值Ward 方法也试图最小化点到其簇质心的距离的平方和。

    3.举例说明

    样本数据如下:

    在这里插入图片描述

    (1)MIN

    d i s t ( { 3 , 6 } , { 2 , 5 } ) = m i n ( d i s t ( 3 , 2 ) , d i s t ( 6 , 2 ) , d i s t ( 3 , 5 ) , d i s t ( 6 , 5 ) ) dist(\{3,6\},\{2,5\}) = min(dist(3,2),dist(6,2),dist(3,5),dist(6,5)) dist({3,6},{2,5})=min(dist(3,2),dist(6,2),dist(3,5),dist(6,5))
    = m i n ( 0.15 , 0.25 , 0.28 , 0.39 ) = min(0.15,0.25,0.28,0.39) =min(0.15,0.25,0.28,0.39)
    = 0.15 =0.15 =0.15

    在这里插入图片描述

    • 左图中圆圈数字代表聚类的次;
    • 右图中纵轴代表两个簇的距离;

    (2)MAX

    d i s t ( { 3 , 6 } , { 4 } ) = m a x ( d i s t ( 3 , 4 ) , d i s t ( 6 , 4 ) ) = m a x ( 0.15 , 0.22 ) = 0.22 dist(\{3,6\},\{4\}) = max(dist(3,4),dist(6,4))= max(0.15,0.22) = 0.22 dist({3,6},{4})=max(dist(3,4),dist(6,4))=max(0.15,0.22)=0.22
    d i s t ( { 3 , 6 } , { 2 , 5 } ) = m a x ( d i s t ( 3 , 2 ) , d i s t ( 6 , 2 ) , d i s t ( 3 , 5 ) , d i s t ( 6 , 5 ) ) = m a x ( 0.15 , 0.25 , 0.28 , 0.39 ) = 0.39 dist(\{3,6\},\{2,5\}) = max(dist(3,2),dist(6,2),dist(3,5),dist(6,5))\\ = max(0.15,0.25,0.28,0.39) = 0.39 dist({3,6},{2,5})=max(dist(3,2),dist(6,2),dist(3,5),dist(6,5))=max(0.15,0.25,0.28,0.39)=0.39
    d i s t ( { 3 , 6 } , { 1 } ) = m a x ( d i s t ( 3 , 1 ) , d i s t ( 6 , 1 ) ) = m a x ( 0.22 , 0.23 ) = 0.23 dist(\{3,6\},\{1\}) = max(dist(3,1),dist(6,1))= max(0.22,0.23) = 0.23 dist({3,6},{1})=max(dist(3,1),dist(6,1))=max(0.22,0.23)=0.23

    在这里插入图片描述

    (3)组平均

    对于组平均,簇 C I C_I CI C j C_j Cj 的邻近度 p r o x i m i t y ( C i , C j ) proximity(C_i, C_j) proximity(Ci,Cj) 由下式定义:
    p r o x i m i t y ( C i , C j ) = ∑ x ∈ C i , y ∈ C j p r o x i m i t y ( x , y ) m i ∗ m j proximity(C_i, C_j) = \frac{\sum_{x \in C_i,y \in C_j}proximity(x,y)}{m_i * m_j} proximity(Ci,Cj)=mimjxCiyCjproximity(x,y)

    其中, m i , m j m_i,m_j mi,mj 分别表示簇 C i , C j C_i,C_j Ci,Cj的大小

    d i s t ( { 3 , 6 , 4 } , { 1 } ) = ( 0.22 + 0.37 + 0.23 ) / ( 3 ∗ 1 ) = 0.28 dist(\{3,6,4\},\{1\}) = (0.22+0.37+0.23)/(3*1)=0.28 dist({3,6,4},{1})=(0.22+0.37+0.23)/(31)=0.28

    d i s t ( { 2 , 5 } , { 1 } ) = ( 0.2357 + 3421 ) / ( 2 ∗ 1 ) = 0.2889 dist(\{2,5\},\{1\}) = (0.2357+3421)/(2*1)=0.2889 dist({2,5},{1})=(0.2357+3421)/(21)=0.2889

    d i s t ( { 3 , 6 , 4 } , { 2 , 5 } ) = ( 0.15 + 0.28 + 0.25 + 0.39 + 0.20 + 0.29 ) / ( 3 ∗ 2 ) = 0.26 dist(\{3,6,4\},\{2,5\}) = (0.15+0.28+0.25+0.39+0.20+0.29)/(3*2)=0.26 dist({3,6,4},{2,5})=(0.15+0.28+0.25+0.39+0.20+0.29)/(32)=0.26

    因为 d i s t ( { 3 , 6 , 4 } , { 1 } ) dist(\{3,6,4\},\{1\}) dist({3,6,4},{1}) d i s t ( { 3 , 6 , 4 } , { 2 , 5 } ) dist(\{3,6,4\},\{2,5\}) dist({3,6,4},{2,5}) d i s t ( { 2 , 5 } , { 1 } ) dist(\{2,5\},\{1\}) dist({2,5},{1}) 小,簇 { 3 , 6 , 4 } \{3,6,4\} {3,6,4} { 2 , 5 } \{2,5\} {2,5}在第4阶段合并。

    在这里插入图片描述

    (4)Ward

    对于 Ward 方法,两个簇的邻近度定义为两个簇合并时导致的平方误差的增量。该方法使用的目标函数与K均值 相同。当两个点之间的邻近度取它们之间距离的平方时,Ward 方法与 组平均 非常相似

    在这里插入图片描述

    4、案例:

    使用 sklearn 库中AgglomerativeClustering类,API如下:

    sklearn.cluster.AgglomerativeClustering(n_clusters = 2, affinity ='euclidean', 
    	memory = None, connectivity = None, compute_full_tree ='auto', 
    	linkage ='ward', pooling_func ='deprecated')
    

    常用参数说明:

    参数描述
    n_clusters : int, default=2要查找的簇数
    affinity : string or callable, default: “euclidean”用于计算链接的度量标准。可以是“euclidean”,“l1”,“l2”,“manhattan”,“cosine”或“precomputed”
    linkage : {“ward”, “complete”, “average”, “single”}, optional (default=”ward”)使用哪种链接标准。连接标准确定观察组之间使用的距离。该算法将合并最小化该标准的簇对。“ward”最小化被合并的集群的方差;“average”使用两组中每次观察的距离的平均值;“complete”完整或最大连接使用两组的所有观察之间的最大距离;“single”使用两组所有观测值之间的最小距离。
    connectivity : array-like or callable, optional连通矩阵。为每个样本定义遵循给定数据结构的相邻样本。这可以是连接矩阵本身,也可以是将数据转换为连接矩阵的可调用,例如从kneighbors_graph派生的。默认值为None,即层次聚类算法是非结构化的。

    本案例使用球形数据和月牙形数据以及加入噪声点的数据,使用不同的邻近性方法构建凝聚层次聚类带来的效果:

    在这里插入图片描述

    由上图可知

    • 对于 Ward 方法,使用的是方差,对球形数据的效果不错,但是对月牙形数据就不好了;
    • 对于complete方法,使用的是最大值,对于球形数据基本不行,对于月牙形效果很好,但是假如噪声后,效果就不行,可见此方法受噪声的影响;
    • 对于 average 方法,使用的是平均值,效果和最大值方法一样。

    代码可见:07_层次聚类(AGNES)算法采用不同距离计算策略.py

    5、层次聚类优化算法

    1. BIRCH 算法(平衡迭代削减聚类法):是一种非常有效的聚类技术,用于欧几里得向量空间数据,即平均值有意义的数据。BIRCH 能够用一遍扫描有效地对这种数据进行聚类,并可以使用附加的扫描改进聚类。BIRCH 还能有效地处理离群点。

    BIRCH 基于聚类特征和聚类特征树的概念。基本思想是:数据点的簇可以用三元组 ( N , L S , S S ) (N,LS,SS) (N,LS,SS)表示:

    • N N N 是簇中点的个数
    • L S LS LS 是点的线性和
    • S S SS SS 是点的平方和

    BIRCH 算法通过构建满足 分枝因子和簇直径限制 的聚类特征树来求聚类,聚类特征树其实是一个具有两个参数分枝因子和类直径的高度平衡树;分枝因子规定了树的每个节点的子女的最多个数,而类直径体现了对这一类点的距离范围;非叶子节点为它子女的最大特征值;聚类特征树的构建可以是动态过程的,可以随时根据数据对模型进行更新操作。

    优缺点:

    • 适合大规模数据集,线性效率;
    • 只适合分布呈凸形或者球形的数据集、需要给定聚类个数和簇之间的相关参数;

    案例:

    本案例使用BIRCH 中不同的参数,比较模型效果以及消耗时间

    运行结果:
    Birch算法,参数信息为:直径=1.7;n_lusters=None;模型构建消耗时间为:2.432秒;聚类中心数目:171
    Birch算法,参数信息为:直径=0.5;n_clusters=None;模型构建消耗时间为:6.250秒;聚类中心数目:3205
    Birch算法,参数信息为:直径=1.7;n_lusters=100;模型构建消耗时间为:2.529秒;聚类中心数目:100
    

    在这里插入图片描述

    结果表示,设置合理的参数,可以很好的聚类数据

    代码可见:08_层次聚类(BIRCH)算法参数比较.py

    1. CURE 算法(使用代表点的聚类法):该算法先把每个数据点看成一类,然后合并距离最近的类直至类个数为所要求的个数为止,但是和 AGNES 算法的区别是:取消了使用所有点或用中心点+距离来表示一个类,而是从每个类中抽取固定数量、分布较好的点作为此类的代表点,并将这些代表点乘以一个适当的收缩因子,使它们更加靠近类中心点。

    CURE 使用簇中的多个代表点来表示一个簇:

    • 第一个代表点选择离簇中心点最远的点
    • 其余的点选择离所有已经选取的点最远的点
    • 理论上,这些点捕获了簇的几何形状

    代表点的收缩特性可以调整模型可以匹配那些非球形的场景,而且收缩因子的使用可以减少噪音对聚类的影响。

    优缺点:

    • 能够处理非球形分布的应用场景
    • 采用随机抽样和分区的方式可以提高算法的执行效率

    二、密度聚类

    \quad\quad 基于密度的聚类寻找被低密度区域分离的高密度区域。这里我们只介绍 DBSCAN 算法,它是一种简单、有效的基于密度的聚类算法。

    • DBSCAN 相比于基于划分的聚类方法和层次聚类方法,DBSCAN 算法将簇定义为密度相连的点的最大集合,能够将足够高密度的区域划分为簇,并且在具有噪声的空间数据商能够发现任意形状的簇。

    • DBSCAN 算法的核心思想是:用一个点的 ε ε ε 邻域内的邻居点数衡量该点所在空间的密度,该算法可以找出形状不规则的 c l u s t e r cluster cluster,而且聚类的时候事先不需要给定 c l u s t e r cluster cluster 的数量。

    1. 基本概念:

    • ε ε ε 邻域(也称 E p s Eps Eps):给定对象在半径 ε ε ε 内的区域;
    • 密度: ε ε ε 邻域中 x x x 的密度,是一个整数值,依赖于半径 ε ε ε
    • 核心点:这些点在基于密度的簇内部,点的领域由距离函数和用户指定的距离参数 E p s Eps Eps 决定。核心点的定义是:如果该点的给定领域内的点的个数超过给定的阀值 M i n P t s MinPts MinPts M i n P t s MinPts MinPts 定义核心点时的阈值,也简记为 M M M,也是用户指定的参数),如下图 M i n P t s ⩽ 7 MinPts \leqslant 7 MinPts7,以及给定 E p s Eps Eps下,点A就是核心点;
    • 边界点:边界点不是核心点,当它落在某个核心点的领域内,如下图点B;
    • 噪声点:噪声点是既非核心点也非边界点的任何点,如下图点C。

    在这里插入图片描述

    • 直接密度可达:该点在核心点的领域类,那么就说该点从核心点出发直接密度可达,如下图, x 2 x_2 x2 x 1 x_1 x1直接密度可达;

    • 密度可达:如果存在一个对象链 p 1 , p 2 , . . . , p m p_1,p_2,...,p_m p1,p2,...,pm 如果满足 p i + 1 p_{i+1} pi+1是从 p i p_i pi 直接密度可达的,那么称 p m p_m pm 是从 p 1 p_1 p1 密度可达的,如下图, x 3 x_3 x3 x 1 x_1 x1密度可达;

    • 密度相连:在集合 X X X中,如果存在一个对象 o o o,使得对象 x x x y y y 是从 o o o 关于 ε ε ε m m m 密度可达的,那么对象 x x x y y y 是关于 ε ε ε m m m 密度相连的,如下图, x 3 x_3 x3 x 4 x_4 x4密度相连。

    在这里插入图片描述

    簇(cluster):一个基于密度的簇是最大的密度相连对象的集合C;满足以下两个条件:

    • Maximality:若x属于C,而且y是从x密度可达的,那么y也属于C
    • Connectivity:若x属于C,y也属于C,则x和y是密度相连的

    2. DBSCAN 算法

    DBSCAN 算法可以描述如下:任意两个足够靠近的点(相互之间的距离在 E p s Eps Eps之内)的核心点将放在同一个簇中;同样,任何与核心点足够靠近的边界点也放到与核心点相同的簇中,噪声点被丢弃。(如果一个边界点靠近不同簇的核心,则可能需要解决平局问题)

    算法如下:

    • 将所有点标记为核心点、边界点或噪声点
    • 删除噪声点
    • 为距离在 E p s Eps Eps 之内的所有核心点之间赋予一条边
    • 每组连通的核心点形成一个簇
    • 将每个边界点指派到一个与之关联的核心点的簇中

    3. DBSCAN 算法优缺点

    优点:

    • 不需要事先给定cluster的数目
    • 可以发现任意形状的cluster
    • 能够找出数据中的噪音,且对噪音不敏感
    • 算法只需要两个输入参数
    • 聚类结果几乎不依赖节点的遍历顺序

    缺点:

    • DBSCAN 算法聚类效果依赖距离公式的选取,最常用的距离公式为欧几里得距离。但是对于高维数据,由于维数太多,距离的度量已变得不是那么重要,密度定义更加困难
    • DBSCAN 算法不适合数据集中密度差异很小的情况

    4. DBSCAN 算法案例

    使用 sklearn库中 DBSCAN 类,API如下:

    sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric=’euclidean’, 
    	metric_params=None, algorithm=’auto’, leaf_size=30, p=None, n_jobs=None)
    

    常用参数说明:

    参数描述
    eps : float, optional前面提到的 Eps
    min_samples : int, optional前面提到的 MinPts

    本案例使用球形数据和环形数据,通过设定不同的 ε 和 m 参数,比较效果

    在这里插入图片描述

    有图1可看出,密度聚类对于密度变化不大,且有重叠的数据的效果不好,两个簇有重叠很容易被聚类为同一个簇

    在这里插入图片描述

    由图2可看出,设置合适的参数,可以很好的聚类环形嵌套的数据

    代码可见:09_密度聚类(DBSCAN)算法案例.py

    三、谱聚类

    \quad\quad 谱聚类是基于谱图理论基础上的一种聚类方法,与传统的聚类方法相比:具有在任意形状的样本空间上聚类并且收敛于全局最优解的优点。

    • 通过对样本数据的 拉普拉斯矩阵的特征向量 进行聚类,从而达到对样本数据进行聚类的目的;其本质将聚类问题转换为图的最优划分问题 ,是一种点对聚类算法。

    • 谱聚类算法将数据集中的每个对象看做图的顶点V,将顶点间的相似度量化为相应顶点连接边E的权值w,这样就构成了一个基于相似度的无向加权图G(V,E),于是聚类问题就转换为图的划分问题。基于图的最优划分规则就是子图内的相似度最大,子图间的相似度最小。

    1、谱聚类的构建过程主要包含以下几个步骤

    • 构建表示对象相似度的矩阵W
    • 构建度矩阵D(对角矩阵)
    • 构建拉普拉斯矩阵L
    • 计算矩阵L的前k个特征值的特征向量(k个列向量)
    • 将k个列向量组成矩阵U
    • 对矩阵U中的n行数据利用K-means或其它经典聚类算法进行聚类得出最终结果

    2、应用场景

    • 图形聚类、计算机视觉、非凸球形数据聚类等

    3、面临的问题

    • 相似度矩阵的构建问题:业界一般使用高斯相似函数或者k近邻来作为相似度量,一般建议使用k近邻的方式来计算相似度权值
    • 聚类数目的给定
    • 如何选择特征向量
    • 如何提高谱聚类的执行效率

    4、案例

    使用 sklearn库中spectral_clustering类,API如下:

    spectral_clustering(affinity, n_clusters=8, n_components=None, eigen_solver=None, 
    	random_state=None, n_init=10, eigen_tol=0.0, assign_labels=’kmeans’)
    

    常用参数说明:

    参数描述
    affinity亲和度矩阵描述样本与嵌入的关系。必须是对称的。
    n_clusters簇的数目
    assign_labels : {‘kmeans’,‘discretize’},默认:‘kmeans’用于在嵌入空间中分配标签的策略

    本案例使用球形数据和环形数据,通过设定不同的 σ 参数,比较效果

    在这里插入图片描述

    图1可见,通过设定适当的参数,谱聚类可以将球形数据很好的聚类

    在这里插入图片描述

    图2可见,当σ为0.06,0.16和0.40时,效果很好,因此谱聚类也可以对环形数据很好地聚类

    代码可见:10_谱聚类(SC)算法案例.py

    四、综合案例

    1、案例1:不同聚类算法比较

    在这里插入图片描述

    由上图可以看出

    • 对于环形数据,密度聚类与谱聚类可以聚类成功,但是谱聚类的执行效率比较低;
    • 对于月牙形数据,除了K-MeansMini Batch K-MeansBrich效果不行,其他都可以,谱聚类执行效率最低,密度聚类最好;
    • 对于球形数据,AC-average和密度聚类不行,其他都可以,求Mini Batch K-Means执行效率最高,谱聚类执行效率低;
    • 对于随机数据,有些算法也会强行将其划分为两个簇。

    从上面我们可以看出,虽然谱聚类算法效果比较好,但是执行效率比较低,所以一般不使用。在实际工作中使用最多的还是 K-means ,对于有些数据我们可以先对数据进行一些预处理,使其满足 K-means对数据的要求,比如,可以将数据映射到高维空间使其成为明显分离的数据。

    代码可见:11_不同聚类算法比较.py

    2、案例2:图片压缩

    在这里插入图片描述

    代码可见:12_基于K-means算法进行图片压缩.py

    展开全文
  • 5、聚类之层次聚类、基于划分的聚类(k-means)、基于密度的聚类、基于模型的聚类 目录(?)[-] 1.  一层次聚类 1.  层次聚类的原理及分类 2.  层次聚类的流程 3.  层次聚类的优缺点 2.  二划分聚类...
  • 文章目录引言一、K-means聚类1.算法原理2.算法模型常用参数、属性、方法介绍3....下面我们分别介绍K-means聚类、DBSCAN算法(密度聚类)、AgglomerativeClustering算法(层次聚类),GMM算法(高斯混合模型)。 一、K
  • 聚类算法概述,K-Means算法,聚类算法的衡量指标,层次聚类方法,密度聚类方法及谱聚类方法详述。
  • R语言-层次聚类的初步了解

    万次阅读 2018-07-31 14:40:57
    层次聚类中,每个初始实例或观测值属于一类,聚类就是每一次把两类聚成一类,...层次聚类难以应用到数百甚至数千观测值的大样本中。 下面用R语言中的flexclust包中的内置数据集尝试做层次聚类分析: # 用flex...
  • 层次聚类 小样本数据 - 可以形成类相似度层次图谱,便于直观的确定类之间的划分。 该方法可以得到较理想的分类 难以处理大量样本 基于划分的聚类 大样本数据 K-means算法 ...
  • 层次聚类(划分聚类) 聚类就是对大量未知标注的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据比较相似,类别之间的数据相似度比较小;属于无监督学习。 算法步骤 1.初始化的...
  • 一、层次聚类 1、层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离。每次将距离最近的点合并到同一个类。然后,再计算类与类之间的距离,将距离最近的类合并为一个大类。不停的合并,...
  • 层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止,传统的层次聚类算法主要分为两大类算法: 1、凝聚的层次聚类:__AGNES算法__ (AGglomerative NESting)==>采用自底向上的策略。最初将每个对象...
  •  聚合层次聚类是一种自下而上的算法,首先将每个样本都视为一个簇,然后开始按一定规则,将相似度高的簇进行合并,最后所有样本都形成一个簇或达到某一个条件时,算法结束。  确定簇与簇之间相似度是该算法的要点...
  • means算法2.1 K-means算法的思考2.2 总结3 二分K-Means算法4 K-Means++算法4.1 K-Means||算法5 Canopy算法5.1 应用场景6 Mini Batch K-Means算法7 层次聚类方法7.1 AGNES算法中簇间距离7.2 层次聚类优化算法8 密度...
  • 机器学习之层次聚类算法

    千次阅读 2018-06-25 12:07:34
    层次聚类(Hierarchical Clustering)是对给定数据集在不同层次进行划分,形成树形的聚类结构,直到满足某种停止条件为止。数据集的划分可采用自底向上或自顶向下的划分策略。 1、凝聚的层次聚类算法AGNES AGNES...
  • 聚类算法包括:K均值聚类(K-Means)、层次聚类(Hierarchical Clustering)和混合高斯模型(Gaussian Mixture Model)。层次聚类(Hierarchical Clustering)是一种聚类算法,属于无监督学习。层次聚类通过计算不同类别数据...
  • 一、层次聚类 1、层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离。每次将距离最近的点合并到同一个类。然后,再计算类与类之间的距离,将距离最近的类合并为一个大类。不停的合并,...
  • 在之前的系列中,大部分都是关于监督学习(除了PCA那一节),接下来的几篇主要分享一下关于非监督学习中的聚类算法(clustering algorithms)。 一、先了解一下聚类分析(clustering analysis) Cluster analysis or...
  • R语言聚类分析:k-means和层次聚类

    千次阅读 2018-07-19 08:59:23
    前面所提到的机器学习算法主要都是分类和回归,这两类的应用场景都很清晰,就是对分类型变量或者数值型变量的预测。聚类分析是一种根据样本之间的距离或者说是相似性(亲疏性),把越相似、差异越小的...
  • 聚类算法综述 声明:本文章为博主(计算机本科生)选修课结课拓展小论文,仅供参考。 ...聚类算法常用于机器学习、数据分析等领域中,常用的聚类方法有层次聚类、k-means聚类、均值漂移聚类,它...
  • 非监督学习-聚类算法概述与代码实现(K-means, k-modes, k-prototypes, DMSCAN密度聚类, GMM, 层次聚类)聚类算法是什么监督学习、非监督学习、半监督学习与强化学习的概念距离计算方法(相似性)K-means算法逻辑...
  • K-means算法,也称为K-平均或者K-均值,是一种使用广泛的最基础的聚类算法 假设输入样本为T=X1,X2,…,Xm;则算法步骤为(使用欧几里得距离公式): Step1:随机选择初始化的k个类别中心a1,a2,…ak; Step2:对于...
  • 在许多机器人应用的领域,能够实时在三维点云中进行平面提取是非常困难的。...第二步:在构建好的图模型上利用层次聚类的方法进行点集的的融合,直到平面拟合的均方误差超过设定的阈值; 第三步:使用像素级别的
  • K-means算法 ... 聚类除了可以用于数据分割(data segmentation),也可以用于离群点检测(outlier detection),所谓的离群点指的是与“普通”点相对应的“异常”点,而这些“异常”点往往值的注意。
  • 目录条件概率的拓展极大似然估计EM(Expectation-Maximization)算法聚类算法K-means(约束簇)DSCAN(非约束簇)层次聚类(非约束簇)AP(非约束簇)总结矩阵降维稀疏自编码器PCA算法ICA算法字典学习线性判别分析...
  • 聚类 ( Cluster ) 应用场景 III . 聚类 ( Cluster ) 质量 IV . 聚类 ( Cluster ) 质量 测量 V . 聚类 ( Cluster ) 算法要求 VI . 聚类 ( Cluster ) 数据矩阵 VII . 聚类 ( Cluster ) 相似度矩阵 VIII . 聚类 ( ...
  • Spark 在反作弊聚类场景的实践 作者:周奥特 孙先 陈磊 链接:https://zhuanlan.zhihu.com/p/23385044 来源:知乎 目前知乎站内的 spammer 为了快速取得收效,往往倾向于大批量地产生相似的 spam 内容,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,831
精华内容 3,132
关键字:

层次聚类应用场景