转自:https://blog.csdn.net/ustbbsy/article/details/80960652
感谢博主

1 KMeans

1.1 算法描述

  1. 随机选择k个中心
  2. 遍历所有样本,把样本划分到距离最近的一个中心
  3. 划分之后就有K个簇,计算每个簇的平均值作为新的质心
  4. 重复步骤2,直到达到停止条件

停止条件:

聚类中心不再发生变化;所有的距离最小;迭代次数达到设定值,

代价函数:误差平方和(SSE)

1.2 算法优缺点

优点:

  • 算法容易理解,聚类效果不错
  • 具有出色的速度
  • 当簇近似高斯分布时,效果比较好

缺点:

  • 需要自己确定K值,k值的选定是比较难确定
  • 对初始中心点敏感
  • 不适合发现非凸形状的簇或者大小差别较大的簇
  • 特殊值/离群值对模型的影响比较大
  • 从数据先验的角度来说,在 Kmeans 中,我们假设各个 cluster 的先验概率是一样的,但是各个 cluster 的数据量可能是不均匀的。举个例子,cluster A 中包含了10000个样本,cluster B 中只包含了100个。那么对于一个新的样本,在不考虑其与A cluster、 B cluster 相似度的情况,其属于 cluster A 的概率肯定是要大于 cluster B的。

1.3 效果评价

从簇内的稠密程度和簇间的离散程度来评估聚类的效果。

常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index

1.3.1 轮廓系数

轮廓系数(Silhouette Coefficient)结合了聚类的凝聚度(Cohesion)和分离度(Separation),用于评估聚类的效果。该值处于-1~1之间,值越大,表示聚类效果越好。具体计算方法如下:

  1. 对于第i个元素x_i,计算x_i与其同一个簇内的所有其他元素距离的平均值,记作a_i,用于量化簇内的凝聚度。
  2. 选取x_i外的一个簇b,计算x_i与b中所有点的平均距离,遍历所有其他簇,找到最近的这个平均距离,记作b_i,用于量化簇之间分离度。
  3. 对于元素x_i,轮廓系数s_i = (b_i – a_i)/max(a_i,b_i)
  4. 计算所有x的轮廓系数,求出平均值即为当前聚类的整体轮廓系数

先是计算每一个样本的轮廓系数,然后计算所有样本的轮廓系数,求平均值作为整体轮廓系数

从上面的公式,不难发现若s_i小于0,a_i  > b_i, 说明x_i与其簇内元素的平均距离大于最近的其他簇,表示聚类效果不好。如果a_i趋于0,或者b_i足够大,那么s_i趋近与1,说明聚类效果比较好。

相关代码:

  1. import numpy as np
  2. from sklearn.cluster import KMeans
  3. kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
  4. labels = kmeans_model.labels_
  5. metrics.silhouette_score(X, labels, metric='euclidean')

1.3.2 Calinski-Harabasz Index

这个不知道怎么翻译,估计是两个人名。

类别内部数据的协方差越小越好,类别之间的协方差越大越好,这样的Calinski-Harabasz分数会高。 
在scikit-learn中, Calinski-Harabasz Index对应的方法是metrics.calinski_harabaz_score。

  1. import numpy as np
  2. from sklearn.cluster import KMeans
  3. kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
  4. labels = kmeans_model.labels_
  5. metrics.calinski_harabaz_score(X, labels)

参考博客:KMeans

1.4 K值确定

  • 结合业务分析,确定需要分类的个数,这种情况往往有业务上聚类的个数范围
  • 手肘原则,选定不同的K值,计算每个k值时的代价函数。Kmeans聚类的效果评估方法是SSE,是计算所有点到相应簇中心的距离均值,当然,k值越大 SSE越小,我们就是要求出随着k值的变化SSE的变化规律,找到SSE减幅最小的k值,这时k应该是相对比较合理的值。

如图,在k=3之后,代价函数变化缓慢,选择聚类的个数为3

2 DBSCAN

DBSCAN(Density-Based Spatial Clustering of Application with Noise)基于密度的空间聚类算法。

两个参数:

  • Eps邻域半径(epsilon,小量,小的值)
  • MinPts(minimum number of points required to form a cluster)定义核心点时的阈值。

3个点

  • 核心点:对应稠密区域内部的点
  • 边界点:对应稠密区域边缘的点
  • 噪音点:对应稀疏区域中的点

上图红色为核心点,黄色为边界点,蓝色为噪音点

