简介
硬C-均值(HCM)是一种典型的无监督学习算法,主要将相似的样本自动的归为一类,事先确定好常数K,常数K意味着最终聚类的类别个数。通过计算每个样本到质心之间的相似度,将样本归到相似的类中。在分类过程中每次都要计算所有样本到质心的距离,在大规模数据上,该算法的收敛速度比较慢。
思想
硬聚类分析的目标如下所示:
式子中,dik表示第i类中的样本xk与第i类样本之间的失真度,经常用两个矢量间的距离来度量。J1 (U,P)表示了各类中样本与其典型样本的误差平方和。聚类准则就是寻找最佳组队(U,P),使得在满足约束uik∊Mhc条件下J1 (U,P)为最小。
算法步骤
1. 初始化常数K,随机选取K个初始值为质心。
2. 根据每个聚类对象的均值,计算对象与这些中心对象的距离;并根据最小距离重新对相应的对象进行划分;
3. 重新计算每个聚类的中心;
4. 计算标准化测度函数,当满足一定条件,如函数收敛,或者聚类中心不再变化,算法终止。
Matlab算法实现
clear all;close all;clc;
%creat sample
mu1=[0,2];%均值
sigma1=[.1 0;0 .1];%协方差
data1=mvnrnd(mu1,sigma1,50)
mu2=[2,3];
sigma1=[.1 0;0 .1];
data2=mvnrnd(mu2,sigma1,50)%
mu3=[1.5,2];
sigma1=[.1 0;0 .1];
data3=mvnrnd(mu3,sigma1,50);
plot(data1(:,1),data1(:,2),'b+')
hold on;
plot(data2(:,1),data2(:,2),'r+');
hold on;
plot(data3(:,1),data3(:,2),'g+');
data = [data1;data2;data3]
N=4; %聚类的数目
[m,n]=size(data);
pattern=zeros(m,n+1); %第n+1维为数据标签
center = zeros(N,n); %初始化聚类中心
pattern (:,1:n) = data(:,:);
%随机选取其中的N个数为聚类的中心
for x = 1:1:N
center(x,:) = data(randi(m,1),:) ;
end
while 1
distance = zeros(1,N);
num = zeros(1,N); %
new_center = zeros(N,n);
for x = 1:1:m
for y = 1:1:N
distance(y) = norm(data(x,:)-center(y,:));%
end
[i,temp] = min(distance);
pattern(x,n+1) = temp;
end
k=0;
%计算聚类中心并判断是否迭代结束
for y = 1:1:N
for x = 1:1:m
if pattern(x,n+1) == y
new_center(y,:) = new_center(y,:)+pattern(x,1:n);
num(y) = num(y)+1;
end
end
new_center(y,:) = new_center(y,:)/num(y);
if norm(new_center(y,:)-center(y,:))<0.1
k = k+1;
end
end
if k == N
break;
else
center = new_center;
end
end
[m, n]=size(pattern);
figure;
hold on;
for i=1:m
if pattern(i,n)==1
plot(pattern(i,1),pattern(i,2),'r*');
plot(center(1,1),center(1,2),'ko');
elseifpattern(i,n)==2
plot(pattern(i,1),pattern(i,2),'g*');
plot(center(2,1),center(2,2),'ko');
elseif pattern(i,n)==3
plot(pattern(i,1),pattern(i,2),'b*');
plot(center(3,1),center(3,2),'ko');
elseif pattern(i,n)==4
plot(pattern(i,1),pattern(i,2),'y*');
plot(center(4,1),center(4,2),'ko');
else
plot(pattern(i,1),pattern(i,2),'m*');
plot(center(4,1),center(4,2),'ko');
end
end
grid on;
原始数据:
分为四类: