一些简单的聚类算法

k-means 算法流程如下:

  1. 随机选取 k 个 中心点: c 1 , c 2 , … … c k c_1,c_2, ……c_k c1c2,ck
  2. 对每一个样本,计算与每个中心点之间的距离,取最小的作为它的归类;
  3. 重新计算每个类的中心点
  4. 如果每个中心点变化很小,则算法收敛,退出;否则迭代1-3

优点:可以快速收敛
缺点:

  1. 只适用于连续的 n 维空间 (因为要求均值)
  2. 需要定义 k
  3. 对噪点敏感(一个异常点可能会改变簇的分布,而这个分布并不是我们想要的,见下图)
  4. 会陷入局部最优(为什么请看这里为什么k-mean不能达到全局最优)
一些简单的聚类算法_第1张图片
  1. 该方法不适于发现非凸面形状的簇(使用距离度量,生成球状簇)
  2. 簇的大小应该接近 (因为距离度量)

实现可使用 sklearn:

from sklearn.cluster import KMeans
y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(X) #(X 为二维array)

具体使用方法请看这里:https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

二分 k-means
首先将所有点作为一个簇,一分为二,看那个误差平方和更大,就对那个划分,重复直到得到 k 个簇为止。
计算量比 k-means 小

k-modes
使用众数替代均值(处理离散数据)
使用不同属性值的个数作为距离度量。比如:a=[1,2,3], b=[1,2,4], 距离=1.

k-prototype 是 kmeans 和 kmodes 的组合,暂且不说了。

k-means 易受初始选择点的影响,所以,对初始点的选择应该更加严格。

k-medoids
初始时也是随机选取 k 个点,然后每次更新时,对簇中所有样本点,计算到其中某一个样本的曼哈顿距离( ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| x1x2+y1y2)选取使绝对误差最小的那个样本点,时间为 O ( n 2 ) O(n^2) O(n2)

漂移聚类算法
先随机选定一个点,一个度量半径 r(带宽 bandwidth),在以该点为圆心, r 为半径的圆内的所有点作为一个类。计算该空间内所有向量的平均值,作为偏移均值,将圆心加上该偏移向量,得到新的中心点,重复移动,直到满足一定条件结束。再在未分类的点中重新选一个中心点,重复上述动作,直到所有点均聚类成功。
对每个类,取其中访问频率最大的那个点作为该类的代表。

可使用 sklearn 实现相关算法:

from sklearn.cluster import MeanShift, estimate_bandwidth
band_width = estimate_bandwidth(X) #半径,可用该代码得到,也可自己设
ms = MeanShift(bandwidth=band_width, bin_seeding=True)
ms.fit(X)
y_pred = ms.predict(X)

具体使用方法请看这里:
https://scikit-learn.org/stable/modules/generated/sklearn.cluster.MeanShift.html

层次聚类
优点:不需要设定 k
两种层次方法:自下而上(Agglomerative) 和 自上而下(Divisive)
主要用自下向上的方法·
距离度量:
single linkage
complete linkage
average linkage
层次聚类 Hierarchical Clustering

BIRCH
BIRCH聚类算法原理

基于密度的聚类
DBSCAN
核心对象:邻域内至少包含 MinPts 个样本的点。
密度直达:在核心对象 x i x_i xi 邻域内的所有点都可由 x i x_i xi 密度直达。
密度可达:对于两个点 x i x_i xi x j x_j xj,若他们之间存在一条路径,该路径上的每对相邻的点都密度直达,则 x i x_i xi x j x_j xj 密度可达。
密度相连:若存在两个点都由一个点密度可达,则这两个点密度相连。
下图可以较为清晰地解释这些概念(图来自周志华 《机器学习》):
一些简单的聚类算法_第2张图片
找出所有核心对象:遍历所有样本,找出它们各自的邻域,判断邻域类的数据是否大于一个值 MinPts,若是,则说明该样本为核心对象,将其加入核心对象集合
生成簇:初始时,未访问样本集合为整个数据集。对核心对象集合中的每个核心对象,找出其密度可达的所有对象:使用队列。初始时,队列中只有一个元素:核心对象,判断该元素的邻域是否大于固定值 MinPts,若是,则将该邻域内的所有值加入队列,同时这些值成为将要新生成的簇的一部分(当然要除掉之前已经访问过的点)。重复判断是否将队列中值的邻域内的值加入队列;若不是,则结束循环,生成一个新簇。更新未访问集合。循环的结果便是所有密度相连的点都可聚在一个簇中。

未完待续。。。

参考文献
[1] 均值漂移算法

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