聚类算法(KMeans&DBSCAN)

一、聚类定义

  • 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大类别间的数据相似度较小,即高类间聚,低类内聚
  • 相似度怎么衡量呢?
    • 相似度与距离成负相关 ,所以我们通常用样本间的距离来衡量其相似度。
    • 不同的场景,有不同的样本内容,但最终都会把样本表示成向量
  • 向量的距离怎么表示呢?(假设空间内有两个n维(n>=2)向量 (x1,x2,....,xn)(y1,y2,...,yn) )
    • 欧式距离(euclidean): i=1n(xiyi)2
    • 曼哈顿距离(manhattan): i=1n|xiyi|
    • 核函数映射后距离: d(x,y)=f(x)f(y)
    • 闵可夫斯基距离(minkowski): i=1n(|xiyi|)pp ,p=1为曼哈顿距离, p=2为欧式距离。
    • 带权重闵可夫斯基距离(wminkowski): i=1n(w|xiyi|)pp
    • 标准化欧式距离(seuclidean):即对于各特征维度做了归一化以后的欧式距离。此时各样本特征维度的均值为0,方差为1.
    • 相关系数: ρ=cov(X,Y)D(X)D(Y)
    • 余弦相似度
      聚类算法(KMeans&DBSCAN)_第1张图片

二、K-Means 聚类

