MATLAB - k 均值聚类

1. 算法简介

k 均值聚类,即 Lloyd 算法1,是一种迭代数据划分算法,它将 n 个观测值分配给由质心定义的 k 个簇之一,其中 k 是在算法开始之前选择的。

算法的基本步骤如下:

  1. 选择 k 个初始簇中心(质心)

  2. 计算所有观测值到每个簇质心的距离

  3. 将观测点进行划分时,分为以下两阶段进行

    I. 将每个观测值分配给距离最近的簇2

    II. 只要将观测值重新分配给另一簇可减少簇内点到簇质心距离平方的总和,就将该观测值分配到该簇3

  4. 计算每个簇中观测值的平均值,以获得 k 个新质心

  5. 重复步骤 2 到 4,直到簇分配不变,或达到最大迭代次数

从上面所展现的算法的基本步骤中,不难发现 k 均值聚类算法中有以下两个关键点:

  • 初始簇中心的选择
  • 如何定义点到点之间的距离

    2. kmeans 函数

在 matlab 中可以调用 kmeans 函数实现 k 均值聚类,具体语法如下,

[idx, C, sumd, D] = kmeans(X, k, Name, Value);

其中,各个输入/输出参数的含义如下

  • idx:簇索引,以数值列向量形式返回,即:每个观测点最终被分配到的簇
  • C:簇质心位置,以数值矩阵形式返回,C 是 \(k \times p\) 矩阵,其中第 \(j\) 行是簇 \(j\) 的质心
  • sumd:簇内的点到簇质心距离的总和,以数值列向量形式返回,sumd 是 \(k \times 1\) 向量,其中元素 \(j\) 是簇 \(j\) 内的点到簇质心距离的总和
  • D:从每个点到每个簇质心的距离,以数值矩阵形式返回,D 是 \(n \times k\) 矩阵,其中元素 \((j, m)\) 是从观测值 \(j\) 到簇质心 \(m\) 的距离

  • X:\(n \times p\) 数据矩阵,\(n\) 表示观测点的个数,\(p\) 表示观测点的特征个数

    nxp 数据矩阵

  • k:聚类的个数,即:将 \(n\) 个观测点分成 \(k\) 个类

  • Name,Value:对 k 均值聚类进行一些个性化设置,比如:选择距离,选择初始化簇中心的方法等等

    • ‘MaxIter’(最大迭代次数), 100 (默认), 正整数
    • ‘Distance’(距离度量), ‘sqeuclidean’ (默认), ‘cityblock’, ‘cosine’, ‘correlation’, ‘hamming’
    • ‘OnlinePhase’(在线更新标志), ‘off’ (默认), ‘on’(开启 k 均值聚类算法步骤 3 的 II 阶段聚类)
    • ‘Start’(选择初始簇质心的方法), ‘plus’ (默认), ‘cluster’, ‘sample’, ‘uniform’, 数值矩阵, 数值数组
    • ‘Replicates’(重复聚类的次数), 1 (默认), 正整数(kmeans 返回 sumd 最低的解)
    • ‘Display’(要显示的输出的级别), ‘final’(显示最终迭代的结果), ‘iter’(显示每次迭代的结果), ‘off’(默认)

注意:正如前面提到的,对于 k 均值聚类算法来说,需要重点关注的指标就是 ‘Distance’ 和 ‘Start’ 的选择。

3. 简单示例

首先,随机生成样本数据

%% 随机生成样本数据
% 控制随机数生成器
seed = rng('default'); % For reproducibility
X = [randn(100,2)*0.75+ones(100,2);
    randn(100,2)*0.5-ones(100,2)]; 

figure(1);
plot(X(:,1),X(:,2),'.');
title('Randomly Generated Data');

随机生成样本数据

从上图可以看出,数据中大致可以被分为两个簇,所以接下来将数据分成两个簇,并从五个初始化中选择最佳排列,并显示最终输出。

%% k 均值聚类
opts = statset('Display','final'); % Create statistics options structure
[idx,C] = kmeans(X,2,'Distance','cityblock',...
    'Replicates',5,'Options',opts);
第 1 次重复,3 次迭代,总距离 = 201.533。
第 2 次重复,5 次迭代,总距离 = 201.533。
第 3 次重复,3 次迭代,总距离 = 201.533。
第 4 次重复,3 次迭代,总距离 = 201.533。
第 5 次重复,2 次迭代,总距离 = 201.533。
距离的最佳总和 = 201.533

使用聚类的结果,绘制簇和簇质心,结果如下图所示,

plot(X(idx==1,1),X(idx==1,2),'r.','MarkerSize',12)
hold on
plot(X(idx==2,1),X(idx==2,2),'b.','MarkerSize',12)
plot(C(:,1),C(:,2),'kx',...
     'MarkerSize',15,'LineWidth',3) 
legend('Cluster 1','Cluster 2','Centroids',...
       'Location','NW')
title('Cluster Assignments and Centroids');
hold off

簇和簇质心

参考

  • k 均值聚类 - MATLAB kmeans - MathWorks 中国: https://ww2.mathworks.cn/help/stats/kmeans.html#namevaluepairarguments
  1. Lloyd, Stuart P. “Least Squares Quantization in PCM.” IEEE Transactions on Information Theory. Vol. 28, 1982, pp. 129–137. 

  2. 此阶段有时候不会收敛至局部最小值解。 

  3. 此阶段会收敛至一个局部最小值,尽管可能存在总距离更低的其他局部最小值。一般情况下,需要穷尽选择起始点才能求解全局最小值,但是,使用具有随机起始点的几个副本通常也会得到全局最小值解。 

留下评论