几个概念:

  • 核心对象:对于任一样本点,如果其Eps邻域内至少包含MinPts个样本点,那么这个样本点就是核心对象。(一个点)
  • 直接密度可达:如果一个样本点p处于一个核心对象q的Eps邻域内,则称该样本点p从对象q出发时是直接密度可达的。
  • 密度相连:对于样本点p和q,如果存在核心对象m,使得p、p均由m直接密度可达,则称p和q密度相连。

DBSCAN的聚类是一个不断生长的过程。先找到一个核心对象,从整个核心对象出发,找出它的直接密度可达的对象,再从这些对象出发,寻找它们直接密度可达的对象,一直重复这个过程,直至最后没有可寻找的对象了,那么一个簇的更新就完成了。也可以认为,簇是所有密度可达的点的集合。

DBSCAN核心思想:从某个选定的核心点出发,不断向密度可达的区域扩张,从而得到一个包含核心点和边界点的最大化区域,区域中任意两点密度相连。

优点:

  • 不需要指定cluster的数目
  • 聚类的形状可以是任意的
  • 能找出数据中的噪音,对噪音不敏感
  • 算法应用参数少,只需要两个
  • 聚类结果几乎不依赖于节点的遍历顺序

缺点:

  • 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
  • DBSCAN算法的聚类效果依赖于距离公式的选取,实际中常用的距离是欧几里得距离,由于‘维数灾难’,距离的度量标准已变得不再重要。(分类器的性能随着特征数量的增加而不断提升,但过了某一值后,性能不升反而下降,这种现象称为维数灾难。对于维度灾难的理解:维度灾难的理解)
  • 不适合数据集中密度差异很大的情形,因为这种情形,参数Eps,MinPts不好选择。(个人理解,如果是密度大的,你选一个小的邻域半径就可以把这些数据点聚类,但对于那些密度小的数据点,你设置的小的邻域半径,并不能把密度小的这些点给全部聚类。)

聚类形状可以是任意的,来个图直观感觉一下:

在sklearn中的应用

  1. from sklearn.cluster import DBSCAN
  2. DBSCAN(eps=0.5, # 邻域半径
  3. min_samples=5, # 最小样本点数,MinPts
  4. metric='euclidean',
  5. metric_params=None,
  6. algorithm='auto', # 'auto','ball_tree','kd_tree','brute',4个可选的参数 寻找最近邻点的算法,例如直接密度可达的点
  7. leaf_size=30, # balltree,cdtree的参数
  8. p=None, #
  9. n_jobs=1)

3 OPTICS

是基于密度的聚类算法,OPTICS(Ordering Point To Idenfy the Cluster Structure),不显式地生成数据聚类,只是对数据对象集合中的对象进行排序,得到一个有序的对象列表。

  • 核心距离(core-distance)

给定参数eps,MinPts,使得某个样本点成为核心对象(核心点)的最小邻域半径,这个最小邻域半径为该样本点的核心距离。

在DBSCAN中,给定领域半径eps和MinPts可以确定一个核心对象,如果eps比较大,在核心对象的邻域半径eps内的点的总数就会大于你所设定的MinPts,所以核心距离就是一个核心点在满足MinPts时的一个最小邻域半径。

  • 可达距离(reachability-distance)

rd(y,x)表示使得‘x为核心点’且‘y从x直接密度可达’同时成立的最小邻域半径。

参考资料

https://blog.csdn.net/itplus/article/details/10089323

Spectral Clustering 谱聚类

1)概述

Spectral Clustering(SC,即谱聚类),是一种基于图论的聚类方法,它能够识别任意形状的样本空间且收敛于全局最有解,其基本思想是利用样本数据的相似矩阵进行特征分解后得到的特征向量进行聚类.它与样本特征无关而只与样本个数有关。

基本思路:将样本看作顶点,样本间的相似度看作带权的边,从而将聚类问题转为图分割问题:找到一种图分割的方法使得连接不同组的边的权重尽可能低(这意味着组间相似度要尽可能低),组内的边的权重尽可能高(这意味着组内相似度要尽可能高).

2)图解过程

图5

如上图所示,断开虚线,六个数据被聚成两类。

3)Spectral Clustering算法函数

a)核心函数:sklearn.cluster.SpectralClustering

因为是基于图论的算法,所以输入必须是对称矩阵。

b)主要参数(参数较多,详细参数)

n_clusters:聚类的个数。(官方的解释:投影子空间的维度)

