function result = FCMclust(data,param)
X=data.X;
f0=param.c;
if exist('param.m')==1, m = param.m;else m = 2;end;
if exist('param.e')==1, e = param.e;else e = 1e-4;end;
[N,n] = size(X);
[Nf0,nf0] = size(f0);
X1 = ones(N,1);
rand('state',0)
if max(Nf0,nf0) == 1, %判断是否只给出聚类数
c = f0;
mm = mean(X); %按列求各变量的均值
aa = max(abs(X - ones(N,1)*mm)); %按列求取各个变量偏离均值的最大差值的绝对值
v = 2*(ones(c,1)*aa).*(rand(c,n)-0.5) + ones(c,1)*mm;%随机生成初始聚类中心
for j = 1 : c,
xv = X - X1*v(j,:); %求所有数据偏离第j类中心的数值
d(:,j) = sum((xv*eye(n).*xv),2);%求出每个数据偏离第j类中心的距离的平方
end;
d = (d+1e-10).^(-1/(m-1));
f0 = (d ./ (sum(d,2)*ones(1,c)));
else %如果给出初始聚类中心矩阵
c = size(f0,2);
fm = f0.^m; sumf = sum(fm);
v = (fm'*X)./(sumf'*ones(1,n));
end;
f = zeros(N,c); %创建划分矩阵
iter = 0;
E=1;
%利用FCM算法进行划分
while E > e
iter = iter + 1;
f = f0;
fm = f.^m;
sumf = sum(fm);
v = (fm'*X)./(sumf'*ones(1,n));%计算聚类中心
for j = 1 : c,
xv = X - X1*v(j,:);
d(:,j) = sum((xv*eye(n).*xv),2);
end;
distout=sqrt(d);
J(iter) = sum(sum(f0.*d));
d = (d+1e-10).^(-1/(m-1));%更新隶属度函数阵
f0 = (d ./ (sum(d,2)*ones(1,c)));
E=max(max(f0-f))
end
fm = f.^m;
sumf = sum(fm);
%输出结果
result.data.f=f0;
result.data.d=distout;
result.cluster.v=v;
result.iter = iter;
result.cost = J;
评论0