GMM demo

# GMM model
# 2015/7/22
library(mvtnorm)

set.seed(1)
n1 = 1000
n2 = 1000
mu1 = c(0,1)
mu2 = c(-5,-6)
sigma1 = matrix(c(1,.5,.5,2),nrow=2)
sigma2 = matrix(c(2,.5,.5,1),nrow=2)
y1 = rep(1,n1)
y2 = rep(2,n2)
x1 = rmvnorm(n1, mean=mu1, sigma=sigma1)
x2 = rmvnorm(n2, mean=mu2, sigma=sigma2)

x = rbind(x1,x2)
y = rbind(y1,y2)

ns = 2
ngrid = 100

mv.gauss = function(x,y,mu,sigma)
{
  nx = length(x)
  ny = length(y)
  z = matrix(0,nrow=ny, ncol=nx)
  sigma_inv = solve(sigma)
  det_sigma = det(sigma)
  for (i in 1:nx){
    for (j in 1:ny){
      z[i,j] = 1/(2*pi*sqrt(det_sigma)) * exp(-t(c(x[i], y[j]) - mu) %*% sigma_inv %*% t(t(c(x[i], y[j]) - mu)))
    }
  }
  return(z)
}
gauss_density = function(x,mu,sigma)
{
  nx = length(x)
  ny = length(y)
  z = matrix(0,nrow=ny, ncol=nx)
  sigma_inv = solve(sigma)
  det_sigma = det(sigma)
  value = 1/(2*pi*sqrt(det_sigma)) * exp(-1/2* t(x - mu) %*% sigma_inv %*% t(t(x - mu)))

  return(value)
}
plot_contour = function(ngrid, ns, mv.gauss, mu1,sigma1,mu2,sigma2){
  x.range1 = seq(mu1[1]-ns*sigma1[1],mu1[1]+ns*sigma1[1],length.out=ngrid)
  y.range1 = seq(mu1[2]-ns*sigma1[4],mu1[2]+ns*sigma1[4],length.out=ngrid)

  x.range2 = seq(mu2[1]-ns*sigma2[1],mu2[1]+ns*sigma2[1],length.out=ngrid)
  y.range2 = seq(mu2[2]-ns*sigma2[4],mu1[2]+ns*sigma2[4],length.out=ngrid)

  z1 = mv.gauss(x.range1, y.range1, mu1, sigma1)
  z2 = mv.gauss(x.range2, y.range2, mu2, sigma2)
  contour(x.range1, y.range1, z1, add=TRUE,col="red", lwd = 3)
  contour(x.range2, y.range2, z2, add=TRUE,col="blue", lwd = 3)
}
plot_iter = function(ngrid,x1,x2,mv.gauss, mu1,sigma1,mu2,sigma2, iter=1){
  x = rbind(x1,x2)
  plot(x[,1], x[,2], type=‘p‘,
       main=sprintf("Iter %d: mu1=(%.2f, %.2f)/(-5,-6) mu2=(%.2f, %.2f)/(0,1)",
                    iter, mu1[1],mu1[2], mu2[1], mu2[2]))
  points(mu1[1], mu1[2], col=‘red‘, pch=15)
  points(mu2[1], mu2[2], col=‘blue‘, pch=15)
  plot_contour(ngrid,4,mv.gauss, mu1,sigma1,mu2,sigma2)
}
obj_value = function(x,phi, mu1, sigma1, mu2, sigma2){
  n = dim(x)[1]
  res = 0
  for (i in i:n){
    res = res + log(phi[1]*gauss_density(x[i,], mu1, sigma1)+phi[2]*gauss_density(x[i,], mu2, sigma2))
  }
  return(res)
}
plot_iter(ngrid,x1,x2,mv.gauss, mu1,sigma1,mu2,sigma2)

mu1_i = c(0,0)
mu2_i = c(1,0)
sigma1_i = matrix(c(1,0,0,1),nrow=2)
sigma2_i = matrix(c(1,0,0,1),nrow=2)
plot_iter(ngrid,x1,x2,mv.gauss, mu1_i,sigma1_i,mu2_i,sigma2_i,0)

