kmeans实现

由于时间关系,这里仅仅贴上对应算法的matlab代码。至于详细的算法解释,由于我是用latex写的报告,因此暂时也无法移植到blog上。之后可能会贴出对应的pdf链接之类的。对于常见算法,我直接将实现贴出,而对于只有圈内人才比较清楚的代码,我会将对应的论文名字写出来,并且贴出相应代码。代码上均有详细注释,今后考上研后,将算法解释以及python实现的代码一并写出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
%% 变量解释
% centroids为质心
% cluster为数据对应的类标
% data为输入原数据
% k为簇的个数
function [centroids,cluster] = Kmeans(data, k)
%% 绘制数据集原始图形,在调用函数的那里写
% x = data(:,1); %二维数据
% y = data(:,2);
% s = scatter(x,y);
% title('Aggregation cluster原始图');
%% 随机初始化质心
[n,d] = size(data);
centroids = zeros(k,d);
minVal = min(data);
maxVal = max(data);
for i=1:k
centroids(i,:) = minVal + (maxVal - minVal)*rand();%rand()函数是返回[0,1]均匀分布随机数
end
%% 计算过程
cluster = zeros(n,1);
change = 1; % 判断类标是否有改变
while change == 1
change = 0;
% 公式1
for i=1:n
minDist = inf;
minIndex = 0;
for j=1:k
dist = (data(i,:)-centroids(j,:))*(data(i,:)-centroids(j,:))';
if dist < minDist
minDist = dist;
minIndex = j;
end
end
if cluster(i) ~= minIndex
change = 1;
cluster(i) = minIndex;
end
end
% 公式2
for j=1:k
sum = zeros(1,d);
r = 0; %当前类中元素个数
for i=1:n
if cluster(i) == j
sum = sum + data(i,:);
r = r + 1;
end
centroids(j,:) = sum/r;
end
end
%% 作图
hold on
for i=1:n
switch cluster(i)
case 1
plot(data(i,1), data(i,2), '.b');
case 2
plot(data(i,1), data(i,2), '.g');
case 3
plot(data(i,1), data(i,2), '.r');
case 4
plot(data(i,1), data(i,2), '.c');
case 5
plot(data(i,1), data(i,2), '.m');
case 6
plot(data(i,1), data(i,2), '.y');
case 7
plot(data(i,1), data(i,2), '.k');
otherwise
plot(data(i,1), data(i,2), '.k');
end
end
end