K-Means can be seen as a special case of Gaussian mixture model with equal covariance per component.
K-Means is equivalent to the expectation-maximization algorithm with a small, all-equal, diagonal covariance matrix.

  • 算法步骤
    聚类算法(KMeans&DBSCAN)_第2张图片

  • 迭代收敛的终止条件怎么定义?

    • 聚类中心不再变化(或者变化小于某阈值)
    • 损失函数小于某阈值
    • 达到指定的迭代次数
  • 损失函数(Coordinate descent)
    聚类算法(KMeans&DBSCAN)_第3张图片
  • K 值的选择?
    聚类算法(KMeans&DBSCAN)_第4张图片
  • 初始聚类中心的选择?
    • 优化的初始化聚类方法(Arthur 和 Vassilvitskii 提出的Kmeans++
    • 多初始化几遍((适用于 k=210 ),选所有这些聚类中损失函数(到聚类中心和)最小的。
    • 初始第一个聚类中心为某个样本点,初始第二个聚类中心为离它最远的点,第三个为离它俩最远…
  • K-Means 的局限性以及解决办法

    • 若存在一个没有样本点分配给它的聚类中心,我们通常会直接移除那个聚类中心,由 K 个簇变为 K1 个簇
    • K-Means 算法可能收敛到局部最小值,且在大规模数据集上收敛较慢,解决办法:二分K-Means
      聚类算法(KMeans&DBSCAN)_第5张图片
  • 二分K-Means(最大程度的降低误差平方和)

    • 首先,将所有点作为一个簇,然后使用 K-Means 算法该簇一分为二
    • 下次迭代时,选择有最大误差的簇使用 K-Means 算法(k=2)继续进行划分
    • 重复该过程,直至 k 个簇创建成功为止
  • scikit-learn中的KMeans类

    • 主要参数
      • n_clusters:聚类数量,默认为8
      • init: 初始值选择的方式,默认为k-means++,可以为完全随机选择random或者ndarray
      • n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10。
      • max_iter:最大的迭代次数,默认300次。
      • tol :容忍的最小误差(默认为0.0001),当误差小于tol就会退出迭代。
      • algorithm:默认为auto,不用更改。
      • random_state:The generator used to initialize the centers. If an integer is given, it fixes the seed(即:给定一个整数后,每次运行的结果都是一致的,否则是随机的)
    • 常用方法及属性

       from sklearn.cluster import KMeans
       from sklearn.preprocessing import StandardScaler
      
       # 随机变量标准化,使其服从标准正态分布
       # Standardize features by removing the mean and scaling to unit variance
       X_Norm = StandardScaler.fit_transform(X)
      
       # 返回一个簇对象,包含属性cluster_centers_、labels_、
       # inertia_(Sum of distances of samples to their closest cluster center)
       cls_object = KMeans(n_clusters=4).fit(X_Norm)
      
       # 预测新数据的类别
       label_new = KMeans(n_clusters=4).predict(new_data) 
    • plt 绘图中文显示参数设置

       import matplotlib.pyplot as plt
       plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
       plt.rcParams['axes.unicode_minus']=False   # 用来正常显示负号
       # 有中文出现的情况,需要加上u'content',使用 unicode 编码

三、密度聚类

该聚类算法假设:聚类结构能够通过样本分布的紧密程度确定。通常聚类算法从样本密度的角度来考察样本之间的可连续性,并基于可连续性样本不断扩展聚类簇以获得最终的聚类结构

指导思想:只要样本点的密度大于某阈值,则将该样本添加到最近的簇中。

优缺点:该算法可发现任意形状的聚类,且对噪声不敏感;但计算复杂度大,需要建立空间索引来降低计算量。

1. DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

  • DBSCAN算法的若干概念

    • 对象的ε-邻域:给定对象在半径 ε内的区域。
    • 核心对象:对于给定的数目m,如果一个对象的ε-邻域至少包含 m 个对象,则称该对象为核心对象。
    • 直接密度可达:给定一个对象集合D,如果 p 是在核心对象 q 的ε-邻域内,我们说从对象 q 出发到对象p是直接密度可达的。
    • 密度可达:如果存在一个对象链 p1p2pnp1=qpn=p ,对 piD(1in) pi+1 是从 pi (核心对象) 关于 ε 和 m 直接密度可达的,则对象 p 是从核心对象 q 关于 ε 和 m 密度可达的。
    • 密度相连:如果对象集合D中存在一个核心对象o,使得对象 p 和 q 是从 o 关于 ε 和 m 密度可达的,那么对象 p 和 q 是关于 ε 和 m 密度相连的。
    • 密度相连的点的最大集合。
    • 噪声:不包含在任何簇中的对象称为噪声。
      聚类算法(KMeans&DBSCAN)_第6张图片
  • DBSCAN算法流程

    • 如果一个点 p 的ε-邻域包含多于 m 个对象,则创建一个 p 作为核心对象的新簇
    • 寻找并合并核心对象直接密度可达的对象
    • 没有新点可以更新簇时,算法结束
    • 由上述算法可知:
      • 每个簇至少包含一个核心对象
      • 非核心对象可以是簇的一部分,构成了簇的边缘(edge)
      • 包含过少对象的簇被认为是噪声
  • scikit-learn中的DBSCAN类

    • 主要参数(本身的参数+最近邻度量的参数)

      • epsDBSCAN算法参数,即我们的ϵ-邻域的距离阈值,默认值是0.5。一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。
      • min_samplesDBSCAN算法参数,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值,默认值是5。一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点。反之min_samples过小的话,则会产生大量的核心对象。
      • metric最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离即p=2的闵可夫斯基距离)就可以满足我们的需求
      • algorithm最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用”auto”建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。

      • leaf_size最近邻搜索算法参数,为使用KD树或者球树时, 停止建子树的叶子节点数量的阈值。这个值越小,则生成的KD树或者球树就越大,层数越深,建树时间越长,反之,则生成的KD树或者球树会小,层数较浅,建树时间较短。默认是30. 因为这个值一般只影响算法的运行速度和使用内存大小,因此一般情况下可以不管它。

      • p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。

      • 以上就是DBSCAN类的主要参数介绍,其实需要调参的就是两个参数epsmin_samples,这两个值的组合对最终的聚类效果有很大的影响。
    • 常用方法及属性

       from sklearn.cluster import DBSCAN
       from sklearn.preprocessing import StandardScaler
      
       # 随机变量标准化,使其服从标准正态分布
       # Standardize features by removing the mean and scaling to unit variance
       X_Norm = StandardScaler.fit_transform(X)
      
       params = ((0.2, 5), (0.2, 10), (0.2, 15), (0.3, 5), (0.3, 10), (0.3, 15))
      
      
       # 返回一个簇对象,包含属性core_sample_indices_、labels_(Noisy samples label -1)、
       # components_(Copy of each core sample found by training)
       eps, min_samples = params[i]
       cls_object = DBSCAN(eps=eps, min_samples=min_samples).fit(X_Norm)

2. 密度最大值聚类(Density-Peek Clustering)

聚类算法(KMeans&DBSCAN)_第7张图片


四、层次聚类、谱聚类、高斯混合模型聚类


五、聚类的衡量指标

  • 均一性、完整性、V-measure(均一性和完整性的加权平均)
  • ARI & AMI
  • 轮廓系数 Silhouette Coefficient 和 Calinski-Harabasz Index
  • 可通过from sklearn import metrics调用

你可能感兴趣的:(机器学习)