n = n1+n2
w = array(0,dim=c(n,2))
phi1 = 0.5
phi2 = 0.5
num_iter = 12
obj_val = rep(0,num_iter)
for (ii in 1:num_iter){
  # E-step
  for (i in 1:n){
    w[i,1] = phi1 * gauss_density(x[i,], mu1_i, sigma1_i)
    w[i,2] = phi2 * gauss_density(x[i,], mu2_i, sigma2_i)
    tmp = sum(w[i,])
    w[i,1] = w[i,1] / tmp
    w[i,2] = w[i,2] / tmp
  }

  # M-step
  phi1 = mean(w[,1])
  phi2 = mean(w[,2])
  mu1_i = colSums(w[,1]*x) / sum(w[,1])
  mu2_i = colSums(w[,2]*x) / sum(w[,2])
  tmp = matrix(0,nrow=2,,ncol=2)
  mu = mu1_i
  for (i in 1:n){
    tmp = tmp + w[i,1] * (t(t(x[i,] - mu)) %*% t(x[i,] - mu))
  }
  sigma1_i = tmp / sum(w[,1])
  tmp = matrix(0,nrow=2,ncol=2)
  mu = mu2_i
  for (i in 1:n){
    tmp = tmp + w[i,2] * (t(t(x[i,] - mu)) %*% t(x[i,] - mu))
  }
  sigma2_i = tmp / sum(w[,2])
  plot_iter(ngrid,x1,x2,mv.gauss, mu1_i,sigma1_i,mu2_i,sigma2_i, ii)
  obj_val[ii] = obj_value(x,c(phi1,phi2), mu1_i,sigma1_i, mu2_i, sigma2_i)
}
plot(obj_val,type="l",main="Objective function: log likelihood",xlab="#Iteration")
print(c(phi1, phi2))
print(sigma1_i)
print(sigma2_i)
时间: 2024-08-09 02:18:51

GMM demo的相关文章

GMM+Kalman Filter+Blob 目标跟踪

转 http://www.cnblogs.com/YangQiaoblog/p/5462453.html ==========图片版============================================================================== ===================================================================================== 最近学习了一下多目标跟踪,看了看Mat

微信h5支付demo微信H5支付demo非微信浏览器支付demo微信wap支付

一.首先先确定H5支付权限已经申请!(需要微信h5支付demo的可以加 851 488 243 备注:h5支付) 二.开发流程 1.用户在商户侧完成下单,使用微信支付进行支付 2.由商户后台向微信支付发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB 3.统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名"mweb_url"),商户通过mweb_url调起微信支付中间页 4.中间页进行H5权限的校验,安全性检查(此处常见错误请见下文) 5.如支付成

Maven+SpringMVC+Freemarker入门Demo

1 参考http://blog.csdn.net/haishu_zheng/article/details/51490299,用第二种方法创建一个名为mavenspringmvcfreemarker的Maven工程. 2 文件目录结构如下图所示 3 在pom.xml中添加springmvc和freemarker的依赖包,添加完之后的完整内容为 [html] view plain copy <project xmlns="http://maven.apache.org/POM/4.0.0&q

Spring Security入门Demo

一.spring Security简介 SpringSecurity,这是一种基于Spring AOP和Servlet过滤器的安全框架.它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权.在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术. 二.建立工程 参考http://blog.csdn.net/haishu_zheng/article/details/51490

沫沫金Echarts移动端demo

鄙视百度!!! 官网给的Demo支持自动大小,确不给完整的源码XXX 自己动手,丰衣足食 http://echarts.baidu.com/demo.html#bar-tick-align 用最基本的柱状图官网代码 简单两步,实现移动端自适应大小 //1.下载Echarts <script src="dep/Echarts/echarts-all-3.js"></script> //2.chart容器宽度自适应 <!-- 为ECharts准备一个具备大小(

Flask---使用Bootstrap新建第一个demo

Flask---使用Bootstrap新建第一个demo 参考自http://www.jianshu.com/p/417bcbad82fb 还有<Flask web开发> 前端用到Bootstrap开源框架,Bootstrap是客户端框架,后台当然就是Flask了. 服务器需要做的只是提供引用了Bootstrap层叠样式表(CSS)和JS文件的html响应,并且在html.css和js代码中实例化需要的组件,这些操作的最理想的执行环境就是模板 关于模板的介绍及其实现原理:https://kb.

struts2和hibernate整合的小Demo

jar包下载地址 创建一个web项目. 导入jar包 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

移动端上传照片 预览+draw on Canvas demo(解决iOS等设备照片旋转90度的bug)

背景: 本人的一个移动端H5项目,需求如下: 手机相册选取或拍摄照片后在页面上预览 然后绘制在canvas画布上. 这里,我们先看一个demo(http://jsfiddle.net/q3011893/83qfqpk8/embedded/) 操作步骤: 1.点击选择文件,拍摄一张照片,此时"预览:"文字下会显示你刚才拍摄的照片: 2.再点击"draw on Canvas",该按钮下的画布会绘制你刚才拍摄的照片. 正常的结果: 正文: 让input file支持拍照+

爬虫2:html页面+beautifulsoap模块+post方式+demo

爬取html页面,有时需要设置参数post方式请求,生成json,保存文件中. 1)引入模块 import requests from bs4 import BeautifulSoup url_ = 'http://www.c.....................' 2)设置参数 datas = { 'yyyy':'2014', 'mm':'-12-31', 'cwzb':"incomestatements", 'button2':"%CC%E1%BD%BB",