affinity:核函数,默认是'rbf',可选:"nearest_neighbors","precomputed","rbf"或sklearn.metrics.pairwise_kernels支持的其中一个内核之一。

gamma :affinity指定的核函数的内核系数,默认1.0

c)主要属性

labels_ :每个数据的分类标签

Hierarchical Clustering 层次聚类

1)概述

Hierarchical Clustering(层次聚类):就是按照某种方法进行层次分类,直到满足某种条件为止。

主要分成两类:

a)凝聚:从下到上。首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者某个终结条件被满足。

b)分裂:从上到下。首先将所有对象置于同一个簇中,然后逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终止条件。(较少用)

2)算法步骤

a)将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.

b)找到最接近的两个类并合并成一类, 于是总的类数少了一个.

c)重新计算新的类与所有旧类之间的距离.
          d)重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).

3)图解过程

图6

4)Hierarchical Clustering算法函数

a)sklearn.cluster.AgglomerativeClustering

b)主要参数(详细参数)

n_clusters:聚类的个数

linkage:指定层次聚类判断相似度的方法,有以下三种:

ward:组间距离等于两类对象之间的最小距离。(即single-linkage聚类)

average:组间距离等于两组对象之间的平均距离。(average-linkage聚类)

complete:组间距离等于两组对象之间的最大距离。(complete-linkage聚类)

c)主要属性

labels_: 每个数据的分类标签

参考资料 聚类算法

Mean-shift 均值迁移

1)概述

Mean-shift(即:均值迁移)的基本思想:在数据集中选定一个点,然后以这个点为圆心,r为半径,画一个圆(二维下是圆),求出这个点到所有点的向量的平均值,而圆心与向量均值的和为新的圆心,然后迭代此过程,直到满足一点的条件结束。(Fukunage在1975年提出)

后来Yizong Cheng 在此基础上加入了 核函数 和 权重系数 ,使得Mean-shift 算法开始流行起来。目前它在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。

2)图解过程

为了方便大家理解,借用下几张图来说明Mean-shift的基本过程。

由上图可以很容易看到,Mean-shift 算法的核心思想就是不断的寻找新的圆心坐标,直到密度最大的区域。

3)Mean-shift 算法函数

a)核心函数:sklearn.cluster.MeanShift(核函数:RBF核函数)

由上图可知,圆心(或种子)的确定和半径(或带宽)的选择,是影响算法效率的两个主要因素。所以在sklearn.cluster.MeanShift中重点说明了这两个参数的设定问题。

b)主要参数

bandwidth :半径(或带宽),float型。如果没有给出,则使用sklearn.cluster.estimate_bandwidth计算出半径(带宽).(可选)

seeds :圆心(或种子),数组类型,即初始化的圆心。(可选)

bin_seeding :布尔值。如果为真,初始内核位置不是所有点的位置,而是点的离散版本的位置,其中点被分类到其粗糙度对应于带宽的网格上。将此选项设置为True将加速算法,因为较少的种子将被初始化。默认值:False.如果种子参数(seeds)不为None则忽略。

c)主要属性

cluster_centers_ : 数组类型。计算出的聚类中心的坐标。

labels_ :数组类型。每个数据点的分类标签。、

7 BIRCH

这篇文章写的很详细,可以参考一下BIRCH

8 GaussianMixtureModel(混合高斯模型,GMM)

正太分布也叫高斯分布,正太分布的概率密度曲线也叫高斯分布概率曲线

GaussianMixtureModel(混合高斯模型,GMM)。

聚类算法大多数通过相似度来判断,而相似度又大多采用欧式距离长短作为衡量依据。而GMM采用了新的判断依据:概率,即通过属于某一类的概率大小来判断最终的归属类别。

GMM的基本思想就是:任意形状的概率分布都可以用多个高斯分布函数去近似,也就是说GMM就是有多个单高斯密度分布(Gaussian)组成的,每个Gaussian叫一个"Component",这些"Component"线性加成在一起就组成了 GMM 的概率密度函数,也就是下面的函数。

2)数学公式

这里不讲公式的具体推导过程,也不实现具体算法。列出来公式只是方便理解下面的函数中为什么需要那些参数。

K:模型的个数,即Component的个数(聚类的个数)

为第k个高斯的权重

         p(x |k) 则为第k个高斯概率密度,其均值为μk,方差为σk

上述参数,除了K是直接给定之外,其他参数都是通过EM算法估算出来的。(有个参数是指定EM算法参数的)

