k-means & DBSCAN 总结


Posted in Python onApril 27, 2021

k-means

概述

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

基本概念

k 值:

  • 要得到簇的个数

质心:

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

距离的度量:

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

优化目标:
k-means & DBSCAN 总结

代码:

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 继续循环
    k-means & DBSCAN 总结

优势 vs 劣势

优势

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

劣势

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

DBSCAN 算法

概述

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

基本概念

核心对象:

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

邻域的距离阈值:

  • 设定的半径 r

直接密度可达:

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

密度可达:

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

密度相连:

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

边界点:

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

噪声点:

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

图解

k-means & DBSCAN 总结

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

工作流程

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

优势 vs 劣势

优势

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

劣势

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

总结

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

Python 相关文章推荐
初学python数组的处理代码
Jan 04 Python
利用Python的Django框架生成PDF文件的教程
Jul 22 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
对Python之gzip文件读写的方法详解
Feb 08 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
python字符串的拼接方法总结
Nov 18 Python
pytorch如何冻结某层参数的实现
Jan 10 Python
Python @property装饰器原理解析
Jan 22 Python
Python yield的用法实例分析
Mar 06 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
Apr 23 Python
如何在python中判断变量的类型
Jul 29 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 #Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
python实现腾讯滑块验证码识别
Apr 27 #Python
python实现调用摄像头并拍照发邮箱
Apr 27 #Python
django如何自定义manage.py管理命令
Apr 27 #Python
Python爬虫之爬取二手房信息
七个Python必备的GUI库
You might like
PHP 极验验证码实例讲解
2016/09/29 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
jQuery JSON的解析方式分享
2011/04/05 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
nodejs接入阿里大鱼短信验证码的方法
2017/07/10 NodeJs
js模块加载方式浅析
2017/08/12 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
[56:42]完美世界DOTA2联赛循环赛 Matador vs Forest 第二场 11.06
2020/11/06 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
速记Python布尔值
2017/11/09 Python
python操作excel的方法
2018/08/16 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python模糊图片过滤的方法
2018/12/14 Python
Django项目之Elasticsearch搜索引擎的实例
2019/08/21 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
电子信息科学专业自荐信
2014/01/30 职场文书
中国好声音广告词
2014/03/18 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
python中 .npy文件的读写操作实例
2022/04/14 Python
Java数据结构之堆(优先队列)
2022/05/20 Java/Android