資源簡介
根據論文寫的 有注釋

代碼片段和文件信息
//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_priors[i]?=?1.0?/?m_mixNum;???//初始化
for?(int?d?=?0;?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_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? {
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_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? {
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? {???
//使用單高斯概率計算公式???但是求出的是多個維度的乘積?
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? {
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? {
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? {
for(int?j=0;j x[j]=data[k*m_dimNum+j];?????????//獲取數據?
double?p?=?GetProbability(x);????????//計算概率
for?(int?j?=?0;?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接口的電機狀態上位機監控界面設計
評論
共有 條評論