⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 em.cpp

📁 用C++实现了期望最大化算法
💻 CPP
字号:
// Em.cpp: implementation of the CEm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
//#include "imageassociation.h"
#include "Em.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
template<class T>
CEm<T>::CEm()
{

}
template<class T>
CEm<T>::~CEm()
{

}
template<class T>
void CEm<T>::initialize(T **data,int num,int dim)//double
{
  m_Data  = data;
  m_N = num;//Data.length;
  m_d = dim;//Data[0].length;
  m_Min   = new double[m_d];
  m_Max   = new double[m_d];
  int n,i;//,j;
  for(i=0;i<m_d;i++) {
    m_Min[i] = m_Data[0][i];
    m_Max[i] = m_Data[0][i];
    for(n=1;n<m_N;n++) {
      if(m_Min[i] > m_Data[n][i]) m_Min[i] = m_Data[n][i]; else
      if(m_Max[i] < m_Data[n][i]) m_Max[i] = m_Data[n][i];
    }
  }
}
template<class T>
void CEm<T>::setParameter(int m)
{
  int i,j;
  double var = 0.0;
  m_M = m;
  m_P = new double[m];
  m_u = new  double*[m];
  for(i=0;i<m;i++){// [m_d];
	  m_u[i]=new double[m_d];
  }
  m_v = new double[m];
  m_P_old = new double[m];
  m_u_old=new double*[m];//
  for(i=0;i<m;i++){
	  m_u_old[m]=new double[m_d];
  }
  m_v_old = new double[m];
  m_P_x   = new double[m];
  m_P_x_old = new double[m_N];
  for(i=0;i<m_d;i++)
    var += (m_Max[i] - m_Min[i]) * (m_Max[i] - m_Min[i]) / 12 / m_d;
  for(j=0;j<m;j++)
  {
    m_P[j] = 1.0 / (double)m;
    m_v[j] = var / 4 + random() * var / 4; 
    for(i=0;i<m_d;i++)
      m_u[j][i] = (m_Max[i] + m_Min[i]) / 2 +
                (random() - 0.5 ) *  (m_Max[i] - m_Min[i]) / 2;
  }
}
template<class T>
void CEm<T>::new_old()
{
  int i,j;
  for(j=0;j<m_M;j++)
  {
    m_P_old[j] = m_P[j];
    m_v_old[j] = m_v[j];
    for(i=0;i<m_d;i++)
		m_u_old[j][i] = m_u[j][i];
  }
}
template<class T>
double CEm<T>::P_x_j(int n, int j)
{
  int i;
  double e = 0.0;
  for(i=0;i<m_d;i++)
    e += (m_Data[n][i] - m_u[j][i]) * (m_Data[n][i] - m_u[j][i]);
  e /= -2 * m_v[j] * m_v[j];
  return exp(e) / pow(2 * PI * m_v[j] * m_v[j], (double)m_d / 2.0); 
} 

 /* double CEm::P_j_x(int n, int j)
{
  return P_x_j(n,j) * P[j] / P_x[n];
}//*/
template<class T>
void CEm<T>::P_x()
{
  int n,j;
  for(n=0;n<m_N;n++)
  {
    double temp = 0.0;
    for(j=0;j<m_M;j++)
      temp += P_x_j(n,j) * m_P[j];
    m_P_x[n] = temp;
  }
}
template<class T>
double CEm<T>::P_x_j_old(int n, int j)
{
  int i;
  double e = 0.0;
  for(i=0;i<m_d;i++)
    e += (m_Data[n][i] - m_u_old[j][i]) * (m_Data[n][i] - m_u_old[j][i]);
  e /= -2 * m_v_old[j] * m_v_old[j];
  return exp(e) / pow(2 * PI * m_v_old[j] * m_v_old[j], (double)m_d / 2.0); 
} 
template<class T>
double CEm<T>::pdf(double x[])
{
  int i,j;
  double e = 0.0;
  double t = 0.0;
  for(j=0;j<m_M;j++) {
    for(i=0;i<m_d;i++)
      e += (x[i] - m_u[j][i]) * (x[i] - m_u[j][i]);
    e /= -2 * m_v[j] * m_v[j];
    e = exp(e) / pow(2 * PI * m_v[j] * m_v[j],(double)m_d / 2.0); 
    t += e*m_P[j];
  }
  return t;
}

/*double CEm::P_j_x_old(int n, int j)
{
  return P_x_j_old(n,j) * P_old[j] / P_x_old[n];
}*/
template<class T>
void CEm<T>::P_x_old()
{
  int n,j;
  for(n=0;n<m_N;n++)
  {
    double temp = 0.0;
    for(j=0;j<m_M;j++)
      temp += P_x_j_old(n,j) * m_P_old[j];
    m_P_x_old[n] = temp;
  }
}
template<class T>
void CEm<T>::iteration()
{
	  int i,j,n;
	  new_old();
	  P_x();
	  P_x_old();
	  
	  // calculate new mean & variance
	  
	  for(j=0;j<m_M;j++)
	  {
		  double denom = 0.0;
		  for(n=0;n<m_N;n++)
			  denom += P_j_x_old(n,j);
		  
		  for(i=0;i<m_d;i++)
		  { 
			  m_u[j][i] = 0.0;
			  for(n=0;n<m_N;n++)
				  m_u[j][i] += P_j_x_old(n,j) * m_Data[n][i];
			  m_u[j][i] /= denom;
		  }
		  
		  m_v[j] = 0.0;
		  for(n=0;n<m_N;n++)
		  {
			  double sum = 0.0;
			  for(i=0;i<m_d;i++)
				  sum += (m_Data[n][i] - m_u[j][i]) * (m_Data[n][i] - m_u[j][i]);
			  m_v[j] += sum * P_j_x_old(n,j);
		  }
		  m_v[j] /= denom * m_d;
		  m_v[j] = sqrt(m_v[j]);
		  
		  m_P[j] = denom / (double)m_N;
	  }
}


template<class T>
void CEm<T>::display(HDC pDC)
{
	  CString newline;// = System.getProperty("line.separator");
	  int i,j;
	  for(j=0;j<m_M;j++)
	  {
		  newline.Format("P(%d)=%f	V(%d)=%f	U(%d)",j,m_P[j]);
		  CString temp;
		  for(i=0;i<m_d;i++){
			  //System.out.print(u[j][i] + " ");
			  temp.Format("u(%d)(%d)=%f",j,i,m_u[j][i]);
			  newline+=temp;
		  }
		  TextOut(pDC,0,j*15,newline,newline.GetLength());
		  
	  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -