K均值聚类和DBSCAN介绍

K均值(K-means)聚类

问题定义:给定数据$\vec{x}_1,\vec{x}_2,\cdots,\vec{x}_n$,将它们分到不同的$K$个簇(cluster)中。定义$\vec{c}=(c_1,c_2,\cdots,c_n),\text{ }c_i\in\{1,2,\cdots,K\}$,$c_i=k$表示$\vec{x}_i$被分到了第$k$个簇中。定义$\vec{\mu}_k$为第$k$个簇的中心(centroid),$k=1,2,\cdots,K$。K-means是一种基于距离的聚类算法,它的目标函数可以写为$$argmin_{\vec{c},\vec{\mu}_1,\cdots,\vec{\mu}_K}\sum\limits_{i=1}^n\sum\limits_{k=1}^KI(c_i=k)\lVert{\vec{x}_i-\vec{\mu}_k}\rVert_2^2$$

求解:使用坐标下降(Coordinate Descent)方法进行求解,将待求解的参数分为两个集合:$\vec{c}$以及$(\vec{\mu}_1,\cdots,\vec{\mu}_K)$。

  1. 随机初始化$K$个簇的中心$(\vec{\mu}_1,\cdots,\vec{\mu}_K)$
  2. 固定$(\vec{\mu}_1,\cdots,\vec{\mu}_K)$,找到最优的$c_i,i=1,2,\cdots,n$:$c_i=argmin_{k\in\{1,2,\cdots,K\}}\lVert{\vec{x}_i-\vec{\mu}_k}\rVert_2^2$
  3. 固定$\vec{c}$,找到最优的$(\vec{\mu}_1,\cdots,\vec{\mu}_K)$:$\vec{\mu}_k=\frac{1}{\sum\limits_{i=1}^nI(c_i=k)}\sum\limits_{i=1}^nI(c_i=k)\vec{x}_i$
  4. 不断迭代第2步和第3步,直到收敛为止

由于目标函数是非凸的,因此最后的结果可能是局部最优值,实际应用时一般会运行多次上述求解过程(即对$(\vec{\mu}_1,\cdots,\vec{\mu}_K)$进行多次随机初始化),并选择使最终目标函数最小的那个结果。

DBSCAN

DBSCAN是一种基于密度的聚类方法,它不需要预先指定簇的个数,但需要给定两个参数:MinPts以及eps,具体算法如下:

import numpy
def MyDBSCAN(D, eps, MinPts):
    """
    Cluster the dataset `D` using the DBSCAN algorithm.

    It will return a list of cluster labels. The label -1 means noise, and then
    the clusters are numbered starting from 1.
    """
    labels = [0]*len(D) #Initially all labels are 0,  0 means the point hasn‘t been considered yet
    C = 0 #C is the ID of the current cluster.
    ### This outer loop is just responsible for picking new seed points--a point
    ### from which to grow a new cluster.
    for P in range(0, len(D)):
        if not (labels[P] == 0): continue
        NeighborPts = regionQuery(D, P, eps) #Find all of P‘s neighboring points.
        if len(NeighborPts) < MinPts:
            labels[P] = -1
        else:
            C += 1
            labels[P] = C #the label to our seed point.
            growCluster(D, labels, P, C, eps, MinPts) #Grow the cluster from the seed point.
    return labels

def growCluster(D, labels, P, C, eps, MinPts):
    """
    Grow a new cluster with label `C` from the seed point `P`.

    This function searches through the dataset to find all points that belong
    to this new cluster. When this function returns, cluster `C` is complete.
    """
    ### SearchQueue is a FIFO queue of points to evaluate. It will only ever
    ### contain points which belong to cluster C
    SearchQueue = [P]
    i = 0
    while i < len(SearchQueue):
        P = SearchQueue[i]
        NeighborPts = regionQuery(D, P, eps) #Find all the neighbors of P
        ### If the number of neighbors is below the minimum, then
        ### move to the next point in the queue.
        if len(NeighborPts) < MinPts:
            i += 1
            continue
        ### Otherwise, For each of the neighbors...
        for Pn in NeighborPts:
            ### If Pn was labelled NOISE, claim it as part of cluster C
            if labels[Pn] == -1:
               labels[Pn] = C #Add Pn to cluster C
            ### Otherwise, if Pn hasn‘t been considered yet, claim it as part of
            ### C and add it to the search queue.
            elif labels[Pn] == 0:
                labels[Pn] = C #Add Pn to cluster C
                SearchQueue.append(Pn) #Add Pn to the SearchQueue
        i += 1  #Advance to the next point in the queue.
    return 

