【机器学习】聚类算法 KMeans DBSCAN

在无监督学习领域中我们的数据集没有标签,在这情况下我们想对其分类,这就要引出聚类算法了,而今天所说的kmeans算法就是一种经典的无监督聚类算法。

kmeans算法

算法思想

Kmeans算法是输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准k个聚类的一种算法。k-means 算法接受输入量 k ;然后将n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。

基本概念

需要指定簇·cluster 的数量,也就是k值,表示希望分成几堆
质心计算方式,说了是kmeans所以就是通过向量各维度去平均计算
距离的度量方式:常用欧式距离,当然余弦相似度也ok(需要标准化)
优化目标: m i n ∑ i = 1 k ∑ x ∈ C i d i s t a n c e ( c i , x ) min\sum_{i=1}^k\sum_{x∈C_i}distance(c_i,x) mini=1kxCidistance(ci,x)

算法流程

initialize k 初始化k个起始点
当任意一个点的簇分配结果发生改变的时候:
	遍历每个数据点:
		遍历每个质心:
			计算质心的数据点之间的距离
		重新将数据点分配到最近的簇
	遍历每个簇:
		求取平均值更新质心

算法时间复杂度为 O(NKT) N为数据点个数,k为质心个数,T为迭代次数
考点:k值怎么选
1、随机中心点选择
2、选择彼此尽量远的k个点
3、使用canopy初始化聚类
若是所选择的k值大于真实分类数量,指标上升缓慢
若是所选择的k值小于真实分类数量,指标生会急剧上升
【机器学习】聚类算法 KMeans DBSCAN_第1张图片

优点:

  • 算法简单快速、适合常规数据集

缺点:

  • k值难以确定
  • 复杂度与样本呈线性关系
  • 对于某些任意的非常规形状的簇效果不好(如下图)
    【机器学习】聚类算法 KMeans DBSCAN_第2张图片

DBSCAN算法

如果说kmeans对于上述样本束手无策的话,那么就轮到DBSCAN登场了DBSCAN是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。

基本概念

  • 核心对象:如果给定对象Ε邻域内的样本点数大于等于MinPts,则称该对象为核心对象
  • 密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q=pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。
  • 密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联
  • 边界点:属于一个类的非核心点无法发展下线了
  • 直接密度可达:对于样本集合D,如果样本点q在p的Ε邻域内,并且p为核心对象,那么对象q从对象p直接密度可达
  • 噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是不可达的
    如下图所示 A是核心点 N是噪声点 BC是边界点
    【机器学习】聚类算法 KMeans DBSCAN_第3张图片

算法流程

标记所有对象为 未访问 unvisited
Do
随机选择一个 未访问对象 p
标记p为访问 visited
IF p 的 ϵ 领域内至少有 minPs个对象:
	则创建一个C簇,并把p添加到C中
	令N为p的ϵ 领域内中的对象集合
	For N中的每个点 p:
		IF p 是 unvisited:
			把p标记为 visited
			IF p的邻域ϵ 中至少有 minPs个对象,再把这些对象添加到 N中
			IF p 不属于任何簇就把p添加到C
	End For
	输出 C
ELSE 标记p为噪声
UNTIL 所有的 p 都被标记为 Visited

参数选择

ϵ 表示指定半径 可以根据 k 距离来设定,找突变点
Minpts 表示密度阈值 k 距离中的 k 值一般取小一些,多次尝试

优势

  • 不需要指定类簇个数
  • 可以发现任意形状的类簇
  • 擅长找离群点
  • 可调节参数少

劣势

  • 难以处理高维数据
  • 参数敏感对聚类结果影响大
  • 效率低

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