k-means算法原理

1 算法简介

k-means(k均值)算法由不同学者于20世纪50-60年代在不同领域提出的一种聚类算法。随后该算法不断得到了改进,成为了一种非常广泛应用的聚类算法。k-means算法是将样本按距离划分为k个簇的一种聚类算法。

2 算法的基本原理

2.1 相关概念

簇:数据点的集合,将相似的数据形成一个集合;

质心:簇中所有点距离的中心。

2.2 距离度量

常见的距离度量包括曼哈顿距离和欧氏距离。k-means一般是通过平方差来衡量点与点之间的“距离”。

m维数据点x=(x_{1},x_{2},...,x_{m})^{T},y=(y_{1},y_{2},...,y_{m})^{T}

2.2.1 曼哈顿距离

曼哈顿距离(Manhattan Distance)又称绝对距离、市区距离。

数据点x,y的曼哈顿距离定义如下:

d(x,y)=\sum_{m=1}^{M}\left | x_{m} -y_{m}\right |

2.2.2 欧氏距离

欧氏距离(欧几里得距离,Euclidean Distance)定义如下:

d(x,y)=\sqrt{\sum_{m=1}^{M}\left ( x_{m} -y_{m} \right )^{2}}

2.2.3 k-means的平方差度量

k-means算法中,一般是通过平方差来衡量点之间的距离。

d(x,y)=\sum_{m=1}^{M}\left ( x_{m} -y_{m} \right )^{2}

2.3 问题求解

k-means算法,将样本分为K个簇,求每一个样本点到该簇质心距离的平方之和,并使其最小化,满足这样的条件的质心即为算法的解,相应的簇即为对样本的聚类划分。

样本X_{i}\in \mathbb{R}^{m},i=1,2,...,N,假设其质心为Z_{j},j=1,2,...,K,则目标函数为:

Obj = \sum_{j=1}^{K}\sum_{i=1}^{N_{j}}\left \| X_{i}-Z_{j} \right \|^{2}

要使得上式取得极小值,对于确定的簇j,应有\frac{\partial Obj}{\partial Z_{j}}=0,即

\frac{\partial \sum_{i=1}^{N_{j}}\left \| X_{i}-Z_{j} \right \|^{2}}{\partial Z_{j}}=\frac{\partial \sum_{i=1}^{N_{j}}(X_{i}-Z_{j})^{T}(X_{i}-Z_{j})}{\partial Z_{j}}=0

求解得Z_{j}=\frac{1}{N_{j}}\sum_{i=1}^{N_{j}}X_{i}

此处给出了质心取值的计算方法,但没有解决簇的划分。对于这一问题,解决的办法是启发式迭代。

3 算法过程

3.1 输入输出

(1)输入:样本X_{i}\in \mathbb{R}^{m},i=1,2,...,N,簇的个数K

(2)输出:K个簇。

3.2 算法初始化

质心初始化及迭代停止条件等。

质心初始化:随机选取K个样本Z_{1}^{(0)},Z_{2}^{(0)},...,Z_{K}^{(0)}作为K个簇的质心;

计算样本与质心距离:计算各样本到各簇心的距离,样本X_{i}到各质心的距离为\left \| X_{i}-Z_{j}^{(0)} \right \|^{2},j=1,2,...,K

簇的划分:样本X_{i}其所属簇为使得距离取最小值的第j个簇 。记这一划分为q^{(0)}(X_{i}):X_{i}\rightarrow \underset{j}{argmin}\left \| X_{i}-Z_{j}^{(0)} \right \|^{2}

则第j个簇的所有样本集合为S_{j}^{(0)}=\left \{ X_{i}| q^{(0)}(X_{i})=j,i=1,2,...,N\right \}

3.3 进行迭代

对于t=1,2,...,T轮迭代:

1)更新质心

新的质心为Z_{j}^{(t)}=\frac{1}{N_{j}}\sum_{X_{i}\in S_{j}}^{}X_{i},其中N_{j}为簇S_{j}的样本数量。

2)计算样本与新质心的距离

计算各样本到各质心的距离,样本X_{i}到各质心的距离为(X_{i}-Z_{j}^{(t)})^{2},j=1,2,...,K

3)新的簇划分

样本X_{i}其所属新的簇使距离取最小值的第j个簇。记这一划分为q^{(t)}(X_{i}):X_{i}\rightarrow \underset{j}{argmin}\left \| X_{i}-Z_{j}^{(t)} \right \|^{2}

则第j个簇的所有样本集合为S_{j}^{(t)}=\left \{ X_{i}| q^{(t)}(X_{i})=j,i=1,2,...,N\right \}

4)迭代判断

当质心不再变化,或质心的距离小于指定值,或迭代次数等满足停止条件时,停止迭代;否则进行迭代;

5)得到最终簇划分

q^{(T)}(X_{i}):X_{i}\rightarrow \underset{j}{argmin}\left \| X_{i}-Z_{j}^{(T)} \right \|^{2}

其对应的簇为:S_{j}^{(T)}=\left \{ X_{i}| q^{(T)}(X_{i})=j,i=1,2,...,N\right \}j=1,2,...,K

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算法对极端值比较敏感。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值