聚类就是对大量未知标注的数据集,按数据的内在相似性将数据划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小
K-means算法就是无监督的聚类算法,其实现方法比较简单。
一、基本K-Means算法
1. 算法流程
假定输入样本为 S = x 1 , x 2 , . . . , x m S=x_1, x_2, ...,x_m S=x1,x2,...,xm,则算法步骤为:
(1) 选择初始的k个类别的中心 μ 1 , μ 2 , . . . , μ k \mu_1, \mu_2,...,\mu_k μ1,μ2,...,μk
(2) 对每个样本 x i x_i xi,采用距离计算公式(欧式距离、协方差、皮尔逊系数等)将其标记为距离中心最近的类别,即:
l a b d i = a r g m i n 1 ≤ j ≤ k ∥ x i − μ i ∥ labd_{i}=argmin_{1\leq j\leq k}\left\| x_{i}-\mu _{i}\right\| labdi=argmin1≤j≤k∥xi−μi∥
(3) 将每个类别的中心进行更新为该类别所有样本的均值:
μ i = 1 ∣ c j ∣ ∑ i ∈ C j x i \mu _{i}=\dfrac {1}{\left| c_{j}\right| }\sum _{i\in C_{j}}x_{i} μi=∣cj∣1i∈Cj∑xi
(4) 重复(2)(3),直到达到中止条件
中止条件:
迭代次数/ 簇中心变化率/ 最小平方误差MSE
下面的图片来形象的描述这一过程
(a ) 图表示了算法步骤(1)随机选取k个值
(b ) 图表示了算法步骤(2)对每个样本进行了划分
(c ) 图表示了算法步骤(3)重新选取了每个类别的中心
后续图表示了迭代的过程
2. k-Mediods聚类(简单的改进)
3. K-Means++
在基本的K-Means算法中采用随机选取质心,对迭代时间和聚类效果有很大的影响,对初值的选择对算法提高很大,k-Means++就是对初始质心选择的 优化。
K-Means++初始化策略:
(1) 随机选取一个样本作为第一个聚类中心 μ 1 \mu_1 μ1
(2) 计算每个数据点与已选择的聚类中心中最近聚类中心的距离,这个值越大被选作聚类中心的概率就越大
(3) 重复b和c直到选择出k个质心
(4) 利用得到的k个质心运行标准的K-Means算法
4. Mini Batch K-Means
传统的K-Means算法需要计算所有样本点到所有类别中心的距离,如果样本数据达到了几十万,多次迭代在传统的K-Means算法中计算量巨大,因此产生了Mini Batch K-Means。
Mini Batch K-Means的主要思想是从数据集中选取部分样本来进行传统的K-Means算法,提高收敛的速度。而通常采样的是通过五方会的随机采样得到。
为了增加准确性,会多进行几次采样得到不同的聚类簇,选择最优聚类簇。
5. 距离计算优化elkan K-Means
每次迭代中都要计算所有样本点到所有类别中心的距离,比较耗时,elkan k-Means算法减少了不必要的计算,利用三角形的两边和大于第三边,两边的差小于第三边的性质来减少计算。
假设样本点为
x
x
x,两个样本中心
μ
1
μ
2
\mu_1\mu_2
μ1μ2,那么就有
2
D
(
x
,
μ
1
)
≤
D
(
μ
1
,
μ
2
)
2D(x,\mu_1)\leq D(\mu_1,\mu_2)
2D(x,μ1)≤D(μ1,μ2),就可以确定
D
(
x
,
μ
1
)
≤
D
(
x
,
μ
2
)
D(x, \mu1)\leq D(x, \mu_2)
D(x,μ1)≤D(x,μ2),可以来减少计算。
但是如果样本的特征值是稀疏的,有缺失的就无法适用。