function kmeansSample()
close all;
clear all;
disp('k-means 聚类示例开始!!');
data = GetRawData(); % 获取原始数据的函数
% 使用 k-means 进行聚类
nCluster = 2; % 聚类的数量
[result, means] = kmeansClustering(data, nCluster);
% 显示聚类结果
ShowClusteringResult(result, means, nCluster);
function [result, means] = kmeansClustering(data, nCluster)
% 使用 k-means 进行聚类的方法
% 初始聚类,随机分配类别
result = [data randi(nCluster, [length(data(:,1)), 1])];
while 1
means = [];
for i = 1:nCluster
% 计算每个聚类的均值
means = [means; mean(result(result(:,3)==i, 1:2))];
end
% 显示聚类结果
ShowClusteringResult(result, means, nCluster);
% 将每个数据重新聚类,按距离从近到远的顺序
nUpdate = 0; % 更新的聚类数量
for j = 1:length(result(:,1))
% 计算每个数据到每个均值的距离
d = [];
for k = 1:nCluster
d = [d norm(result(j,1:2)-means(k,:))];
end
[c, i] = min(d); % 计算距离最小的聚类的ID
if result(j,3) ~= i
result(j,3) = i; % 更新聚类
nUpdate = nUpdate + 1;
end
end
if nUpdate == 0
break; % 聚类不再改变时结束
end
pause;
end
function ShowClusteringResult(result, means, nCluster)
% 显示聚类结果的函数
hold off;
% 为图形创建颜色数据
cc = hsv(nCluster);
% 对每个聚类绘制数据
for i = 1:nCluster
data = result(result(:,3)==i, 1:2);
plot(data(:,1), data(:,2), '.', 'Color', cc(i,:)); hold all;
plot(means(i,1), means(i,2), 'x', 'Color', cc(i,:)); hold all;
end
axis equal;
grid on;
hold on;
function data = GetRawData()
% 伪数据的聚类中心和误差量
nSample = [0 0 2;
10 10 5];
ndata = 30; % 每个聚类的数据点数量
data = [];
for nc = 1:length(nSample(:,1))
for i = 1:ndata
xy = nSample(nc,1:2) + randn(1,2) * nSample(nc,3);
data = [data; xy];
end
end
data = sortrows(data, 2); % 对数据进行排序和混洗