k均值聚类聚类数_简述K均值聚类算法的一般过程

(1) 2024-10-06 09:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
k均值聚类聚类数_简述K均值聚类算法的一般过程,希望能够帮助你!!!。

1、聚类

聚类就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类,使得同一个类内的数据对象的相似性尽可能大,同时使不在同一个类中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同类的数据尽量分离。

2、聚类和分类的区别

聚类算法是给一堆原始数据,然后通过算法将其中具有相似特征的数据聚为一类。

分类算法是给一个数据,然后判断这个数据属于已分好的类中的具体哪一类。

3、K均值聚类

给定一个数据点集合和需要的聚类数目k(由用户指定),k均值算法根据某个距离函数反复把数据分入k个聚类中。

K-means聚类算法步骤:

  1. 初始化。输入数据点集合X,并指定聚类类数N,在X中随机选取N个对象作为初始聚类中心;

  2. 设定迭代终止条件。比如最大循环次数或者聚类中心收敛误差容限;

  3. 更新样本属于哪个类。根据相似度准则将数据对象分配到最接近的类;

  4. 更新类的中心位置。以每一类的平均向量作为新的聚类中心;

反复执行第3步和第4步直至满足终止条件。

K-means聚类算法优点:

  • 算法简单、快速;

  • 对大数据集效率较高。

K-means聚类算法缺点:

  • 需事先指定聚类个数K;

  • 初始聚类中心的选取对聚类结果有较大影响。

4、Matlab示例

4.1、main.m

% K_means cluster测试

clc;

clear;

%% 1 random sample

%随机生成三组数据

a = rand(30,2) * 2;

b = rand(30,2) * 5;

c = rand(30,2) * 10;

figure(1);

subplot(2,2,1);

plot(a(:,1), a(:,2), 'r.'); hold on

plot(b(:,1), b(:,2), 'g*');

plot(c(:,1), c(:,2), 'bx'); hold off

grid on;

title('raw data');

%% 2 K-means cluster

X = [a; b; c]; %需要聚类的数据点

xstart = [2 2; 5 5; 8 8]; %初始聚类中心

subplot(2,2,2);

plot(X(:,1), X(:,2), 'kx'); hold on

plot(xstart(:,1), xstart(:,2), 'r*'); hold off

grid on;

title('raw data center');

[Idx, Center] = K_means(X, xstart);

subplot(2,2,4);

plot(X(Idx==1,1), X(Idx==1,2), 'kx'); hold on

plot(X(Idx==2,1), X(Idx==2,2), 'gx');

plot(X(Idx==3,1), X(Idx==3,2), 'bx');

plot(Center(:,1), Center(:,2), 'r*'); hold off

grid on;

title('K-means cluster result');

disp('xstart = ');

disp(xstart);

disp('Center = ');

disp(Center);

4.2、K_means.m

function [Idx, Center] = K_means(X, xstart)

% K-means聚类

% Idx是数据点属于哪个类的标记,Center是每个类的中心位置

% X是全部二维数据点,xstart是类的初始中心位置

len = length(X); %X中的数据点个数

Idx = zeros(len, 1); %每个数据点的Id,即属于哪个类

C1 = xstart(1,:); %第1类的中心位置

C2 = xstart(2,:); %第2类的中心位置

C3 = xstart(3,:); %第3类的中心位置

for i_for = 1:100

%为避免循环运行时间过长,通常设置一个循环次数

%或相邻两次聚类中心位置调整幅度小于某阈值则停止

%更新数据点属于哪个类

for i = 1:len

x_temp = X(i,:); %提取出单个数据点

d1 = norm(x_temp - C1); %与第1个类的距离

d2 = norm(x_temp - C2); %与第2个类的距离

d3 = norm(x_temp - C3); %与第3个类的距离

d = [d1;d2;d3];

[~, id] = min(d); %离哪个类最近则属于那个类

Idx(i) = id;

end

%更新类的中心位置

L1 = X(Idx == 1,:); %属于第1类的数据点

L2 = X(Idx == 2,:); %属于第2类的数据点

L3 = X(Idx == 3,:); %属于第3类的数据点

C1 = mean(L1); %更新第1类的中心位置

C2 = mean(L2); %更新第2类的中心位置

C3 = mean(L3); %更新第3类的中心位置

end

Center = [C1; C2; C3]; %类的中心位置

5、程序运行结果

这里展示三组不同数据的K均值聚类结果。

k均值聚类聚类数_简述K均值聚类算法的一般过程_https://bianchenghao6.com/blog__第1张

k均值聚类聚类数_简述K均值聚类算法的一般过程_https://bianchenghao6.com/blog__第2张

k均值聚类聚类数_简述K均值聚类算法的一般过程_https://bianchenghao6.com/blog__第3张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复