def regionQuery(D, P, eps):
    """
    Find all points in dataset `D` within distance `eps` of point `P`.

    This function calculates the distance between a point P and every other
    point in the dataset, and then returns only those points which are within a
    threshold distance `eps`.
    """
    neighbors = []
    for Pn in range(0, len(D)):
        if numpy.linalg.norm(D[P] - D[Pn]) < eps:
           neighbors.append(Pn)
    return neighbors

代码部分主要参考了文章DBSCAN Clustering Tutorial。若最终有数据点未被分到任何簇中(噪音点),则可将这些点视为异常点。下图分别是K均值算法以及DBSCAN算法对一个数据集的聚类结果,可以看出相比于K均值算法,DBSCAN算法可以有任意形状的簇,并且找到了数据中的异常点(右图中的空心点)。在实际应用中应对MinPts以及eps这两个参数仔细加以调试,特别是eps在不同的数据集中变化较大,具有较大的调试难度。

DBSCAN的一个改进算法为HDBSCAN,它也是一种基于密度的聚类方法,主要有两个参数$k$(也可记为$min\_samples$)以及$min\_cluster\_size$。DBSCAN通过一个数据点$\vec{x}$的半径为eps的邻域内是否有至少MinPts个点来判定该点是局地稠密还是稀疏的;而HDBSCAN通过一个数据点$\vec{x}$距它的第$k$个近邻点的距离$core_k(\vec{x})$来定量表征该点的局地密度,显然距离越大局地密度越小,在此基础上定义两个数据点之间的距离为:$$d(\vec{x}_1,\vec{x}_2)=\max{(core_k(\vec{x}_1),core_k(\vec{x}_2),\lVert{\vec{x}_1-\vec{x}_2}\rVert_2)}$$

  • 以该距离为基础,建立如下面左图所示的Dendrogram树状结构图。该图等价于层次聚类中的single-linkage,即两个簇$X$和$Y$之间的距离可以表示为$d(X,Y)=\min\limits_{\vec{x}\in{X},\text{ }\vec{y}\in{Y}}d(\vec{x},\vec{y})$。
  • 为了得到更稳健的聚类结果,HDBSCAN规定若每次分裂分出的两个新簇中有一个簇中的数据点个数小于$min\_cluster\_size$,则不进行这次分裂,只是将不满足要求的新簇中的点从之前的簇中移出,直到分裂出的两个新簇中的数据点个数均大于$min\_cluster\_size$再进行分裂,得到的结果如下图中的右图所示(簇的宽度表示簇中数据点的个数,簇的长度表征簇的存在周期。纵坐标$\lambda$定义为距离的倒数,即$\frac{1}{distance}$)。

  • 对任一个簇,将该簇的重要性定义为该簇在右图中所占面积。定义$\lambda_{birth}$为该簇生成时对应的$\lambda$,$\lambda_p$为该簇中的点$p$最后停留在该簇(即分裂到新簇之前或者被移出去之前)时对应的$\lambda$,则该簇的重要性用数学公式可表示为$\sum\limits_{p\in{cluster}}(\lambda_p-\lambda_{birth})$。
  • 接下来还剩最后一个要解决的问题,即如何从右图的树状结构中选择最终的簇(右图中圈出的簇为最终选择的簇)。选择最终的簇的过程类似于决策树中的剪枝过程,从最底端开始,若两个子簇的重要性之和大于它们上一级的簇的重要性,则用这两个子簇以及它们的重要性之和代替它们上一级的簇以及上一级簇的重要性,否则删除这两个子簇,重复此过程直到最顶层,最终剩下的簇即为算法最终选择的簇。
  • 同DBSCAN类似,最终未被分配到任何簇中的点可视为数据集中的异常点。HDBSCAN算法的主页为The HDBSCAN Clustering Library,一个较为详细的介绍视频链接为HDBSCAN, Fast Density Based Clustering, the How and the Why

原文地址:https://www.cnblogs.com/sunwq06/p/10844745.html

时间: 2024-11-11 02:36:50

