K-Means的三种迭代算法

K-Means是机器学习算法中一个比较经典的聚类算法

具体的实现方式主要有三种:Lloyd(Forgy)Hartigan-WongMacQueen

 

Lloyd算法

Lloyd算法也可以称作Forgy或者Lloyd-Forgy,是最为经典简单的K-means迭代算法,其步骤如下:

1. 随机选取K个点作为初始的中心点

2. 计算每个点与K个中心点的K个距离(假如有N个点,就有N*K个距离值)

3. 分配剩下的点到距离其最近的中心点的类中,并重新计算每个类的中心点

4. 重复步骤2和步骤3

5. 直到达到收敛或者达到某个停止阈值(如最大计算时间)

用公式解释如下:

1. 把所有的点分配到K个类的系数r,属于第k个类的记为1,否则为0

r_{ik}\epsilon\left \{ 0,1 \right \}(1\leq i\leq N,1\leq k\leq K)

2. 由上可知第k个类中的样本数量

N_{k}=\sum_{i=1}^{N}r_{ik}

3. 目标是最小化损失函数J

J=\sum_{i=1}^{N}\sum_{k=1}^{K}r_{ik}\left \| x_{i}-\mu_{k} \right \|^_{2}

4. 计算每个点到中心点的距离,分配r的系数

r_{ik}=\left\{\begin{matrix} 1,if f=argmin_{1\leq k\leq K}\left \| x_{i}-\mu_{k} \right \|^_{2}\\ 0, other\end{matrix}\right.

5. 重新计算每个类的中心点

\mu_{k}=\frac{\sum_{i=1}^{N}r_{ik}x_{i}}{\sum_{i=1}^{N}r_{ik}}=\frac{\sum_{i=1}^{N}r_{ik}x_{i}}{N_{k}}

重复4和5指导收敛或者达到某个阈值

Lloyd算法的缺点是,聚类产生的类别经常是不平衡的,就是说不同类中样本的数量差异很大。这点会经常被忽略到,然而很多时候需要我们聚类出来是平衡的,例如对手写数字图像进行聚类的时候,我们有理由相信10个数字出现的频率是一样的,所以希望聚类后每个类中含有样本数量是相同的。像上述的手写数字图像聚类这个例子中 ,为获得更高的分类准确率,则需要平衡的聚类结果。另外,Lloyd算法是一个批量更新算法,因此会学习速度会相对较快。

 

MacQueen算法

MacQueen是一种在线更新的算法,只需要一次迭代,具体步骤如下:

1. 选取头K个点作为K个类的中心点

2. 选取下一个点计算与K个中心点的距离,选取距离最小的分配到该类中

3. 更新该类的中心点

4. 重复2,3直到所有的点分配完毕,达到收敛

MacQueen相对于Lloyd而言,总体的训练时间需要更久。

 

Hartigan-Wong算法

为了改进上述算法的不平衡问题,我们可以考虑用Hartigan-Wong算法,它也是一种在线更新的算法,具体如下:

1. 随机分配所有的点到K个类上,计算K个类的中心

2. 随机选择一个点,把它移出所属类

3. 重新计算有变化的类的中心

4. 把移出的点重新分配到其距离最近的中心点的类上

5. 循环所有的点,重复2,3,4

6. 进行第二次循环,重复2,3,4,5

7. 直到达到收敛或者某个停止阈值

其主要的不同点是在分配到K个类别的过程中,公式如下:

r_{ik}=\left\{\begin{matrix} 1,if f=argmin_{1\leq k\leq K}\left \| x_{i}-\mu_{k} \right \|^_{2}\\ 0, other\end{matrix}\right.

值得注意的是因为Hartigan-Wong算法多加了一个乘法项

\frac{N}{N+1}

因此算法更倾向于把样本分配给样本数量较少的类。但是这个乘法项并不是为了平衡而设计的,而是在把移除的点加入合适的类中而发生的类大小变化。

Hartigan-Wong算法相对于Lloyd来说是一种在线更新的算法,一般来讲可以获得更低的代价函数值,但是同样地会更慢。Lloyd的批量更新算法速度更快,效率更高。

 

参考文献:

1. 周旺,张晨麟,吴建鑫 “一种基于Hartigan-Wong和Lloyd的定性平衡聚类算法”山东大学学报(工学版)  第46卷第5期

2.https://datascience.stackexchange.com/questions/9858/convergence-in-hartigan-wong-k-means-method-and-other-algorithms

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是用 MATLAB 实现 k-means 聚类算法迭代的示例代码: ```matlab % 设定数据集和聚类数 data = [1 1; 1.5 2; 3 4; 5 7; 3.5 5; 4.5 5; 3.5 4.5]; k = 2; % 随机初始化聚类中心 centroids = data(randperm(size(data, 1), k), :); % 迭代聚类过程 iter_count = 0; while true % 计算每个点到每个聚类中心的距离 distances = pdist2(data, centroids); % 分配每个点到最近的聚类中心,并计算新的聚类中心 [min_distances, cluster_indices] = min(distances, [], 2); new_centroids = zeros(k, size(data, 2)); for i = 1:k new_centroids(i, :) = mean(data(cluster_indices == i, :), 1); end % 判断聚类中心是否变化 if isequal(centroids, new_centroids) break; end % 更新聚类中心并计数 centroids = new_centroids; iter_count = iter_count + 1; end % 输出聚类结果和迭代次数 fprintf('聚类结果:\n'); disp(cluster_indices); fprintf('迭代次数:%d\n', iter_count); ``` 该代码中,首先设定了数据集 `data` 和聚类数 `k`,然后随机初始化了 `k` 个聚类中心。接着进入迭代聚类过程,该过程包含两个步骤: 1. 计算每个点到每个聚类中心的距离。 2. 分配每个点到最近的聚类中心,并计算新的聚类中心。 迭代过程会一直进行,直到聚类中心不再变化为止。最后输出聚类结果和迭代次数。 需要注意的是,该示例代码只适用于二维数据集,如果数据集的维度更高,需要对代码进行相应的修改。另外,在实际应用中,需要根据具体情况选择合适的聚类数和初始聚类中心,否则可能会影响聚类效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值