GMM-实现聚类的代码示例


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-实现聚类的代码示例的更多相关文章
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
- Java8-Function使用及Groovy闭包的代码示例
导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...
- [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例
懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...
- SELECT控件操作的JS代码示例
SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
- C#与数据库访问技术总结(十五)之 DataAdapter对象代码示例
DataAdapter对象代码示例 下面的代码将说明如何利用DataAdapter对象填充DataSet对象. private static string strConnect=" data ...
- C#与数据库访问技术总结(六)之Command对象创建SQl语句代码示例
Command对象创建SQl语句代码示例 说明:前面介绍了 Command 对象的方法和一些属性,回顾一下 Command对象主要用来执行SQL语句.利用Command对象,可以查询数据和修改数据. ...
- 领域驱动开发推荐代码示例 — Microsoft NLayerApp
简介: Microsoft NLayerApp是由微软西班牙团队出品的基于.NET 4.0的“面向领域N层分布式架构”代码示例,在codeplex上的地址是:http://microsoftnlaye ...
随机推荐
- 一起SQL引发OOM的解决思路与过程(转载)
在TOMCAT WEB程序的运行过程中,突然触发了内存溢出错误,检查Tomcat的localhost日志,找到如下信息: java.lang.OutOfMemoryError: Java heap s ...
- SNFAutoupdater通用自动升级组件V2.0
1.组件介绍 C/S构的特点是能充分发挥客户端的处理能力,很多工作可以由客户端处理后再提交给服务器,对应的优点就是客户端响应速度快模式客户端以其强大的功能,丰富的表现力受到相当大部分用户的青睐,但是客 ...
- 每日英语:Upgrade Your Life: How to speed up your PC (or Mac)
Is your desktop or laptop computer starting to feel a little poky? Even after just a few months of u ...
- Forward+ Shading架构
Forward+ = Tile based Light Culling + Tile based Forward Rendering 整体渲染架构分为如下3大步骤: 1.PrePass将场景的min ...
- 【Linux高级驱动】网卡驱动分析
两个重要的结构体简单介绍 *sk_buff 如果把网络传输看成是运送货物的话,那么sk_buff就是这个“货物”了,所有经手这个货物的人都要干点什么事儿,要么加个包装,要么印个戳儿等等.收货的时候就要 ...
- LeetCode: Find Peak Element 解题报告
Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...
- Excel中substitute替换函数的使用方法
问题现象:在Excel中,对几千条数据按照时间顺序排序,但总是有部分数据不参与排序,单纯用单元格调整不起任何作用. 解决办法: 数据排列问题最重要的是数据格式的一致性.解决这个问题,建议按如下步骤: ...
- iOS系统及客户端软件测试的基础介绍
iOS系统及客户端软件测试的基础介绍 iOS现在的最新版本iOS5是10月12号推出,当前版本是4.3.5 先是硬件部分,采用iOS系统的是iPad,iPhone,iTouch这三种设备,其中iPho ...
- PHP最全笔记(三)(值得收藏,不时翻看一下)
/* [数组函数] *///统计计算count 计算数组中的单元数目或对象中的属性个数array_count_values 统计数组中所有的值出现的次数array_product ...
- Java8学习笔记(七)--Collectors
本系列文章翻译自@shekhargulati的java8-the-missing-tutorial 你已经学习了Stream API能够让你以声明式的方式帮助你处理集合.我们看到collect是一个将 ...