资源简介
根据论文写的 有注释
代码片段和文件信息
//GMM源文件
#include
#include
#include “GMM.h“
#include “KMeans.h“
using namespace std;
//double M_PI=3.14159;
GMM::GMM(int dimNum int mixNum)
{
m_dimNum = dimNum;
m_mixNum = mixNum;
m_maxIterNum = 100;
m_endError = 0.001;
Allocate();
for (int i = 0; i < m_mixNum; i++)
{
m_priors[i] = 1.0 / m_mixNum; //初始化
for (int d = 0; d < m_dimNum; d++)
{
m_means[i][d] = 0;
m_vars[i][d] = 1;
}
}
}
GMM::~GMM()
{
Dispose();
}
void GMM::Allocate()
{
//分配空间
m_priors = new double[m_mixNum];
m_means = new double*[m_mixNum];
m_vars = new double*[m_mixNum];
for (int i = 0; i < m_mixNum; i++)
{
m_means[i] = new double[m_dimNum];
m_vars[i] = new double[m_dimNum];
}
m_minVars = new double[m_dimNum];
}
void GMM::Dispose()
{
//释放空间
delete[] m_priors;
for (int i = 0; i < m_mixNum; i++)
{
delete[] m_means[i];
delete[] m_vars[i];
}
delete[] m_means;
delete[] m_vars;
delete[] m_minVars;
}
void GMM::Copy(GMM* gmm)
{
assert(m_mixNum == gmm->m_mixNum && m_dimNum == gmm->m_dimNum);
//赋值
for (int i = 0; i < m_mixNum; i++)
{
m_priors[i] = gmm->Prior(i);
memcpy(m_means[i] gmm->Mean(i) sizeof(double) * m_dimNum);
memcpy(m_vars[i] gmm->Variance(i) sizeof(double) * m_dimNum);
}
memcpy(m_minVars gmm->m_minVars sizeof(double) * m_dimNum);
}
double GMM::GetProbability(const double* sample)
{
double p = 0;
for (int i = 0; i < m_mixNum; i++)
{
p += m_priors[i] * GetProbability(sample i); //在该高斯模型下面所有模型的和 权值*概率
}
return p;
}
double GMM::GetProbability(const double* x int j)
{
double p = 1;
for (int d = 0; d < m_dimNum; d++)
{
//使用单高斯概率计算公式 但是求出的是多个维度的乘积
p *= 1 / sqrt(2 * 3.14159 * m_vars[j][d]);
p *= exp(-0.5 * (x[d] - m_means[j][d]) * (x[d] - m_means[j][d]) / m_vars[j][d]);
}
return p;
}
void GMM::Train(double *data int N)
{
//初始化 使用KMeans来初始化里面的数据
Init(dataN);
int size = N;
//下面的参数参照KMeans 都是一次迭代之后分配空间 使用EM算法 具体见 http://www.cnblogs.com/mindpuzzle/tag/EM/
bool loop = true;
double iterNum = 0;
double lastL = 0;
double currL = 0;
int unchanged = 0;
double* x = new double[m_dimNum];
double* next_priors = new double[m_mixNum];
double** next_vars = new double*[m_mixNum];
double** next_means = new double*[m_mixNum];
for (int i = 0; i < m_mixNum; i++)
{
next_means[i] = new double[m_dimNum];
next_vars[i] = new double[m_dimNum];
}
while (loop)
{
//初始化
memset(next_priors 0 sizeof(double) * m_mixNum);
for (int i = 0; i < m_mixNum; i++)
{
memset(next_vars[i] 0 sizeof(double) * m_dimNum);
memset(next_means[i] 0 sizeof(double) * m_dimNum);
}
lastL = currL;
currL = 0;
for (int k = 0; k < size; k++)
{
for(int j=0;j x[j]=data[k*m_dimNum+j]; //获取数据
double p = GetProbability(x); //计算概率
for (int j = 0; j < m_mixNum; j++)
{
double pj = GetProbability(x j) * m_priors[j] / p; //相当于计算x值在该高斯模型下面的概率 论文里面的rjk
next_priors[j] += p
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 6425 2014-11-08 23:37 CODE\GMM.cpp
文件 1761 2014-11-08 23:10 CODE\GMM.h
文件 1708 2014-11-08 22:22 CODE\KmeanAndGmm.cpp
文件 4306 2014-11-08 22:49 CODE\KMeans.cpp
文件 1615 2014-11-08 22:35 CODE\KMeans.h
目录 0 2014-11-08 23:38 CODE
----------- --------- ---------- ----- ----
15815 6
- 上一篇:opencv.props
- 下一篇:基于RS232接口的电机状态上位机监控界面设计
相关资源
- 非常完整的A*算法具体代码
- 图像的载入显示和输出程序by浅墨
- windef.h && windows.h
- 自己分装的一个winhttp类
- 纯C实现语音合成支持windows和linux,亲
- 小型公司工资管理系统设计
- VC中利用多线程技术实现线程之间的通
- KNN K-最近邻分类算法源代码
- 软件的层架构设计详解
- opencv3.4.1人脸识别小程序
- 二叉树先序、中序、后序三种遍历的
- SVM+HOG (行人、车辆等检测)
- 十字消除游戏
- 保龄球规则计算分数
- qt5.11.2官方 mqtt库
- 利用后缀表达式计算中缀表达式的值
- 用二叉树实现学生健康情况管理系统
- rc 资源编辑器-用于可视化编辑资源文
- 两个矩阵的加减乘除运算以及矩阵转
- 职工工资管理系统(数据结构课程设
- MuyiGaoDeMap
- 递推最小二乘C+.zip
- 迷宫问题的求解八个方向的
- 暗黑源代码
- 仿记事本Demo
- 成绩管理系统源码
- 无线433判断遥控器按键弹起.zip
- 无线433远距离/低电量时的杂波过滤方
- LibJosnSerial.rar
- 喜马拉雅win10文件改名工具
评论
共有 条评论