1 算法简介
k-means(k均值)算法由不同学者于20世纪50-60年代在不同领域提出的一种聚类算法。随后该算法不断得到了改进,成为了一种非常广泛应用的聚类算法。k-means算法是将样本按距离划分为k个簇的一种聚类算法。
2 算法的基本原理
2.1 相关概念
簇:数据点的集合,将相似的数据形成一个集合;
质心:簇中所有点距离的中心。
2.2 距离度量
常见的距离度量包括曼哈顿距离和欧氏距离。k-means一般是通过平方差来衡量点与点之间的“距离”。
维数据点
2.2.1 曼哈顿距离
曼哈顿距离(Manhattan Distance)又称绝对距离、市区距离。
数据点的曼哈顿距离定义如下:
2.2.2 欧氏距离
欧氏距离(欧几里得距离,Euclidean Distance)定义如下:
2.2.3 k-means的平方差度量
k-means算法中,一般是通过平方差来衡量点之间的距离。
2.3 问题求解
k-means算法,将样本分为个簇,求每一个样本点到该簇质心距离的平方之和,并使其最小化,满足这样的条件的质心即为算法的解,相应的簇即为对样本的聚类划分。
样本,假设其质心为,则目标函数为:
要使得上式取得极小值,对于确定的簇,应有,即
求解得
此处给出了质心取值的计算方法,但没有解决簇的划分。对于这一问题,解决的办法是启发式迭代。
3 算法过程
3.1 输入输出
(1)输入:样本,簇的个数。
(2)输出:个簇。
3.2 算法初始化
质心初始化及迭代停止条件等。
质心初始化:随机选取个样本作为个簇的质心;
计算样本与质心距离:计算各样本到各簇心的距离,样本到各质心的距离为
簇的划分:样本其所属簇为使得距离取最小值的第个簇 。记这一划分为,
则第个簇的所有样本集合为
3.3 进行迭代
对于轮迭代:
1)更新质心
新的质心为,其中为簇的样本数量。
2)计算样本与新质心的距离
计算各样本到各质心的距离,样本到各质心的距离为。
3)新的簇划分
样本其所属新的簇使距离取最小值的第个簇。记这一划分为,
则第个簇的所有样本集合为
4)迭代判断
当质心不再变化,或质心的距离小于指定值,或迭代次数等满足停止条件时,停止迭代;否则进行迭代;
5)得到最终簇划分
,
其对应的簇为:,
4 算法实例
这里用sklearn中的KMeans模型进行演示。
import numpy as np
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
#样本生成
X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=1)
#模型训练
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)
#模型预测
y_predict = kmeans.predict(X)
#散点图绘制
plt.scatter(X[:, 0], X[:, 1], c=y_predict, s=50, cmap='viridis')
#质心可视化
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='x',s=100, alpha=0.5)
5 算法总结
k-means算法是一种无监督学习,具有简易高效的优势,但其也存在一些缺点:
1)需要预先设定簇类的数量,设定的值可能不是较优的,导致划分不够理想。
2)初始质心的选择对k-means算法的结果影响很大,容易得到局部最优解。
3)k-means算法对极端值比较敏感。