机器学习系列(14)——K均值聚类

本文介绍K均值(KMeans)聚类算法。

 

0x01、k均值聚类简介

K均值聚类是基于样本集合划分的聚类算法。K均值聚类将样本集合划分为K个子集,构成K个类,将n个样本分到K个类中,每个样本到其所属类的中心的距离最小。每个样本只能属于一个类,所以K均值聚类是硬聚类。

1、模型

给定 n 个样本的集合 X= \left\{ x_1, x_2, ...,x_n \right\},每个样本由一个特征向量表示,特征向量的维数是 mk 均值聚类的目标是将 n 个样本分到 k 个不同的类或簇中,这里假设 k<nk 个类 G_1, G_2,...,G_k 形成对样本集合 X 的划分,其中 G_i \cap C_j = \varnothing\bigcup_{i=1}^{k} G_i = X。用 C 表示划分,一个划分对应着一个聚类结果。

划分 C 是一个多对一的函数。事实上,如果把每个样本用一个整数 i \in \left\{ 1,2,...,n \right\} 表示,每个类也用一个整数 l \in \left\{ 1,2,...,k \right\} 表示,那么划分或者聚类可以用函数 l = C(i) 表示,其中 i \in \left\{ 1,2,...,n \right\}l \in \left\{ 1,2,...,k \right\}。所以k均值聚类的模型是一个从样本到类的函数。

2、策略

k 均值聚类归结为样本集合 X 的划分,或者从样本到类的函数的选择问题。k 均值聚类的策略是通过损失函数的最小化选取最优的划分或函数 C^*

首先,采用欧式距离平方(squared Euclidean distance)作为样本之间的距离 d(x_i,x_j)

        d(x_i,x_j) = \sum_{k=1}^{m} (x_{ki} - x_{kj})^2 = ||x_i - x_j||^2   

然后,定义样本与其所属类的中心之间的距离的总和为损失函数,即:

        W(C) = \sum_{l=1}^{k} \sum_{C(i)=l} ||x_i - \bar{x}_l ||^2   

式中 \bar{x}_l = (\bar{x}_{1l}, \bar{x}_{2l},..., \bar{x}_{ml})^T 是第 l 个类的均值或中心, n_l = \sum_{i=1}^n I(C(i)=l)I(C(i)=l) 是指示函数,取值为1或0。函数W(C) 也称为能量,表示相同类中的样本相似的程度。

k 均值聚类就是求解最优化问题:

        C^* = \arg \min_{C} W(C) = \arg \min_{C} \sum_{i=1}^{k} \sum_{C(i)=1} ||x_i - \bar{x}_l||^2

相似的样本被聚到同类时,损失函数值最小,这个目标函数的最优化能达到聚类的目的。但是这是一个组合优化问题,n个样本分到k类,所有可能分法的数目是:

        S(n,k) = \frac{1}{k!} \sum_{l=1}^{k} (-1)^{k-1} \binom{k}{l} k^n  

这个数字是指数级的。事实上,k均值聚类的最优解问题是NP困难问题。现实中采用迭代的方法求解。

 

0x02、k均值聚类算法

k均值聚类的算法是一个迭代的过程,每次迭代包括两个步骤。首先选择k个类的中心,将样本逐个指派到与其最近的中心的类中,得到一个聚类结果;然后更新每个类的样本的均值,作为类的新的中心;重复以上步骤,直到收敛未知。具体过程如下。

首先,对于给定的中心值 (m_1, m_2,...,m_k),求一个划分 C,使得目标函数极小化:

        \min_{C} \sum_{l=1}^{k} \sum_{C(i)=l} ||x_i - m_l||^2    

就是说在类中心确定的情况下,将每个样本分到一个类中,使样本和其所属类的中心之间的距离总和最小。求解结果,将每个样本指派到与其最近的中心 m_l 的类 G_l 中。

然后,对给定的划分C,再求各个类的中心 (m_1, m_2,...,m_k),使得目标函数极小化:

        \min_{m_1,...,m_k} \sum_{l=1}^{k} \sum_{C(i)=l} ||x_i - m_l||^2    

