我自己用C++写了个GMM(Gaussian mixture model)模型

Written for an assignment

之前粗粗了解了GMM的原理,但是没有细看,现在有个Assignment让用C++手写一个GMM模型,有点方,花了一些时间写出来了。

先吐槽下,这两天算是把网上关于GMM的博客扒了个遍。网上关于GMM的教程虽然很多,但是存在严重的理论和编程脱节,属于那种一看就会了、一打开编辑器就麻爪的文章

先自己评价下写的这个模型:

  • 缺点

    1. 矩阵类是自己实现的,效率比较差(用C++做科学编程工作实在比较少,不知道有现成的库,而且C++给我留下的就是造核弹先从磨剪子开始的这种原始的感觉)。中途发现计算行列式和逆矩阵的性能太差了,上网一搜发现了Eigen库的存在,但是因为结构已经搭好了,所以只在这两个方法内使用了该库
    2. 理论上更换main方法的MODELNUMBER常数就可以选择GMM中使用的高斯函数的数量,但是只根据样本分布情况测试并使用了使用两个的情况,其他情况可能有bug(现在已知weight初始化的时候只写了两个高斯函数时的情况,有Bug,但是属于那种好发现、好调整的bug)
    3. 面向对象的不纯粹:是的,我是个Java狗。但是最后有两个方法,没有封装为工具类
    4. 都写在一个文件了:这个嘛emmm,是我发现C++调用其他文件资源很麻烦之后就偷了个懒
  • 优点
    1. 面向对象,结构简单易懂
    2. 实现是基于这篇文章的,理论和编程搭配起来看很容易懂
    3. 比我之前康过的网上的其他实现好懂一点~

未尽事宜,请看README

项目地址:https://github.com/blackcoffeebar/MyGMM

我自己用C++写了个GMM(Gaussian mixture model)模型的更多相关文章

  1. 高斯混合模型Gaussian Mixture Model (GMM)——通过增加 Model 的个数,我们可以任意地逼近任何连续的概率密分布

    从几何上讲,单高斯分布模型在二维空间应该近似于椭圆,在三维空间上近似于椭球.遗憾的是在很多分类问题中,属于同一类别的样本点并不满足“椭圆”分布的特性.这就引入了高斯混合模型.——可以认为是基本假设! ...

  2. 混合高斯模型(Gaussian mixture model, GMM)

    1. 前言 这就是为什么我要学习一下二维高斯分布的原因: 总感觉数学知识不够用呐,顺带把混合高斯模型也回顾一下. 2. 单高斯模型(Gaussian single model, GSM) 2.1 一维 ...

  3. 高斯混合模型Gaussian Mixture Model (GMM)

    混合高斯模型GMM是指对样本的概率密度分布进行估计,而估计采用的模型(训练模型)是几个高斯模型的加权和(具体是几个要在模型训练前建立好).每个高斯模型就代表了一个类(一个Cluster).对样本中的数 ...

  4. kaldi基于GMM的单音素模型 训练部分

    目录 1. gmm-init-mono 模型初始化 2. compile-train-graghs 训练图初始化 3. align-equal-compiled 特征文件均匀分割 4. gmm-acc ...

  5. 从零写一个Asp.net core手脚架(模型验证)

    一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.n ...

  6. 手动写Entity Framework 数据库上下文和Model实体

    1.引用EF对应的程序集 使用命令安装EntityFramework包Install-Package EntityFramework Entity Framework简单目录: 1.context数据 ...

  7. 写了一个Java的简单缓存模型

    缓存操作接口 /** * 缓存操作接口 * * @author xiudong * * @param <T> */ public interface Cache<T> { /* ...

  8. GMM及EM算法

    GMM及EM算法 标签(空格分隔): 机器学习 前言: EM(Exception Maximizition) -- 期望最大化算法,用于含有隐变量的概率模型参数的极大似然估计: GMM(Gaussia ...

  9. GMM高斯混合模型学习笔记(EM算法求解)

    提出混合模型主要是为了能更好地近似一些较复杂的样本分布,通过不断添加component个数,能够随意地逼近不论什么连续的概率分布.所以我们觉得不论什么样本分布都能够用混合模型来建模.由于高斯函数具有一 ...

随机推荐

  1. [转][linux][centos]嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  2. osg Node getParentalNodePaths()报错

    node->getBound().center() * osg::computeLocalToWorld(node->getParentalNodePaths()[0]) osg::Vec ...

  3. sql 获取某一时段中每一天中最大的时间的一条记录

    SELECT *FROM ( SELECT ROW_NUMBER() OVER( PARTITION BY CONVERT(CHAR(10), DataTime, 120) ORDER BY Data ...

  4. [Scikit-learn] 1.4 Support Vector Regression

    SVM算法 既可用于回归问题,比如SVR(Support Vector Regression,支持向量回归) 也可以用于分类问题,比如SVC(Support Vector Classification ...

  5. 123457123457#0#----com.ppGame.YinYu45--前拼后广--儿童yinyu-pp

    com.ppGame.YinYu45--前拼后广--儿童yinyu-pp

  6. SQL命令如何分发到集群的各节点

    有些数据库集群的规模是很大的,有上百个节点,那么维护SQL命令如何快速分发给各个节点,例如:要加个字段,逐个节点操作那是十分低效,枯燥的. TreeSoft增加了[SQL分发]功能,简单配置,可以快速 ...

  7. CEIWEI USBMonitor USB监控精灵 v2.3.2 USB过滤驱动 USB监控

    CEIWEI USBMonitor USB监控精灵 是一款监控USB端口协议分析软件,用于监控和分析USB设备协议,可以拦截.记录USB软件程序操作USB设备的In.Out数据包.支持监控分析USB票 ...

  8. instance与type区别

    class Foo(object): pass class Bar(Foo): pass obj = Bar() # isinstance用于判断,对象是否是指定类的实例 (错误的) # isinst ...

  9. .bashrc修改环境变量文件后ls之类的不能用了

    在命令行中输入 export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin之后在修改回来

  10. HashMap的key存储对象需要注意哪些

    HashMap的key最好不要存储对象,大部分环境都是String. 如果要存储对象,要注意重写下equal和hashcode方法!!