聚类概念:
- 无监督问题:我们手里没有标签了
- 聚类:相似的东西分到一组
- 难点:如何评估,如何调参
k-means算法
K-means算法的目标是找到簇中心(质心)和簇的分配,以最小化所有点到其最近的簇中心的距离的平方和。
基本概念:
- 要得到簇的个数,需要指定K值
- 质心:均值,即向量各维取平均即可
- 距离的度量:常用欧几里得距离和余弦相似度(先标准化)
优化目标:
主要有两种方式:
- 分解最大SSE (误差平方和)的簇。
直接在簇内执行一次 k=2 的 K-Means 聚类即可。 - 合并距离最小的簇 或者 合并SSE增幅最小的两个簇。
基于这两种最基本优化策略,可以采用二分K-Means算法
伪代码:
创建 k 个点作为起始质心 (随机选择):
当任意一个点的簇分配结果发生改变的时候:
对数据集中的每个数据点:
对每个质心:
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇:
求出均值并将其更新为质心
- 优势: 简单,快速,适合常规数据集
- 劣势:值难确定 、复杂度与样本呈线性关系、很难发现任意形状的簇
DBSCAN算法
基本概念: ( Density-Based Spatial Clustering of Applications with Noise)
- 核心对象:若某个点的密度达到算法设定的阈值则其为核心点(即r邻域内点的数量 ≥ minPts)
- e-邻域的距离阈值:设定的半径r
- 直接密度可达:若某点p在点g的 r 邻域内,且q是核心点则p-q直接密度可达)
- 密度可达:若有一个点的序列q0、q1、…qk,对任意qi-gi-1是直接密度可达的则称从q0到qk密度可达,这实际上是直接密度可达的“传播”
基本概念
- 密度相连: 若从某核心点p出发,点和点k都是密度可达的则称点q和点k是密度相连的。
- 边界点:属于某一个类的非核心点,不能发展下线了
- 直接密度可达: 若某点在点g的r 邻域内,且q是核心点则p-g直接密度可达
- 噪声点:不属于任何一个类簇的点,从任何一个核心点出发都是密度不可达的
工作流程:
伪代码
DBSCAN(数据集 D, 半径 eps, 最小点数 MinPts)
初始化簇标号 C = 0
for 数据集 D 中的每个点 P
if P 已被访问
继续检查下一个点
标记 P 为已访问
邻域点集 NeighborPts = 区域查询(P, eps)
if 邻域点集 NeighborPts 的数量 < MinPts
标记 P 为噪声
else
C = 新的簇
扩展簇(P, NeighborPts, C, eps, MinPts)
扩展簇(P, 邻域点集 NeighborPts, 簇 C, 半径 eps, 最小点数 MinPts)
将 P 加入簇 C
for 邻域点集 NeighborPts 中的每个点 P'
if P' 未被访问
标记 P' 为已访问
邻域点集 NeighborPts' = 区域查询(P', eps)
if 邻域点集 NeighborPts' 的数量 >= MinPts
邻域点集 NeighborPts = 邻域点集 NeighborPts 并集 邻域点集 NeighborPts'
if P' 还不是任何簇的成员
将 P' 加入簇 C
区域查询(P, 半径 eps)
返回点 P 的 eps-邻域内的所有点(包括 P 自身)
优势:
- 不需要指定族个数
- 可以发现任意形状的簇
- 擅长找到离群点(检测任务 )
- 两个参数就够了
劣势:
- 高维数据有些困难(可以做降维)
- 参数难以选择(参数对结果的影响非常大)
- Sklearn中效率很慢(数据削减策略)
高斯混合模型(GMM)
高斯混合模型是一种概率模型,它假设所有数据点都是由有限数量的高斯分布的混合生成的。
数学表述
在GMM中,我们假设有 K K K个高斯分布,每个分布 k k k都有自己的均值 μ k \mu_k μk、协方差 Σ k \Sigma_k Σk和混合权重 π k \pi_k πk。数据点 x x x的概率密度函数可以表示为:
p ( x ) = ∑ k = 1 K π k N ( x ∣ μ k , Σ k ) p(x) = \sum_{k=1}^{K} \pi_k \mathcal{N}(x | \mu_k, \Sigma_k) p(x)=k=1∑KπkN(x∣μk,Σk)
其中 N ( x ∣ μ , Σ ) \mathcal{N}(x | \mu, \Sigma) N(x∣μ,Σ)是高斯分布的概率密度函数。
参数学习
GMM的参数通常通过最大期望(EM)算法来估计。EM算法包括以下两个步骤:
- E步骤(Expectation Step) - 估计给定当前参数下,每个数据点来自每个高斯分布的概率(即“责任”)。
- M步骤(Maximization Step) - 更新每个高斯分布的参数,以最大化所有数据点的对数似然。
伪代码
初始化
选择高斯分布的数量 K K K,随机初始化每个分布的均值 μ k \mu_k μk、协方差 Σ k \Sigma_k Σk和混合系数 π k \pi_k πk。这些参数可以通过如k-means聚类的结果来初始化。
E-Step
对于每个数据点
x
i
x_i
xi和每个分布
k
k
k,计算责任
γ
(
z
i
k
)
\gamma(z_{ik})
γ(zik),它是数据点
x
i
x_i
xi由分布
k
k
k生成的概率:
γ
(
z
i
k
)
=
π
k
N
(
x
i
∣
μ
k
,
Σ
k
)
∑
j
=
1
K
π
j
N
(
x
i
∣
μ
j
,
Σ
j
)
\gamma(z_{ik}) = \frac{\pi_k \mathcal{N}(x_i | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \mathcal{N}(x_i | \mu_j, \Sigma_j)}
γ(zik)=∑j=1KπjN(xi∣μj,Σj)πkN(xi∣μk,Σk)
M-Step
使用E-Step得到的责任来更新参数:
更新每个分布的均值
μ
k
\mu_k
μk:
μ
k
=
∑
i
=
1
N
γ
(
z
i
k
)
x
i
∑
i
=
1
N
γ
(
z
i
k
)
\mu_k = \frac{\sum_{i=1}^{N} \gamma(z_{ik}) x_i}{\sum_{i=1}^{N} \gamma(z_{ik})}
μk=∑i=1Nγ(zik)∑i=1Nγ(zik)xi
其中,
N
k
=
∑
i
=
1
N
γ
(
z
i
k
)
N_k = \sum_{i=1}^{N} \gamma(z_{ik})
Nk=∑i=1Nγ(zik)是分布
k
k
k的有效样本大小。
更新每个分布的协方差
Σ
k
\Sigma_k
Σk:
Σ
k
=
∑
i
=
1
N
γ
(
z
i
k
)
(
x
i
−
μ
k
)
(
x
i
−
μ
k
)
T
∑
i
=
1
N
γ
(
z
i
k
)
\Sigma_k = \frac{\sum_{i=1}^{N} \gamma(z_{ik}) (x_i - \mu_k)(x_i - \mu_k)^T}{\sum_{i=1}^{N} \gamma(z_{ik})}
Σk=∑i=1Nγ(zik)∑i=1Nγ(zik)(xi−μk)(xi−μk)T
更新混合系数
π
k
\pi_k
πk:
π
k
=
∑
i
=
1
N
γ
(
z
i
k
)
N
\pi_k = \frac{\sum_{i=1}^{N} \gamma(z_{ik})}{N}
πk=N∑i=1Nγ(zik)
}