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 ...
随机推荐
- 检查死锁与Locked ownable synchronizers(转载)
通过jstack可快速检查线程的死锁信息,用法如下: # 获取JVM ID(JAVA 进程ID),通过参数lv可以获取更详细的JAVA方法调用信息 jps -lv # 得到JVM ID后,执行jsta ...
- C++11 正则表达式——基础知识介绍
C++11开始支持正则表达式,使得处理文本更加简洁方便.C++11 支持六种正则表达式语法:ECMAScript, basic(POSIX Basic Regular Expressions), ex ...
- maven项目中利用jmeter-maven-plugin插件直接执行jmeter jmx脚本
jmeter脚本需要执行脚本,先得下载jmeter并解压jmeter.如想在maven项目中通过mvn install 直接执行jmx文件,这样就能在测试服务器上通过一个命令就能执行下性能测试了,给自 ...
- stale element reference: element is not attached to the page document 异常
在执行脚本时,有时候引用一些元素对象会抛出如下异常 org.openqa.selenium.StaleElementReferenceException: stale element referenc ...
- Linux好用的工具命令 - nl/du
nl 添加行号后打印输出文本内容,以下例子演示了cat 和nl 输出nlDemo文档的区别. [root@ptarmiganantelope:~]# cat nlDemo root:x:0:0:roo ...
- 【Linux高级驱动】I2C驱动框架分析
1.i2c-dev.c(i2c设备驱动组件层) 功能:1)给用户提供接口 i2c_dev_init //入口函数 /*申请主设备号*/ register_chrdev(I2C_MAJOR(), &q ...
- 我在tmux中最不可少的配置: 用鼠标切换窗口/调节分屏大小
前两天在给另外一个团队帮忙时,看他们在Rails日志.代码文件.git文件系统里面来回穿梭,觉得他们太累了,于是就介绍了 tmux 给他们用.但只讲了一点基本的开窗口.分屏,没给讲太多技巧,因为一下子 ...
- 阿里云 FTP 无法读取目录问题
安全组除了添加制定 FTP端口外 需要加入再添加1024/65535端口 放行策略,ftp被动模式需要随机开一个此范围端口进行传输 添加安全组规则参考文档:https://help.aliyun.co ...
- java-信息安全(十)-数字签名算法DSA
概述 信息安全基本概念: DSA算法(Digital Signature Algorithm,数据签名算法) DSA Digital Signature Algorithm (DSA)是Schnorr ...
- Spark学习笔记——RDD编程
1.RDD——弹性分布式数据集(Resilient Distributed Dataset) RDD是一个分布式的元素集合,在Spark中,对数据的操作就是创建RDD.转换已有的RDD和调用RDD操作 ...