以下是实验设计
设计一个一维的数据,14个数据,7个成一组,一个高斯分布,整体数据隐含了2个高斯分布。
系统最初给出第一个数属于z0的概率0.9,最后一个数属于在z1的概率0.9,其余数据不可判定。
迭代到最后,自动识别前7个数属于z0,后7个数属于z1。

实验代码
include "stdio.h"
#include "stdlib.h"
#include "stdint.h"
#include "math.h"

double PI = 3.1415926;

double Gauss(const double px,const double mu,const doublecsigma)
{
        double val
=sqrt(2*PI*csigma);
        val = 1/val;
        val =val*exp(-pow(px-mu,2)/(2*csigma));
        return val
;
 }

int main(void)
{
       double x[] = {1.5,1.8,1.9,2.0,2.1,2.2,2.5, 
3.0,3.9,3.9,4.0,4.1,4.1,5.0};
       int m = sizeof(x)/sizeof(double);

       const int k = 2;
       double fei[k] ;
       double mean[k] ;
       double mao[k] ;


       doubleprobability_x[][2]={{0.9,0.1},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.5,0.5},{0.
1,0.9}}; // first make the 1.5 belong to z0 ,wihle 5.0 belongto z1
       bool improve_large = false;
       int step = 0;
       do{
           
  //E-step       
           
  for(intj=0;j<k&&step!=0;++j)
           
  {
           
         for(inti=0;i<m;++i)
           
         {
           
         
     probability_x[i][j] = Gauss(x[i],mean[j],mao[j])*fei[j]/ (Gauss(x[i],mean[0],mao[0])*fei[0]+Gauss(x[i],mean[1],mao[1])*fei[1]
);
           
         }
           
  }
           
  //M-step
           
  for(intj=0;j<k;++j)
           
  {
           
         fei[j] =0.0;
           
         doublesum_prob = 0.0;
           
         for(inti=0;i<m;++i)
           
         {
           
         
     sum_prob += probability_x[i][j];
           
         }
           
         fei[j] =sum_prob / m;
           
  }

           
  for(intj=0;j<k;++j)
           
  {
           
         mean[j] =0.0;
           
         doubleweight = 0.0;
           
         doublesum_prob = 0.0;
           
         for(inti=0;i<m;++i)
           
         {
           
         
     weight += x[i]*probability_x[i][j];
           
         
     sum_prob += probability_x[i][j];
           
         }
           
         mean[j] =weight/sum_prob;
           
  }


           
  for(intj=0;j<k;++j)
           
  {
           
         mao[j] =0.0;
           
         doubleweight = 0.0;
           
         doublesum_prob = 0.0;
           
         for(inti=0;i<m;++i)
           
         {
           
         
     weight +=(x[i]-mean[j])*(x[i]-mean[j])*probability_x[i][j];
           
         
     sum_prob += probability_x[i][j];
           
         }
           
         mao[j] =weight/sum_prob;
           
  }

           
 printf("********************%d*************************\n",step++);
           
 printf("%f,%f,%f\n",fei[0],mean[0],mao[0]);
           
 printf("%f,%f,%f\n",fei[1],mean[1],mao[1]);
           
  for(inti=0;i<m;++i)
           
  {
           
         
     printf("%f\t%f\n",probability_x[i][0],probability_x[i][1]);
           
  }
           
 printf("***********************************************\n");


       }while(!improve_large&& step<100);

       return 0;
}