K均值聚类和DBSCAN介绍的相关文章

机器学习实战笔记-利用K均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好 簇识别给出聚类结果的含义.假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么.聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样.因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification ). 聚类分析试图将相似对象归人同一簇,将不相似对象归到不

k均值聚类

目录 一.k均值简介 二.应用简介 三.算法 四.选择合适的K 五.具体实例 一.k均值简介 K均值聚类是一种无监督学习,对未标记的数据(即没有定义类别或组的数据)进行分类. 该算法的目标是在数据中找到由变量K标记的组.该算法迭代地工作基于所提供的特征,将每个数据点分配给K个组中的一个. 基于特征相似性对数据点进行聚类. K均值聚类算法的结果是: 1.K簇的质心,可用于标记新数据 2.训练数据的标签(每个数据点分配给一个集群) 二.应用简介 K均值聚类算法用于查找未在数据中明确标记的组.这可用于

[机器学习][K-Means] 无监督学习之K均值聚类

有监督学习虽然高效.应用范围广,但最大的问题就是需要大量的有标签的数据集,但现实生活中我们遇到的大量数据都是没有明确标签的,而且对于庞大的数据集进行标注工作本身也是一项费时费力的工作模式,所以我们希望找到一种方法能自动的挖掘数据集中各变量的关系,然后"总结"出一些规律和特征进行分类,这样的方法我们成为无监督学习(Unsupervised learning). 在无标签的数据集中进行分类的方法成为聚类.顾名思义,聚类就是依照某种算法将相似的样本聚在一起形成一类,而不管它的标签是什么.在聚

第十篇:K均值聚类(KMeans)

前言 本文讲解如何使用R语言进行 KMeans 均值聚类分析,并以一个关于人口出生率死亡率的实例演示具体分析步骤. 聚类分析总体流程 1. 载入并了解数据集:2. 调用聚类函数进行聚类:3. 查看聚类结果描述:4. 将聚类结果图形化展示:5. 选择最优center并最终确定聚类方案:6. 图形化展示不同方案效果并提交分析报表. 人口出生/死亡率聚类分析 - K均值聚类 1. 载入并了解数据集 1.1 从网上下载一份txt格式的关于人口出生率统计的数据(countries.txt).其内容大致如下

机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定,可视化数据分布,直观确定即可): 2 遍历数据集的每个实例,计算其到每个质心的相似度,这里也就是欧氏距离:把每个实例都分配到距离最近的质心的那一类,用一个二维数组数据结构保存,第一列是最近质心序号,第二列是距离: 3 根据二维数组保存的数据,重新计算每个聚簇新的质心: 4 迭代2 和 3,直到收敛

k-均值聚类算法;二分k均值聚类算法

根据<机器学习实战>一书第十章学习k均值聚类算法和二分k均值聚类算法,自己把代码边敲边理解了一下,修正了一些原书中代码的细微差错.目前代码有时会出现如下4种报错信息,这有待继续探究和完善. 报错信息: Warning (from warnings module): File "F:\Python2.7.6\lib\site-packages\numpy\core\_methods.py", line 55 warnings.warn("Mean of empty

机器学习--k均值聚类(k-means)算法

一.基本原理 分类是指分类器根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类.分类被称为监督学习.如果训练集的样本没有标注类别,那么就需要用到聚类.聚类是把相似的样本聚成一类,这种相似性通常以距离来度量.聚类被称为无监督学习. 聚类是指根据"物以类聚"的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程.它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似.与分类规则不同,进行聚类前并不知道

Win8 Metro(C#)数字图像处理--2.52图像K均值聚类

原文:Win8 Metro(C#)数字图像处理--2.52图像K均值聚类 ?? [函数名称] ??图像KMeans聚类??????KMeansCluster(WriteableBitmap?src,int?k) /// <summary> /// KMeans Cluster process. /// </summary> /// <param name="src">The source image.</param> /// <pa

机器学习之路:python k均值聚类 KMeans 手写数字

python3 学习使用api 使用了网上的数据集,我把他下载到了本地 可以到我的git中下载数据集: https://github.com/linyi0604/MachineLearning 代码: 1 import numpy as np 2 import pandas as pd 3 from sklearn.cluster import KMeans 4 from sklearn import metrics 5 6 ''' 7 k均值算法: 8 1 随机选择k个样本作为k个类别的中心