Matlab 代码:

 % GMM code

 function varargout = gmm(X, K_or_centroids)

     % input X:N-by-D data matrix
% input K_or_centroids: K-by-D centroids % 阈值
threshold = 1e-15;
% 读取数据维度
[N, D] = size(X);
% 判断输入质心是否为标量
if isscalar(K_or_centroids)
% 是标量,随机选取K个质心
K = K_or_centroids;
rnpm = randperm(N); % 打乱的N个序列
centroids = X(rnpm(:K), :);
else % 矩阵,给出每一类的初始化
K = size(K_or_centroids, );
centroids = K_or_centroids;
end % 定义模型初值
[pMiu pPi pSigma] = init_params(); Lprev = -inf;
while true
% E-step,估算出概率值
% Px: N-by-K
Px = calc_prob(); % pGamma新的值,样本点所占的权重
% pPi:-by-K pGamma:N-by-K
pGamma = Px ./ repmat(pPi, N, );
% 对pGamma的每一行进行求和,sum(x,):每一行求和
pGamma = pGamma ./ repmat(sum(pGamma, ) , , K); % M-step
% 每一个组件给予新的值
Nk = sum(pGamma,);
pMiu = diag(./Nk)*pGamma'*X;
pPi = Nk/N;
for kk = 1:K
Xshift = X - repmat(pMiu(kk, :) ,N, 1);
pSigma(:,:,kk) = (Xshift'*(diag(pGamma(:,kk))*Xshift)) / Nk(kk);
end % 观察收敛,convergence
L = sum(log(Px*pPi'));
if L-Lprev < threshold
break;
end
Lprev = L; end % 输出参数判定
if nargout == 1
varargout = {Px};
else
model = [];
model.Miu = pMiu;
model.Sigma = pSigma;
model.Pi = pPi;
varargout = {Px, model};
end function [pMiu pPi pSigma] = init_params()
pMiu = centroids; % 均值,K类的中心
pPi = zeros(1, K); % 概率
pSigma = zeros(D, D, K); % 协方差,每一个都是D-by-D % (X - pMiu)^2 = X^2 + pMiu^2 - 2*X*pMiu
distmat = repmat(sum(X.*X, 2), 1, K) + repmat(sum(pMiu.*pMiu, 2)', N, ) - *X*pMiu';
[dummy labels] = min(distmat, [], 2); % 找出每一行的最小值,并标出列的位置 for k=1:K %初始化参数
Xk = X(labels == k, :);
pPi(k) = size(Xk, 1)/N;
pSigma(:, :, k) = cov(Xk);
end
end % 计算概率值
function Px = calc_prob()
Px = zeros(N,K);
for k=1:K
Xshift = X - repmat(pMiu(k,:),N,1);
inv_pSigma = inv(pSigma(:,:,k)+diag(repmat(threshold, 1, size(pSigma(:,:,k),1))));
tmp = sum((Xshift*inv_pSigma).*Xshift, 2);
coef = (2*pi)^(-D/2)*sqrt(det(inv_pSigma));
Px(:,k) = coef * exp(-1/2*tmp);
end
end end

测试主程序:

 % 测试代码
clear all
clc data = load('testSet.txt');
[PX, Model] = gmm(data, );
[~,index] = max(PX'); % 每一列的最大值 cent = Model.Miu;
figure
I = find(index == );
scatter(data(I,), data(I,))
hold on
scatter(cent(,), cent(,) ,, 'filled');
hold on
I = find(index == );
scatter(data(I,),data(I,))
hold on
scatter(cent(,),cent(,),,'filled')
hold on
I = find(index == );
scatter(data(I,),data(I,))
hold on
scatter(cent(,),cent(,),,'filled')
hold on
I = find(index == );
scatter(data(I,),data(I,))
hold on
scatter(cent(,),cent(,),,'filled')

示意图:

参考自:http://www.voidcn.com/blog/llp1992/article/p-2308490.html

GMM-实现聚类的代码示例的更多相关文章

  1. 高级渲染技巧和代码示例 GPU Pro 7

    下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...

  2. Java8-Function使用及Groovy闭包的代码示例

    导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...

  3. [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例

    懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...

  4. SELECT控件操作的JS代码示例

    SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...

  5. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  6. Python实现各种排序算法的代码示例总结

    Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...

  7. C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例

    DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...

  8. C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例

    Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...

  9. 领域驱动开发推荐代码示例 — Microsoft NLayerApp

    简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlaye ...

随机推荐

  1. JS中 HTMLEncode和HTMLDecode

    <!--js伪编码解码--><script language="javascript" type="text/javascript">f ...

  2. 11G新特性 -- Expression Statistics

    当在查询中使用了function,返回值会受到影响. 比如: select count(*) from customers where lower(cust_state_province)='ca'; ...

  3. Asp.Net MVC EF查询部分字段

    例如新闻表中有几十个字段,而我们只需要显示标题和时间2个字段 如果是再Controller中查询使用的话比较简单 public string ceshi() { dbEntities db = new ...

  4. MXNET:深度学习计算-模型参数

    我们将深入讲解模型参数的访问和初始化,以及如何在多个层之间共享同一份参数. 之前我们一直在使用默认的初始函数,net.initialize(). from mxnet import init, nd ...

  5. CLOS网络架构与FATTREE胖树拓扑

    FatTree拓扑结构是由MIT的Fares等人在改进传统树形结构性能的基础上提出的,属于switch-only型拓扑. 整个拓扑网络分为三个层次:自上而下分别为边缘层(edge).汇聚层(aggre ...

  6. Python_建造者模式

    #!/usr/bin/python # -*- coding:utf-8 -*- #建造者基类 class PersonBuilder(): def BuildHead(self): pass def ...

  7. QT 窗口拖拽移动实现

    我们知道,要实现窗口移动可以直接鼠标点住窗口的标题栏实现拖拽移动,这是窗口默认的行为,在QT中的事件响应函数为moveEvent. 但是现实中经常需要鼠标点住窗口客户区域实现窗口的拖拽移动,代码实现如 ...

  8. [Bayes] Improve HMM step by step

    以下是HMM,当emission probability变为高斯时,只需改变其中相关部分即可,也就是下图最后一行. 如下可见,在优化过程中套路没有太大的影响,但变为高斯后表达变得更精确了呢. 当然,这 ...

  9. [Tensorflow] Cookbook - Object Classification based on CIFAR-10

    Convolutional Neural Networks (CNNs) are responsible for the major breakthroughs in image recognitio ...

  10. 采用镜像的方法安装python第三方库

    转自:https://blog.csdn.net/s740556472/article/details/68557330 pip install --index https://pypi.mirror ...