Matlab实现Kmeans++算法(每行代码标注详细注解)

逐行代码讲解Kmeans++算法的原理及其实现,后续将更新该算法的进一步优化的代码的讲解

目录

一、什么是Kmeans++算法

二、Kmeans++算法原理

三、Kmeans++算法代码解析

四、总结


一、什么是Kmeans++算法

        K-means算法的优点是简单易实现,计算效率高,适用于大规模数据集。K-means算法的缺点是需要事先指定聚类个数k,而这个参数往往难以确定;另外,K-means算法对初始聚类中心的选择敏感,不同的初始聚类中心可能导致不同的聚类结果;而且,K-means算法容易陷入局部最优解,即不能保证找到全局最优解。

        为了克服K-means算法对初始聚类中心选择敏感和容易陷入局部最优解的问题,一种改进的算法是K-means++算法。K-means++算法与K-means算法的区别仅在于选择初始聚类中心的方法。

二、Kmeans++算法原理

        kmeans++算法的核心思想是:在选择初始聚类中心时,尽量让聚类中心之间的距离较大,这样可以避免出现空聚类或者聚类中心过于接近的情况。具体的步骤如下:

        1)从数据集中随机选择一个点作为第一个聚类中心。

        2)对于数据集中的每个点,计算它到已选聚类中心的最短距离(即最近邻距离),并将这些距离存入一个数组D。

        3)从数据集中以概率正比于D中对应元素的平方选择一个点作为下一个聚类中心。

        4)重复步骤2和3,直到选择出k个聚类中心。

        5)使用kmeans算法,以选出的k个聚类中心为初始值,进行聚类。

三、Kmeans++算法代码解析

为了实现kmeans++算法,我们需要定义以下几个函数:

  • dist2:计算两个点之间的欧氏距离的平方。
  • minDist:计算一个点到一组点的最短距离。
  • chooseCenter:按照kmeans++算法的规则,从数据集中选择一个聚类中心。
  • kmeanspp:实现kmeans++算法,返回k个聚类中心。
  • mykmeans:实现kmeans算法,返回聚类结果。

以下是这些函数的代码:

% 计算两个点之间的欧氏距离的平方
function d = dist2(x, y)
    d = sum((x - y) .^ 2);
end

% 计算一个点到一组点的最短距离
function d = minDist(x, C)
    d = inf; % 初始化为无穷大
    for i = 1 : size(C, 1) % 遍历每个聚类中心
        d = min(d, dist2(x, C(i, :))); % 更新最短距离
    end
end

% 按照kmeans++算法的规则,从数据集中选择一个聚类中心
function c = chooseCenter(X, C)
    n = size(X, 1); % 数据集的大小
    D = zeros(n, 1); % 初始化距离数组
    for i = 1 : n % 遍历每个数据点
        D(i) = minDist(X(i, :), C); % 计算最近邻距离
    end
    D = D / sum(D); % 归一化距离数组
    r = rand(); % 生成一个随机数
    s = 0; % 初始化累积概率
    for i = 1 : n % 遍历每个数据点
        s = s + D(i); % 累加概率
        if s >= r % 如果累积概率大于等于随机数
            c = X(i, :); % 选择该点作为聚类中心
            break; % 结束循环
        end
    end
end

% 实现kmeans++算法,返回k个聚类中心
function C = kmeanspp(X, k)
    C = zeros(k, size(X, 2)); % 初始化聚类中心矩阵
    C(1, :) = X(randi(size(X, 1)), :); % 随机选择第一个聚类中心
    for i = 2 : k % 遍历剩余的聚类中心
        C(i, :) = chooseCenter(X, C(1 : i - 1, :)); % 按照规则选择下一个聚类中心
    end
end

% 实现kmeans算法,返回聚类结果
function [idx, C] = mykmeans(X, k)
    n = size(X, 1); % 数据集的大小
    idx = zeros(n, 1); % 初始化聚类标签
    C = kmeanspp(X, k); % 使用kmeans++算法选择初始聚类中心
    while true % 迭代直到收敛
        old_idx = idx; % 保存旧的聚类标签
        for i = 1 : n % 遍历每个数据点
            min_d = inf; % 初始化最小距离
            for j = 1 : k % 遍历每个聚类中心
                d = dist2(X(i, :), C(j, :)); % 计算距离
                if d < min_d % 如果距离更小
                    min_d = d; % 更新最小距离
                    idx(i) = j; % 更新聚类标签
                end
            end
        end
        for j = 1 : k % 遍历每个聚类中心
            C(j, :) = mean(X(idx == j, :)); % 更新聚类中心为均值
        end
        if isequal(old_idx, idx) % 如果聚类标签没有变化
            break; % 结束循环
        end
    end
end

为了演示matlab实现kmeans++算法的效果,我们使用一个简单的二维数据集,其中包含四个不同的簇。我们先用散点图绘制出数据集,然后用我们定义的mykmeans函数进行聚类,并用不同的颜色和形状标记出聚类结果和聚类中心。以下是代码和结果:

% 生成一个简单的二维数据集
X = [randn(100, 2) + [0, 0]; randn(100, 2) + [5, 0]; randn(100, 2) + [0, 5]; randn(100, 2) + [5, 5]];

% 绘制数据集
figure;
plot(X(:, 1), X(:, 2), 'k.');
title('Data Set');
xlabel('x1');
ylabel('x2');

% 聚类参数
k = 4; % 聚类个数

% 聚类
[idx, C] = mykmeans(X, k);

% 绘制聚类结果
figure;
gscatter(X(:, 1), X(:, 2), idx);
hold on;
plot(C(:, 1), C(:, 2), 'kx', 'MarkerSize', 10, 'LineWidth', 3);
hold off;
title('Clustering Result');
xlabel('x1');
ylabel('x2');
legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Cluster 4', 'Centers');

从结果可以看出,matlab实现kmeans++算法可以有效地对数据集进行聚类,并且聚类中心分布合理,没有出现空聚类或者聚类中心过于接近的情况。

四、总结

本文介绍了如何用matlab实现kmeans++算法,并给出了一个简单的示例。kmeans++算法是一种改进的kmeans聚类算法,它可以有效地选择初始聚类中心,从而提高聚类的质量和速度。matlab实现kmeans++算法的关键是定义几个辅助函数,分别用于计算距离、选择聚类中心和进行聚类。以上就是kmeans++算法的全部内容了,快快点赞收藏学起来吧!后续将更新其他算法~

  • 28
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gavana.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值