小言_互联网的博客

k-means & DBSCAN 总结

408人阅读  评论(0)

k-means

概述

k-means 通常被称为劳埃德算法, 是聚类算法中最经典也是最容易理解的模型. 简单的来说聚类就是把相似的东西分到一组.

基本概念

k 值:

  • 要得到簇的个数

质心:

  • 均值, 即向量各维度取平均即可

距离的度量:

  • 欧几里得距离和余弦相似度

优化目标:

代码:

class sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
  """
  :param n_clusters:要形成的聚类数以及生成的质心数

  :param init:初始化方法,默认为'k-means ++',以智能方式选择k-均值聚类的初始聚类中心,以加速收敛;random,从初始质心数据中随机选择k个观察值(行

  :param n_init:int,默认值:10使用不同质心种子运行k-means算法的时间。最终结果将是n_init连续运行在惯性方面的最佳输出。

  :param n_jobs:int用于计算的作业数量。这可以通过并行计算每个运行的n_init。如果-1使用所有CPU。如果给出1,则不使用任何并行计算代码,这对调试很有用。对于-1以下的n_jobs,使用(n_cpus + 1 + n_jobs)。因此,对于n_jobs = -2,所有CPU都使用一个。

  :param random_state:随机数种子,默认为全局numpy随机数生成器
  """

基本方法

fit(X,y=None)

使用 X 作为训练数据拟合模型. 如:

kmeans.fit(X)

predict(X)

预测新的数据所在的类别. 如:

kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)

clustercenters

获取集群中心的点坐标. 如:

kmeans.cluster_centers_
array([[ 1.,  2.],
       [ 4.,  2.]])

labels_

获取每个点的类别. 如:

kmeans.labels_

工作流程

算法的执行过程分为 4 个阶段:

  1. 随机设 k 个特征空间内的点作为初始的聚类中心
  2. 对于根据每个数据的特征向量, 从 k 个聚类中心中寻找最近的一个, 并把该暑假标记为这个聚类的中心
  3. 在所有的数据都被标记过聚类中心之后, 根据这些数据分配的类簇, 通过取分配每个先前质心的所有样本的平均值来创建新的质心重, 新对 k 个聚类中心做计算
  4. 计算旧和新质心之间的差异. 如果所有的数据点从属的聚类中心与上一次的分配的类簇没有变化, 那么迭代就可以停止, 否则回到步骤 2 继续循环

优势 vs 劣势

优势

  • 算法原理简单, 可解释性好
  • 收敛速度快
  • 调参的时候只需要改变 k 一个参数

劣势

  • k 值难以确定
  • 复杂度与样本呈线性关系
  • 很难发现任意形状的簇

DBSCAN 算法

概述

DBSCAN 算法 (Density-Based Spatial Clustering of Applications with Noise) 是一种基于密度空间聚类算法.

基本概念

核心对象:

  • 若某个点的密度达到算法设定的阈值则其为核心点
  • 即 r 邻域内的点的数量不小于 minPts

邻域的距离阈值:

  • 设定的半径 r

直接密度可达:

  • 若某点 p 在点 q 的 r 邻域内, 且 q 是核心点则 p-q 直接密度可达

密度可达:

  • 若有一个点的序列 q0, q1, … qk, 对任意 qi-qi-1 是直接密度可达的, 则从 q0 到 qk 密度可达, 这实际上是直接密度可达的 “传播”

密度相连:

  • 若从某核心点 p 出发, 点 q 和点 k 都是密度可达的. 则称点 q 和点 k 是密度相连的

边界点:

  • 属于某一个类的非核心点, 不能发展下线了

噪声点:

  • 不属于任何一个类簇的点, 从任何一个核心出发都是密度不可达的

图解

  • A: 核心对象
  • B, C: 边界点
  • N: 离群点

工作流程

  • 参数 D: 输入数据集
  • 参数 e: 指定半径
  • MinPts: 密度阈值

优势 vs 劣势

优势

  • 不需要指定簇个数
  • 可以发现任意形状的簇
  • 擅长找到离群点 (检测任务)
  • 只需两个参数

劣势

  • 高维数据不是特别适用 (可以做降维)
  • 参数对结果的影响非常大
  • Sklearn 中效率并不是很高 (数据削减策略)

总结

DBSCAN 的总体效果比 k-means 好很多, 当我们需要用到聚类算法的时候推荐使用 DBSCAN, 特别在数据不规则的情况下.


转载:https://blog.csdn.net/weixin_46274168/article/details/116142386
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场