matlab—— K均值聚类算法的步骤和实例
程序员文章站
2024-03-17 17:45:04
...
一、K均值聚类法分为如下几个步骤:
1. 初始化聚类中心
(1)凭经验选择。根据具体问题,凭经验从样本集中选出个 K 比较合适的样本作为初始聚类中心。
(2)用前 K 个样本作为初始聚类中心。
(3)将全部样本随机地分成 K 类,计算每类的样本均值,将样本均值作为初始聚类中心。
(4)密度法。以每个样本为球心,用某个正数为半径作一个球形邻域,落在邻域内的样本数为该点密度,选密度最大点为第一初 始聚类中心。在离开第一点规定距离范围外确定次大密度点,以避免初始聚类中心聚集。
(5)从 K-1个聚类划分的解中产生 K 个聚类划分的初始聚类中心。先把全部样本看作一个聚类,其聚类中心为样本的总均值;然后确定两聚类问题的聚类中心是一聚类问题的总均值和离它最远的点;以此类推。
2. 初始聚类
(1)按就近原则将样本归入各聚类中心所代表的类中。
(2)取一样本,将其归入与其最近的聚类中心的那一类中,重新计算样本均值,更新聚类中心。然后取下一样本,重复操作,直至所有样本归入相应类中。
3. 判断聚类是否合理
采用误差平方和准则函数判断聚类是否合理,不合理则修改分类。循环进行判断、修改直至达到算法终止条件。
二、K均值聚类法实例:
1.kMeansCluster.m (函数)
function y=kMeansCluster(m,k,isRand)
%Input:
% m- required, matrix data: objects in rows and attributes in columns
% k - optional, number of groups (default = 1)
% isRand - optional, if using random initialization isRand=1, otherwise input any number (default)
%it will assign the first k data as initial centroids
%Local Variables
% f - row number of data that belong to group i
% c - centroid coordinate size (1:k, 1:maxCol)
% g - current iteration group matrix size (1:maxRow)
% i - scalar iterator
% maxCol - scalar number of rows in the data matrix m = number of attributes
% maxRow - scalar number of columns in the data matrix m = number of objects
% temp - previous iteration group matrix size (1:maxRow)
% z - minimum value (not needed)
if nargin<3
isRand=0;
end
if nargin<2
k=1;
end
[maxRow, maxCol]=size(m);
if maxRow<=k
y=[m, 1:maxRow];
else
% initial value of centroid
if isRand
p = randperm(size(m,1)); % random initialization
for i=1:k
c(i,:)=m(p(i),:);
end
else
for i=1:k
c(i,:)=m(i,:); % sequential initialization
end
end
temp=zeros(maxRow,1); % initialize as zero vector
while 1
d=DistMatrix(m,c); % calculate objcets-centroid distances
[z,g]=min(d,[],2); % find group matrix g
if g==temp
break; % stop the iteration
else
temp=g; % copy group matrix to temporary variable
end
for i=1:k
f=find(g==i);
if f % only compute centroid if f is not empty
c(i,:)=mean(m(find(g==i),:),1);
end
end
end
y=[m,g]
end
2.DistMatrix.m (函数)
function d=DistMatrix(A,B)
[hA,wA]=size(A);
[hB,wB]=size(B);
if wA ~= wB
error(' second dimension of A and B must be the same');
end
for k=1:wA
C{k}= repmat(A(:,k),1,hB);
D{k}= repmat(B(:,k),1,hA);
end
S=zeros(hA,hB);
for k=1:wA
S=S+(C{k}-D{k}').^2;
end
d=sqrt(S);
基于(1)和(2)的matlab代码,请将
m = [ 1 1; 2 1; 4 3; 5 4]数据分为2类,即k=2;
创建test3.m脚本,脚本内容如下:
%test3
clc
clear
m = [ 1 1; 2 1; 4 3; 5 4]
k=2;
tic
y=kMeansCluster(m,k);
toc
在命令行中显示出出最终的聚类结果及算法运行时间
上一篇: 17章 容器深入研究