k-means算法matlab实战

一、k-means算法解决的问题

    将一个数据集分为k类的问题(将这些数据点集聚类到K类中去)。

二、k-means算法描述

1、

随机选取k个点分别作为 类1,类2……类K 的中心点

2、

遍历所有的数据点,对于每一个点 计算它到 中心点1,中心点2…… 中心点k 的欧氏距离,并把这个点归入到与之距离最小的中心点所在的类

3、

更新每一类的中心点,新的中心点为该类所有点的平均值。
然后跳到步骤2继续执行,直到满足你的跳出条件。

一般跳出条件可以如下:
比较一个类 目前的中心点与之前的中心点的偏移程度,当偏移程度较小或为零时跳出。

三、演示图

这里写图片描述
演示图按照次序依次进行的是
1、随机选取两个中心点
2、将所有点划分到距离较近的中心点
3、重新计算中心点
4、重新划分类
5、重新计算中心点

四、简单的实践

我们给出一组二维的数据把它划分为5类

K = 5;
dataSet = load('2d-data.mat');%载入数据
[row,col] = size(dataSet.r);

% 存储质心矩阵
centSet = zeros(K,col);%censet作为储存中心点的矩阵

% 随机初始化质心
for i= 1:col
    minV = min(dataSet.r(:,i));
    rangV = max(dataSet.r(:,i)) - minV;
    centSet(:,i) = repmat(minV,[K,1]) + rangV*rand(K,1);
end

% 用于存储每个点被分配的cluster以及到质心的距离
clusterAssment = zeros(row,2);%用来储存每个点到中心点的距离
clusterChange = true;%用来储存中心点是否改变
while clusterChange
    clusterChange = false;
    % 计算每个点应该被分配的cluster
    for i = 1:row
        minDist = 10000;
        minIndex = 0;
        for j = 1:K
            distCal = distEclud(dataSet.r(i,:) , centSet(j,:));
            if (distCal < minDist)
                minDist = distCal;
                minIndex = j;
            end
        end
        if minIndex ~= clusterAssment(i,1)            
            clusterChange = true;
        end
        clusterAssment(i,1) = minIndex;
        clusterAssment(i,2) = minDist;
    end

    % 更新每个cluster 的质心
    for j = 1:K
        simpleCluster = find(clusterAssment(:,1) == j);% simpleCluster是一个列向量,储存的是符合条件的位置

    centSet(j,:) = mean1(dataSet.r(simpleCluster',:));
    end

end

%画图
figure

for i = 1:K
    pointCluster = find(clusterAssment(:,1) == i);
    scatter(dataSet.r(pointCluster,1),dataSet.r(pointCluster,2),5)
    hold on
end
%hold on
scatter(centSet(:,1),centSet(:,2),300,'+')
hold off

end

下面是程序的结果:
这里写图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在改进k-means算法时,可以考虑以下几个方面的优化: 1. 初始化:k-means算法对初始中心点的选择非常敏感。一种常见的改进方法是使用k-means++算法来选择初始中心点。k-means++算法会根据数据点与已选择中心点的距离来选择下一个中心点,从而更好地代表数据分布。 2. 聚类中心的更新:在标准的k-means算法中,每次迭代都会计算所有数据点与所有聚类中心的距离,这样的计算成本较高。可以考虑使用更高效的距离计算方法,如KD树、球树等数据结构,以减少距离计算的次数。 3. 距离度量:标准的k-means算法使用欧氏距离作为度量指标,但对于某些数据集,欧氏距离可能不是最合适的度量方式。可以尝试其他距离度量方法,如曼哈顿距离、闵可夫斯基距离等,以更好地适应不同类型的数据。 4. 避免陷入局部最优解:k-means算法容易陷入局部最优解,可以通过增加随机性来提高算法执行的多样性。例如,在每次迭代中,可以随机选择一个数据点来更新聚类中心,以增加算法的鲁棒性。 5. 收敛条件:k-means算法是通过迭代优化来收敛的,可以设定收敛条件,如最大迭代次数或聚类中心的变化小于某个阈值时停止迭代。 这些是一些常见的改进方法,你可以根据实际情况选择合适的方法进行改进。在MATLAB中,可以使用自定义函数来实现这些改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值