3)GaussianMixtureModel 算法函数

a)from sklearn.mixture.GaussianMixture

b)主要参数(详细参数)

n_components :高斯模型的个数,即聚类的目标个数

covariance_type : 通过EM算法估算参数时使用的协方差类型,默认是"full"

full:每个模型使用自己的一般协方差矩阵

tied:所用模型共享一个一般协方差矩阵

diag:每个模型使用自己的对角线协方差矩阵

spherical:每个模型使用自己的单一方差

【聚类算法】sklearn聚类方法详解相关推荐

  1. K均值(K-means)聚类算法原理与代码详解

    0. 算法原理: 上述过程简单描述: a: 初始数据 b: 选择质点 c: 根据质点划分 d: 求均值,更新质心点 e: 划分 f: 更新质心点 1. 代码实现: # K means 教程# 0. 引 ...

  2. 【机器学习】基于实战项目的SVM算法库使用方法详解

    0. 学习背景 本人在进行车道线检测项目中使用到了LBP+SVM算法来改善高复杂度场景下的车道线特征提取效果,主要流程如下:提取训练集中车道线的LBP特征,然后训练一个SVM分类器.在测试时,使用相同 ...

  3. python魔方程序算法_Python魔方方法详解

    魔法方法 含义 基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __ ...

  4. 特征选择方法详解Part2-卡方检验、互信息(Mutual Information)

    Content 1. 单变量分析 1.1 卡方检验 1.1.1 原理 1.1.2 使用示例 1.2 互信息(Mutual Information) 1.2.1 原理 1.2.1.1 互信息(Mutua ...

  5. 【深度学习/机器学习】为什么要归一化?归一化方法详解

    [深度学习/机器学习]为什么要归一化?归一化方法详解 文章目录 1. 介绍 1.1 什么是归一化 1.2 归一化的好处 2. 归一化方法 2.1 最大最小标准化(Min-Max Normalizati ...

  6. 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  7. python one hot编码_对python sklearn one-hot编码详解

    one-hot编码的作用 使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类 ...

  8. python支持向量机回归_Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

  9. spss聚类分析_SPSS实践:常用聚类分析方法详解

    - 点击上方"爱数据学习社"关注我们吧! - 文末领取[100份简历模板] 聚类分析的基本原理是,根据样本的属性,使用某种算法计算相似性或者差异性指标,以确定每个个案之间的亲疏关系 ...

  10. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

最新文章

  1. jQuery鼠标移入移出(冒泡版和无冒泡版)
  2. 杭电1254java实现(双bfs 优先队列)
  3. BGP属性分析--Weight
  4. RedHat宣布支持Azure、.Net Core 2.0和SQL Server 2017
  5. 大数据相关技术说明(一)
  6. 君威u0073故障码解决_格力多联机同时报三个故障“U2”“L0”“d9”怎么修?
  7. [修正] 移动平台曲线不平滑的问题(如:TRectangle, TPath...等)
  8. Running Trinity in multiple steps
  9. 浅谈算法和数据结构: 二 基本排序算法
  10. 计算机组成原理-复习题2
  11. 大家推荐的入门心理学书籍
  12. 产品经理的进阶——需求的成长史
  13. 英文论文sci参考文献格式
  14. ruby语言学习-开启篇
  15. 010-WebBuilder-编写可复用模块+阶段实战效果与代码
  16. java中定义一个时间_Java中的日期和时间
  17. SpringCloud[04]Ribbon负载均衡服务调用
  18. 使用PHP的curl爬取百度搜索页相关搜索词
  19. 4个技巧,Linux 下让工作效率翻倍!
  20. 24 点游戏(Leetcode-679)-回溯法

热门文章

  1. python字典里可以放列表吗_学习python之列表及字典
  2. mysql8.0创建属性,MySQL 8.0新特性 — 管理端口的使用简介
  3. mysql当前时间加一天_MySQL 的加锁处理,你都了解的一清二楚了吗?
  4. 普适的GPIO引脚操作方法
  5. pyspark 通过list 构建rdd
  6. java 包装类可以被继承_【Java基本功】一文了解Java中继承、封装、多态的细节...
  7. 135. Leetcode 46. 全排列 (回溯算法-排列问题)
  8. Leetcode 18. 四数之和 (每日一题 20211011)
  9. 增强学习(四) ----- 蒙特卡罗方法(Monte Carlo Methods)
  10. 分级查询(Hierarchical Path-Finding )