% centers corresponding to each class.
% Version: 2013-02-08
% Authors: Laurent Sorber (Laurent.Sorber@cs.kuleuven.be)
L = [];
L1 = 0;
while length(unique(L)) ~= k
% The k-means++ initialization.
C = X(:,1+round(rand*(size(X,2)-1))); %size(X,2)是数据集合X的数据点的数目,C是中心点的集合
L = ones(1,size(X,2));
for i = 2:k
D = X-C(:,L); %-1
D = cumsum(sqrt(dot(D,D,1))); %将每个数据点与中心点的距离,依次累加
if D(end) == 0, C(:,i:k) = X(:,ones(1,k-i+1)); return; end
C(:,i) = X(:,find(rand < D/D(end),1)); %find的第二个参数表示返回的索引的数目
[~,L] = max(bsxfun(@minus,2*real(C'*X),dot(C,C,1).')); %碉堡了,这句,将每个数据点进行分类。
end
% The k-means algorithm.
while any(L ~= L1)
L1 = L;
for i = 1:k, l = L==i; C(:,i) = sum(X(:,l),2)/sum(l); end
[~,L] = max(bsxfun(@minus,2*real(C'*X),dot(C,C,1).'),[],1);
end
end
这个函数的实现有些特殊,参数X是数据集,但是是将每一列看做一个数据点,参数k是指定的聚类数。返回值L标记了每个数据点的所属分类,返回值C保存了最终形成的中心点(一列代表一个中心点)。测试一下:
>> x=[randn(3,2)*.4;randn(4,2)*.5+ones(4,1)*[4 4]]
x =
-0.0497 0.5669
0.5959 0.2686
0.5636 -0.4830
4.3586 4.3634
4.8151 3.8483
4.2444 4.1469
4.5173 3.6064
>> [L, C] = kmeanspp(x',2)
L =
2 2 2 1 1 1 1
C =
4.4839 0.3699
3.9913 0.1175
好了,现在开始一点点理解这个实现,顺便巩固一下matlab知识。
unique函数用来获取一个矩阵中的不同的值,示例:
>> unique([1 3 3 4 4 5])
ans =
1 3 4 5
>> unique([1 3 3 ; 4 4 5])
ans =
1
3
4