EM实现的更多相关文章

  1. CSS中强悍的相对单位之em(em-and-elastic-layouts)学习小记

    使用相对单位em注意点 1.浏览器默认字体是16px,即1em = 16px,根元素设置如下 html{ font-size: 100%; /* WinIE text resize correctio ...

  2. 由css reset想到的深入理解margin及em的含义

    由css reset想到的深入理解margin及em的含义 原文地址:http://www.ymblog.net/content_189.html 经常看到这样语句,*{ margin:0px;pad ...

  3. 【十大经典数据挖掘算法】EM

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 极大似然 极大似然(Maxim ...

  4. px和em,rem的区别

    1.px是你屏幕设备物理上能显示出的最小的一个点,这个点不是固定宽度的,不同设备上点的长宽.比例有可能会不同.假设:你现在用的显示器上1px宽=1毫米,但我用的显示器1px宽=两毫米,那么你定义一个d ...

  5. 学习笔记——EM算法

    EM算法是一种迭代算法,用于含有隐变量(hidden variable)的概率模型参数的极大似然估计,或极大后验概率估计.EM算法的每次迭代由两步组成:E步,求期望(expectation):M步,求 ...

  6. em与px换算关系以及常用列表

    1.任意浏览器的默认字体大小都是16px.2.所有未经调整的浏览器都符合: 1em=16px 12px=0.75em 10px=0.625em3.为了简化font-size的换算,在body选择器中声 ...

  7. CSS3中的px,em,rem,vh,vw辨析

    1.px:像素,精确显示 2.em:继承父类字体的大小,相当于"倍",如:浏览器默认字体大小为16px=1em,始终按照div继承来的字体大小显示,进场用于移动端 em换算工具:h ...

  8. rem、px、em之间的区别以及网页响应式设计写法

    个人收藏用,转载自:http://www.w3cplus.com/css3/define-font-size-with-css3-rem 在Web中使用什么单位来定义页面的字体大小,至今天为止都还在激 ...

  9. css单位:em,rem解释

    em:所有浏览器都符合:1em=16px;1.具有继承性2.em的根元素是body,当设置了根元素的大小时,大小是定义的数字乘以根元素定义的大小值 rem:1rem=16pxrem不具有继承性,其根元 ...

  10. 关于px、em和rem的学习笔记!

    刚参加前端工作,字体一般使用px来设置大小,在处理响应式界面时对字体的大小变化处理感觉很吃力,得知对字体的大小有三种大小格式设置方式,便想一探究竟,希望可以有所帮助! px px像素(Pixel),相 ...

随机推荐

  1. jQuery中$(function()与(function($)等的区别详细讲解

    (function($) {-})(jQuery); 这里实际上是匿名函数,如下: function(arg){-} 这就定义了一个匿名函数,参数为arg 而调用函数时,是在函数后面写上括号和实参的, ...

  2. [OpenCV]在显示窗口中截图

    [OpenCV]在显示窗口中截图 简介 介绍使用OpenCV实现简单的截图功能.首先阐述实现此功能的基本步骤,然后给出实现代码,最后贴出实验结果以及遇到的问题. 基本步骤 我们需要知道OpenCV使用 ...

  3. logstash输出到elasticsearch多索引

    目标:将json格式的两类日志输出到elasticsearch两类索引 1. 安装logstash. 2. 编写logstash处理配置文件,创建一个test.conf文件,内容如下: input { ...

  4. Picasso 完美兼容 OkHttp3.3,缓存优化两不误

    Tamic 专注移动开发!更多文章请关注http://www.jianshu.com/p/6241950f9daf csdn: http://blog.csdn.net/sk719887916/art ...

  5. 将meteor部署到自己的服务器(deploy meteor to your own server)

    安装指定版本的node # 所有版本在:https://nodejs.org/download/release/# current dir:/rootwget -c https://nodejs.or ...

  6. 没事不要在for循环期间增减迭代序列的成员

    >>> arr=[4, 4, 9, 7, 7] >>> for i,a in enumerate(arr): arr.pop(i) print(i,a) 4 0 4 ...

  7. [shiro学习笔记]第四节 使用源代码生成Shiro的CHM格式的API文档

    版本为1.2.3的shiro API chm个事故文档生成. 获取shiro源代码 编译生成API文档 转换成chm格式 API 获取shiro源代码 shiro官网: http://shiro.ap ...

  8. Java进阶(四十五)java 字节流与字符流的区别

    java 字节流与字符流的区别(转载)   字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?   实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...

  9. tomcat启动批处理——setclasspath.bat

    除了上面两个批处理,还有一个比较重要的脚本,即是setclasspath.bat,它主要负责寻找.检查JAVA_HOME和JRE_HOME两个变量. ************************* ...

  10. 六星经典CSAPP笔记(2)信息的操作和表示

    2.Representing and Manipulating Information 本章从二进制.字长.字节序,一直讲到布尔代数.位运算,最后无符号.有符号整数.浮点数的表示和运算.诚然有些地方的 ...