期望最大化算法(Expectation Maximum, EM)

本算法根据《数据挖掘概念与技术》第三版(韩家炜)中的期望最大化算法(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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值