GMM算法的matlab程序

在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度。

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

1.采用iris数据库

iris_data.txt

5.1    3.5    1.4    0.2
4.9 1.4 0.2
4.7 3.2 1.3 0.2
4.6 3.1 1.5 0.2
3.6 1.4 0.2
5.4 3.9 1.7 0.4
4.6 3.4 1.4 0.3
3.4 1.5 0.2
4.4 2.9 1.4 0.2
4.9 3.1 1.5 0.1
5.4 3.7 1.5 0.2
4.8 3.4 1.6 0.2
4.8 1.4 0.1
4.3 1.1 0.1
5.8 1.2 0.2
5.7 4.4 1.5 0.4
5.4 3.9 1.3 0.4
5.1 3.5 1.4 0.3
5.7 3.8 1.7 0.3
5.1 3.8 1.5 0.3
5.4 3.4 1.7 0.2
5.1 3.7 1.5 0.4
4.6 3.6 0.2
5.1 3.3 1.7 0.5
4.8 3.4 1.9 0.2
1.6 0.2
3.4 1.6 0.4
5.2 3.5 1.5 0.2
5.2 3.4 1.4 0.2
4.7 3.2 1.6 0.2
4.8 3.1 1.6 0.2
5.4 3.4 1.5 0.4
5.2 4.1 1.5 0.1
5.5 4.2 1.4 0.2
4.9 3.1 1.5 0.2
3.2 1.2 0.2
5.5 3.5 1.3 0.2
4.9 3.6 1.4 0.1
4.4 1.3 0.2
5.1 3.4 1.5 0.2
3.5 1.3 0.3
4.5 2.3 1.3 0.3
4.4 3.2 1.3 0.2
3.5 1.6 0.6
5.1 3.8 1.9 0.4
4.8 1.4 0.3
5.1 3.8 1.6 0.2
4.6 3.2 1.4 0.2
5.3 3.7 1.5 0.2
3.3 1.4 0.2
3.2 4.7 1.4
6.4 3.2 4.5 1.5
6.9 3.1 4.9 1.5
5.5 2.3 1.3
6.5 2.8 4.6 1.5
5.7 2.8 4.5 1.3
6.3 3.3 4.7 1.6
4.9 2.4 3.3
6.6 2.9 4.6 1.3
5.2 2.7 3.9 1.4
3.5
5.9 4.2 1.5
2.2
6.1 2.9 4.7 1.4
5.6 2.9 3.6 1.3
6.7 3.1 4.4 1.4
5.6 4.5 1.5
5.8 2.7 4.1
6.2 2.2 4.5 1.5
5.6 2.5 3.9 1.1
5.9 3.2 4.8 1.8
6.1 2.8 1.3
6.3 2.5 4.9 1.5
6.1 2.8 4.7 1.2
6.4 2.9 4.3 1.3
6.6 4.4 1.4
6.8 2.8 4.8 1.4
6.7 1.7
2.9 4.5 1.5
5.7 2.6 3.5
5.5 2.4 3.8 1.1
5.5 2.4 3.7
5.8 2.7 3.9 1.2
2.7 5.1 1.6
5.4 4.5 1.5
3.4 4.5 1.6
6.7 3.1 4.7 1.5
6.3 2.3 4.4 1.3
5.6 4.1 1.3
5.5 2.5 1.3
5.5 2.6 4.4 1.2
6.1 4.6 1.4
5.8 2.6 1.2
2.3 3.3
5.6 2.7 4.2 1.3
5.7 4.2 1.2
5.7 2.9 4.2 1.3
6.2 2.9 4.3 1.3
5.1 2.5 1.1
5.7 2.8 4.1 1.3
6.3 3.3 2.5
5.8 2.7 5.1 1.9
7.1 5.9 2.1
6.3 2.9 5.6 1.8
6.5 5.8 2.2
7.6 6.6 2.1
4.9 2.5 4.5 1.7
7.3 2.9 6.3 1.8
6.7 2.5 5.8 1.8
7.2 3.6 6.1 2.5
6.5 3.2 5.1
6.4 2.7 5.3 1.9
6.8 5.5 2.1
5.7 2.5
5.8 2.8 5.1 2.4
6.4 3.2 5.3 2.3
6.5 5.5 1.8
7.7 3.8 6.7 2.2
7.7 2.6 6.9 2.3
2.2 1.5
6.9 3.2 5.7 2.3
5.6 2.8 4.9
7.7 2.8 6.7
6.3 2.7 4.9 1.8
6.7 3.3 5.7 2.1
7.2 3.2 1.8
6.2 2.8 4.8 1.8
6.1 4.9 1.8
6.4 2.8 5.6 2.1
7.2 5.8 1.6
7.4 2.8 6.1 1.9
7.9 3.8 6.4
6.4 2.8 5.6 2.2
6.3 2.8 5.1 1.5
6.1 2.6 5.6 1.4
7.7 6.1 2.3
6.3 3.4 5.6 2.4
6.4 3.1 5.5 1.8
4.8 1.8
6.9 3.1 5.4 2.1
6.7 3.1 5.6 2.4
6.9 3.1 5.1 2.3
5.8 2.7 5.1 1.9
6.8 3.2 5.9 2.3
6.7 3.3 5.7 2.5
6.7 5.2 2.3
6.3 2.5 1.9
6.5 5.2
6.2 3.4 5.4 2.3
5.9 5.1 1.8