就是说在划分确定的情况下,使样本和其所属类的中心之间的距离总和最小。求解结果,对于每个包含 n_l 个样本的类 G_l,更新其均值 m_l

        m_l = \frac{1}{n_l} \sum_{C(i)=l} x_i, ~l=1,2,...,k   

重复以上两个步骤,直到划分不再该表,得到聚类结果。

【k均值聚类算法】

输入:n个样本的集合X;

输出:样本集合的聚类C* 。

(1)初始化。令 t=0,随机选择 k 个样本点作为初始聚类中心 m^{(0)} = (m_{1}^{(0)},...,m_{l}^{(0)},...,m_{k}^{(0)})

(2)对样本进行聚类。对固定的类中心 m^{(t)} = (m_{1}^{(t)},...,m_{l}^{(t)},...,m_{k}^{(t)}),其中 m_{l}^{(t)} 为类 G_l 的中心,计算每个样本到类中心的距离,将每个样本指派到与其最近的中心的类中,构成聚类结果 C^{(t)}

(3)计算新的类中心。对聚类结果 C^{(t)},计算当前各个类中的样本的均值,作为新的类中心 m^{(t+1)} = (m_{1}^{(t+1)},...,m_{l}^{(t+1)},...,m_{k}^{(t+1)})

(4)如果跌到收敛或符合停止条件,输出 C^* = C^{(t)} 。否则,令 t=t+1,返回步骤(2)。

k均值聚类算法的复杂度是 O(mnk),其中 m 是样本维数,n 是样本个数,k 是类别个数。

 

0x03、k均值聚类算法在sklearn中是实现

sklearn.cluster.KMeans

参数参数类型及取值范围说明
n_clusters整型簇的数量,即生成的质心的数量。默认值8。
init

{'k-means++',

'random',
ndarry,callable}

初始化方法。默认是'k-means++'。
k-means++:选择的初始均值向量之间都距离比较远,效果较好;random:随机选择K个样本最为初始均值向量;ndarry:形如(n_cluster,n_features)的数组作为初始均值向量。
n_init整型算法使用不同质心种子下计算的次数。默认值10。
最终结果将是这些运行结果的最佳输出。
max_iter整型最大迭代次数。默认值为300。
tol浮点型算法收敛的阈值。默认值1e-4。
verbose整型详细模式。默认值为0。
0表示不输出日志信息;1表示每隔一段时间打印一次日志信息。如果大于1,打印次数频繁。
random_state整型,或随机状态实例随机数生成器种子。默认值None。
copy_x布尔型当预先计算距离时,使之在数值上更精确地居中数据。默认值为True。
当为True时,原始数据不会被修改;为False时,原始数据会被修改,并在函数返回前放回,但可能会因减去再加上数据均值而引入小的数值上的差异。注意如果原始数据不是C-连续的,或原始数据稀疏,但不是CSR格式的,即使参数值为False也会进行复制。
algorithm{'auto','full','elkan'}使用K均值算法。默认值为auto。
经典的EM风格算法是‘full’;通过使用三角不等式,elkan变异对定义完好的簇更有效;但由于分配了额外的形状数组(n_samples,n_clusters),因此需要更多的内存。
n_jobs整型使用CPU的数量。默认值None。将在0.25版本被移除。

 

 

参考:

