资源简介
根据论文写的 有注释

代码片段和文件信息
//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接口的电机状态上位机监控界面设计
相关资源
- VisualStudioUninstaller vs卸载工具
- 组态王驱动开发包3.0.0.7(中文)
- 多窗口后台鼠标连点器
- 使用选择性重传协议实现UDP可靠通信
- VC 获得文件属性 获取文件的创建时
- 读者写者问题(读者优先,写者优先
- 用VC 编写的仿QQ聊天室程序源代码
- 外点法程序
- 外罚函数程序
- qt-电子点菜系统
- 推箱子及人工智能寻路C 源代码
- 自己写的航空订票系统c 版--数据结构
- 数据结构实验魔王语言
- MUSIC算法c 实现
- C 餐厅叫号系统(QT平)
- 国际象棋c 完整版
-
ob
jectARX给Auto CAD加工具条 - 画图程序MFC/VC/VC CRectTracker 串行化
- MFC网络编程实例
- c 课程设计 职工信息管理系统
- VC 游戏编程—附源代码
- IpHlpApi.h&IpHlpApi.lib
- 清华大学 c 郑莉 ppt课件
- c 程序判断离散数学中命题公式
- 多项式求和(数据结构C 版)
- vc 6.0开发的流程图编辑器
- VC 天空盒(skyBox)实现(附源代码)
- c MFC 画多边形
- 用C 实现的对网络上的ARP数据包进行
- Microsoft基本类库 (MFC)(C 库)
评论
共有 条评论