iris_id.txt


2.matlab程序

My_GMM.m

function label_2=My_GMM(K)
%输入K:聚类数,K个单高斯模型
%输出label_2:聚的类,para_pi:单高斯权重,para_miu_new:高斯分布参数μ,para_sigma:高斯分布参数sigma
format long
eps=1e-15; %定义迭代终止条件的eps
data=dlmread('E:\www.cnblogs.comkailugaji\data\iris\iris_data.txt');
%----------------------------------------------------------------------------------------------------
%对data做最大-最小归一化处理
[data_num,~]=size(data);
X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));
[X_num,X_dim]=size(X);
para_sigma=zeros(X_dim,X_dim,K);
%----------------------------------------------------------------------------------------------------
%随机初始化K个聚类中心
rand_array=randperm(X_num); %产生1~X_num之间整数的随机排列
center=X(rand_array(1:K),:); %随机排列取前K个数,在X矩阵中取这K行作为初始聚类中心
%根据上述聚类中心初始化参数
para_miu_new=center; %初始化参数miu
para_pi=ones(1,K)./K; %K类单高斯模型的权重
for k=1:K
para_sigma(:,:,k)=eye(X_dim); %K类单高斯模型的协方差矩阵,初始化为单位阵
end
%欧氏距离,计算(X-para_miu)^2=X^2+para_miu^2-2*X*para_miu',矩阵大小为X_num*K
distant=repmat(sum(X.*X,2),1,K)+repmat(sum(para_miu_new.*para_miu_new,2)',X_num,1)-2*X*para_miu_new';
%返回distant每行最小值所在的下标
[~,label_1]=min(distant,[],2);
for k=1:K
X_k=X(label_1==k,:); %X_k是一个(X_num/K, X_dim)的矩阵,把X矩阵分为K类
para_pi(k)=size(X_k,1)/X_num; %将(每一类数据的个数/X_num)作为para_pi的初始值
para_sigma(:,:,k)=cov(X_k); %para_sigma是一个(X_dim, X_dim)的矩阵,cov(矩阵)求的是每一列之间的协方差
end
%----------------------------------------------------------------------------------------------------
%EM算法
N_pdf=zeros(X_num,K);
while true
para_miu=para_miu_new;
%----------------------------------------------------------------------------------------------------
%E步
%单高斯分布的概率密度函数N_pdf
for k=1:K
X_miu=X-repmat(para_miu(k,:),X_num,1); %X-miu,(X_num, X_dim)的矩阵
sigma_inv=inv(para_sigma(:,:,k)); %sigma的逆矩阵,(X_dim, X_dim)的矩阵//很可能出现奇异矩阵
exp_up=sum((X_miu*sigma_inv).*X_miu,2); %指数的幂,(X-miu)'*sigma^(-1)*(X-miu)
coefficient=(2*pi)^(-X_dim/2)*sqrt(det(sigma_inv)); %高斯分布的概率密度函数e左边的系数
N_pdf(:,k)=coefficient*exp(-0.5*exp_up);
end
% N_pdf=guass_pdf(X,K,para_miu,para_sigma);
responsivity=N_pdf.*repmat(para_pi,X_num,1); %响应度responsivity的分子,(X_num,K)的矩阵
responsivity=responsivity./repmat(sum(responsivity,2),1,K); %responsivity:在当前模型下第n个观测数据来自第k个分模型的概率,即分模型k对观测数据Xn的响应度
%----------------------------------------------------------------------------------------------------
%M步
R_k=sum(responsivity,1); %(1,K)的矩阵,把responsivity每一列求和
%更新参数miu
para_miu_new=diag(1./R_k)*responsivity'*X;
%更新k个参数sigma
for i=1:K
X_miu=X-repmat(para_miu_new(i,:),X_num,1);
para_sigma(:,:,i)=(X_miu'*(diag(responsivity(:,i))*X_miu))/R_k(i);
end
%更新参数pi
para_pi=R_k/sum(R_k);
%----------------------------------------------------------------------------------------------------
%迭代终止条件
if norm(para_miu_new-para_miu)<=eps
break;
end
end
%----------------------------------------------------------------------------------------------------
%聚类
[~,label_2]=max(responsivity,[],2);

succeed.m

function accuracy=succeed(K,id)
%输入K:聚的类,id:训练后的聚类结果,N*1的矩阵
N=size(id,1); %样本个数
p=perms(1:K); %全排列矩阵
p_col=size(p,1); %全排列的行数
new_label=zeros(N,p_col); %聚类结果的所有可能取值,N*p_col
num=zeros(1,p_col); %与真实聚类结果一样的个数
real_label=dlmread('E:\www.cnblogs.comkailugaji\data\iris\iris_id.txt');
%将训练结果全排列为N*p_col的矩阵,每一列为一种可能性
for i=1:N
for j=1:p_col
for k=1:K
if id(i)==k
new_label(i,j)=p(j,k)-1;
end
end
end
end
%与真实结果比对,计算精确度
for j=1:p_col
for i=1:N
if new_label(i,j)==real_label(i)
num(j)=num(j)+1;
end
end
end
accuracy=max(num)/N;

3.结果

>> label_1=My_GMM(3);
>> accuracy=succeed(3,label_1) accuracy = 0.966666666666667

4.注意

GMM算法我只进行了一次计算准确度,因为有可能会出现奇异矩阵的情况,导致算法出错,现在我还没有想出如何解决奇异矩阵的问题,因此只给出了一次循环。望指正。

补充:GMM的Python代码:upload/GMM.py at master · wl-lei/upload · GitHub

 

GMM算法的matlab程序的更多相关文章

  1. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  2. mean shift聚类算法的MATLAB程序

    mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...

  3. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  4. KFCM算法的matlab程序

    KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...

  5. FCM算法的matlab程序2

    FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...

  6. FCM算法的matlab程序

    FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  7. K-means算法的matlab程序

    K-means算法的matlab程序 在“K-means算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 ...

  8. FCM算法的matlab程序(初步)

    FCM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648430.html文章中已经介绍了FCM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  9. K-means算法的matlab程序(初步)

    K-means算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648369.html 文章中已经介绍了K-means算法,现在用matlab程序实现 ...

随机推荐

  1. css实现超出文本省略号的两个方法

    方法一:适用于定宽高; <!DOCTYPE html> <html> <head lang="en"> <meta charset=&qu ...

  2. JVM基础系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...

  3. Python之高级特性

    一.切片 L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]Pyt ...

  4. log4cplus使用(三)-日志重定向

    本文讲述的是log4cplus日志输出到qt widget,封装了serverSocket.     log4cplus支持用户自定义输出设备,只需要继承自Appender,或者Appender子类, ...

  5. asp.net core 系列 14 错误处理

    一.概述 本文介绍处理 ASP.NET Core 应用中常见错误的一些方法.主要是关于:开发环境异常页:非开发环境配置自定义异常处理页:配置状态代码页(没有正文响应,http状态400~599的). ...

  6. SpringBoot入门教程(十四)导出Excel

    用JavaPOI导出Excel时,我们会考虑到Excel版本及数据量的问题.针对不同的Excel版本,要采用不同的工具类.HSSFWorkbook:是操作Excel2003以前(包括2003)的版本, ...

  7. 翻译 Asp.Net Core 2.2.0-preview1已经发布

    Asp.Net Core 2.2.0-preview1已经发布 原文地址 ASP.NET Core 2.2.0-preview1 now available 今天我们很高兴地宣布,现在可以试用ASP. ...

  8. C#线程安全使用(四)

    这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationTokenSource,C ...

  9. 如何定制Linux外围文件系统?

    本文由云+社区发表 作者:我是乖宝宝哦 一般来说,我们所说的Linux系统指的是各种基于Linux Kernel和GNU Project的操作系统发行版.为了掌握Linux操作系统的使用,了解 Lin ...

  10. c#中的Unity容器

    DIP是依赖倒置原则:一种软件架构设计的原则(抽象概念).依赖于抽象不依赖于细节 IOC即为控制反转(Inversion of Control):传统开发,上端依赖(调用/指定)下端对象,会有依赖,把 ...