Posted in Python onApril 27, 2021
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 个阶段:
- 随机设 k 个特征空间内的点作为初始的聚类中心
- 对于根据每个数据的特征向量, 从 k 个聚类中心中寻找最近的一个, 并把该暑假标记为这个聚类的中心
- 在所有的数据都被标记过聚类中心之后, 根据这些数据分配的类簇, 通过取分配每个先前质心的所有样本的平均值来创建新的质心重, 新对 k 个聚类中心做计算
- 计算旧和新质心之间的差异. 如果所有的数据点从属的聚类中心与上一次的分配的类簇没有变化, 那么迭代就可以停止, 否则回到步骤 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, 特别在数据不规则的情况下.
k-means & DBSCAN 总结
- Author -
我是小白呀声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@