• 大小: 6KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-19
  • 语言: 其他
  • 标签: C++  

资源简介

根据论文写的 有注释

资源截图

代码片段和文件信息


//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


评论

共有 条评论