本算法根据《数据挖掘概念与技术》第三版(韩家炜)中的期望最大化算法(Expectation Maximum, EM)的步骤来实现的,EM算法属于基于概率模型的聚类的一种,它的主要步骤分为两步:
期望步:给定当前的簇中心,每个对象都被指派到簇中心离该对象最近的簇。
:给定当前的簇中心,每个对象都被指派到簇中心离该对象最近的簇。
最大化步:给定簇指派,对于每个簇,算法调整其中心,使得指派到该簇的对象到该新中心的距离之和最小化。
:给定簇指派,对于每个簇,算法调整其中心,使得指派到该簇的对象到该新中心的距离之和最小
主函数如下:
%%%% 采用期望最大化进行模糊聚类 ,EM
clc;
clear;
%加载文件
fileID = fopen('D:\matlabFile\EM\EM.txt');
DS=textscan(fileID,'%f %f');
fclose(fileID);
%将数据转换为矩阵格式
Dataset=cat(2,DS{1},DS{2});
%选择簇中心的点数量
p=2;
if p<size(Dataset,1)
% 任意选择聚类中心点
c_id=randperm(size(Dataset,1));
c_id=c_id(1:p);
% c_id=[1 2];
% 初始化p的中心点
centers=Dataset(c_id',:);
% 限定最小值
err=0.005;
flag=1;
d1=0;
%簇中心收敛计算
while flag
% 计算隶属度矩阵
M=MembershipDegree(centers,Dataset);
% 计算新的中心点
centers_new=Maximization(M,Dataset);
d2=0;
for i=1:size(centers_new,1)
d2=d2+sqrt((centers_new(i,1)-centers(i,1))^2+(centers_new(i,2)-centers(i,2))^2);
end
if abs(d1-d2)<err
flag=0;
else
d1=d2;
centers=centers_new;
end
end
end
%显示簇中心
centers
MembershipDegree函数如下:
function result=MembershipDegree(centers,points)
M=zeros(1,size(centers,1));
for i=1:size(points,1)
point=points(i,:);
flag=0;
for j=1:size(centers,1)
center=centers(j,:);
if isequal(point,center)
flag=1;
break;
end
end
mm=[];
if flag
mm=zeros(1,size(centers,1));
mm(1,j)=1;
else
for j=1:size(centers,1)
center=centers(j,:);
mm(1,j)=(center(1,1)-point(1,1))^2+(center(1,2)-point(1,2))^2;
end
mm=mm/sum(mm);
end
M(i,:)=mm;
end
result=M;
end
Maximization函数如下:
function result=Maximization(M,points)
centers=zeros(1,2);
for i=1:size(M,2)
a=sum(M(:,i).^2);
b=M(:,i).^2;
x=sum(b.*points(:,1))/a;
y=sum(b.*points(:,2))/a;
centers(i,:)=[x,y];
end
result=centers;
end
测试数据如下,请保存为EM.txt
3 3
4 10
9 6
14 8
18 11
21 7