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 ...
随机推荐
- linux达人养成计划学习笔记(七)—— 用户登录查看命令
一.查看用户登录信息 1.命令格式 w 2.命令结果 第一行信息是:系统当前时间 系统运行总时间 登录用户数量 一分钟/五分钟/十分钟的系统负载(越大越差) 二.who命令 1 ...
- dos命令dir查找文件的用法及实例
功能:显示目录命令 格式:dir[盘符][路径][/W][/P][/L][/O:排序][/A:属性][/S] 参数介绍: /W -- 以宽行排列方式显示. /P -- 每显示满一屏停顿一下,待用户 ...
- ios NSURLSession后台传输
http://www.appcoda.com/background-transfer-service-ios7/ http://www.raywenderlich.com/51127/nsurlses ...
- Pycharm中.py文件头信息配置
在社区版的Pycharm开发软件中设置每次新建.py文件都会自动生成如下信息 #! /usr/bin/env python # -*- coding:utf-8 -*- # Author: Tdcqm ...
- 【Android】Android开源项目精选(一)
ListView ListView下拉刷新:https://github.com/johannilsson/android-pulltorefresh AndroidPullToRefresh:htt ...
- 大数据基础篇----jvm的知识点归纳-5个区和垃圾回收机制
一直对jvm看了又忘,忘了又看的.今天做一个笔记整理存放在这里. 我们先看一下JVM的内存模型图: 上面有5个区,这5个区干嘛用的呢? 我们想象一个场景: 我们有一个class文件,里面有很多的类的定 ...
- 服务器部署多个tomcat(Address already in use: JVM_Bind)
一.修改startup.bat **多个Tomcat同时运行时.不要设置 catalina_home catalina_base classes 环境变量, 修改setclasspath.bat (| ...
- vmware-hostd.exe 占用443端口导致Apache无法正常启动?
问题: [Apache] Problem detected!16:23:19 [Apache] Port 443 in use by ""D:\vmware\VMware W ...
- Unity3D中Layers和LayerMask解析
Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0—31).在Unity中可编辑的Layer如下图所示: 在Unity中每个GameObject都有Layer ...
- phpstrom2018
http://www.oyksoft.com/soft/40722.html?pc=1