[1]. 李航. 统计学习方法(第二版)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: k均值聚类是一种常用的无监督学习算法,常用于将数据集划分为K个不同的别。在Matlab中,可以利用k均值聚类算法对数据进行分析和聚。 首先,需要在Matlab中加载数据集。可以使用Matlab内置的函数`load`或者`readtable`来读取数据。读取之后,应该对数据进行预处理,包括数据归一化和特征选择。 接下来,需要指定k值(即聚数目)。k值的选择可以通过试验和结果评估来确定。一般而言,可以通过使用一些启发式方法(如肘部法则或轮廓系数)来估计最佳的k值。 然后,可以使用Matlab内置的`kmeans`函数进行聚。`kmeans`函数需要传入数据集和k值作为参数。此外,还可以指定其他选项,例如迭代次数、初始聚中心等。 聚完成后,可以通过可视化或其他方法来分析聚结果。Matlab提供了许多可视化工具和函数,例如`scatter`、`plot`和`gscatter`等,它们可以帮助我们更好地理解聚结果。 最后,对于聚结果的评估,可以使用一些指标来度量聚质量,如轮廓系数、互信息等。这些指标可以帮助我们了解聚的效果,并与其他聚算法进行比较。 总之,Matlab提供了丰富的函数和工具来支持k均值聚类。结合数据预处理、聚算法、可视化和评估方法,我们可以在Matlab中进行有效的K均值聚类分析。但是需要注意的是,选择合适的k值和评估指标是进行聚分析的关键,需要根据具体问题进行调整和选择。 ### 回答2: k均值聚类是一种常用的无监督机器学习算法,用于将数据集划分为k个不同的别。在Matlab中,可以使用相关的工具箱或编写自定义代码来实现k均值聚类。 首先,需要确定聚的数量k。然后,选择一组初始的聚中心点。接下来的步骤是迭代地执行以下两个过程,直到收敛为止: 1. 分配阶段:计算每个数据点与k个聚中心之间的距离,并将数据点分配给距离最近的聚中心。 2. 更新阶段:根据分配结果,重新计算每个聚的中心。这可以通过计算每个聚中所有数据点的平均值来完成。 在Matlab中,可以使用kmeans函数来执行k均值聚类。该函数的输入参数包括数据集、聚数量k和一些可选参数,如迭代次数和重复次数。调用kmeans函数后,它将返回聚标签和聚中心的坐标。 以下是一个简单的示例,展示如何使用Matlab进行k均值聚类: ```matlab % 载入数据集 load('data.mat'); % 设置聚数量 k = 3; % 执行k均值聚类 [idx, centers] = kmeans(data, k); % 绘制聚结果 figure; gscatter(data(:,1), data(:,2), idx); hold on; plot(centers(:,1), centers(:,2), 'k*', 'MarkerSize', 10); hold off; ``` 上述代码中,我们首先加载了一个名为'data.mat'的数据集。然后,我们设置聚数量为3,调用kmeans函数执行k均值聚类。最后,我们使用gscatter函数将聚结果绘制在图像上,并以星号标记表示聚中心。 通过使用Matlab中的k均值聚类函数,我们可以轻松地进行聚分析,并对数据集进行分。 ### 回答3: k均值聚类是一种常用的聚算法,主要用于将一组数据点按照其相似度划分为k个别。Matlab是一个功能强大的数值计算和科学数据可视化软件,提供了丰富的工具和函数支持k均值聚类。 在Matlab中,可以使用k均值聚类函数kmeans实现聚分析。该函数的基本语法如下: [idx, C] = kmeans(X, k) 其中,X是包含数据点的n×m矩阵,n表示样本数,m表示特征数;k表示要划分的别数;idx是一个n×1的向量,表示每个数据点所属的别;C是一个k×m的矩阵,表示每个别的质心。 使用kmeans函数进行k均值聚类的步骤如下: 1. 准备数据:将要聚的数据整理成n×m的矩阵X,确保每个样本的特征在一行内连续排列。 2. 设置k:决定要分为多少个别。 3. 聚分析:调用kmeans函数进行聚分析,将数据矩阵X和别数k作为输入参数。函数会返回每个数据点的别和每个别的质心。 4. 结果分析:根据idx和C的结果对数据进行分析。idx向量表示每个数据点所属的别,C矩阵表示每个别的质心。 5. 结果可视化:可以使用Matlab的图形绘制功能对聚结果进行可视化展示。 需要注意的是,k均值聚类算法对初始质心的选择较为敏感,初步聚结果可能存在局部最优解。为了得到较好的聚结果,可以多次运行算法,选取效果最佳的结果。 总之,Matlab提供了方便的k均值聚类函数,可以帮助用户进行数据的聚分析,并且通过图形化展示结果,更好地理解数据的特征和分

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值