机器学习算法——聚类3(k均值算法)

一、理论讲解

给定样本集D=\{x_1,x_2,...,x_m \},k均值(k-means)算法针对聚类所得簇划分C=\{C_1,C_2,...,C_k \}最小化平方误差为:

E=\sum_{i=1}^{k} \sum_{x \in C_i} || x-\mu_i ||_2^2    (1)

其中\mu_i = \frac{1}{|C_i|} \sum_{x \in C_i} x是簇内C_i的均值向量。直观来看,(1)式在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度,E越小,则簇内样本相似度越高。

最小化(1)式并不容易,找到它的最优解需考察样本集D所有可能的簇划分,这是一个NP难问题。因此,k均值算法采用了贪心策略,通过迭代优化来近似求解(1)式。算法流程为:


输入:样本集D=\{x_1,x_2,...,x_m \};聚类簇数k

过程:从D中随机选择k个样本最为初始均值向量\{\mu_1,\mu_2,...,\mu_k \}

repeat

        令 C_i = \phi (1 \leqslant i \leqslant k)

        for j = 1,2,..,m do

                计算样本x_j与各均值向量\mu_i (1 \leqslant i \leqslant k)的距离:d_{ji} = ||x_j - \mu_i||_2;

                根据距离最近的均值向量确定 x_j的簇标记:\lambda_j = arg min_{i \in \{1,2,...,k\}} d_{ji};

                将样本x_j划入相应的簇:C_{\lambda j}= C_{\lambda j} \cup {x_j}

        end for

        for i=1,2,..,k do

                计算新均值向量:\mu_i^{'} = \frac{1}{|C_i|}\sum_{x \in C_i} x

                if \mu_i ^{'} \neq \mu_i then

                        将当前均值向量\mu_i更新为\mu_i^{'}

                else

                        保持当前均值不变

                end if

        end for

until 当前均值向量均未更新

输出:簇划分C=\{C_1,C_2,...,C_k\}


二、案例讲解

用西瓜数据集4.0解释上述算法:

 

编号 密度 含糖率
1 0.697     0.460
2 0.774 0.376
3 0.634 0.264
4 0.608 0.318
5 0.556 0.215
6 0.403 0.237
7 0.481 0.149
8 0.437 0.211
9 0.666 0.091
10 0.243 0.267
11 0.245 0.057
12 0.343 0.099
13 0.639 0.161
14 0.657 0.198
15 0.360 0.370
16 0.593 0.042
17 0.719 0.103
18 0.359 0.188
19 0.339 0.241
20 0.282 0.257
21 0.748 0.232
22 0.714 0.346
23 0.483 0.312
24 0.478 0.437
25 0.525 0.369
26 0.751 0.489
27 0.532 0.472
28 0.473 0.376
29 0.725 0.445
30 0.446 0.459

 假定聚类簇数为3,算法开始时随机选取三个样本x_6,x_{12},x_{27}做为初始均值向量,即

\mu_1=(0.403;0.237), \mu_2=(0.343,0.099),\mu_3=(0.532,0.472)

考察样本x_1=(0.697;0.460),它与当前均值向量\mu_1的距离为:

\mu_1 = \sqrt{(0.697-0.403)^2+(0.460-0.237)^2} = 0.369

\mu_2= \sqrt{(0.697-0.343)^2+(0.460-0.099)^2}=0.506

\mu_3= \sqrt{(0.697-0.532)^2+(0.460-0.472)^2}=0.166

因此将x_1划入簇C_3中。类似地,对样本集中的所有样本考察一遍后,可得当前簇划分为

C_1=\{x_5,x_6,x_7,x_8,x_9,x_{10},x_{13},x_{14},x_{15},x_{17},x_{18},x_{19},x_{20},x_{23} \}

C_2=\{x_{11},x_{12},x_{16} \}

C_3=\{x_1,x_2,x_3,x_4,x_{21},x_{22},x_{24},x_{25},x_{26},x_{27},x_{28},x_{29},x_{30} \}

于是从C_1,C_2,C_3分别求出新得均值向量

\mu_1^{'}= (0.473,0.214), \mu_2^{'}=(0.394,0.066),\mu_3^{'}=(0.623,0.388)

更新当前均值向量后,不断重复上述过程。最终在第五轮迭代产生得结果与第四轮迭代相同,于是算法终止,得到最终的簇划分。

三、代码实现

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import pandas as pd

xigua = pd.read_csv('D:/Machine_Learning/西瓜数据集4.0.csv', encoding='gbk')
data = xigua.values[:, [1,2]]
print(data.shape)
model = KMeans(n_clusters=3, random_state=10).fit(data) #默认为k-means++
label = model.predict(data)
print(label)
plt.scatter(data[:,0], data[:,1], c=label)
plt.show()

得到的结果如下:

机器学习算法——聚类3(k均值算法)_第1张图片

 

你可能感兴趣的:(聚类,聚类,机器学习,算法)