亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gmr.cpp

?? 這是一款用C++編寫的實現gmm算法的程序
?? CPP
字號:
/*
  Copyright (c) 2008 Florent D'halluin , Sylvain Calinon, 
  LASA Lab, EPFL, CH-1015 Lausanne, Switzerland, 
  http://www.calinon.ch, http://lasa.epfl.ch

  The program is free for non-commercial academic use. 
  Please acknowledge the authors in any academic publications that have 
  made use of this code or part of it. Please use this BibTex reference: 
 
  @article{Calinon07SMC,
  title="On Learning, Representing and Generalizing a Task in a Humanoid 
  Robot",
  author="S. Calinon and F. Guenter and A. Billard",
  journal="IEEE Transactions on Systems, Man and Cybernetics, Part B. 
  Special issue on robot learning by observation, demonstration and 
  imitation",
  year="2007",
  volume="37",
  number="2",
  pages="286--298"
  }
*/

#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdlib>
#include "MathLib.h"
#include "gmr.h"

#define MAXITER 200

Matrix GaussianMixture::loadDataFile(const char filename [])
{
  // Load the dataset from a file
  Matrix result;
  Vector vecTmp;
  float valTmp;
  char tmp[1024];
  unsigned int l=0, c=0;

  std::ifstream f(filename);
  if (f.is_open()){
    // Get number of row
    while(!f.eof()){ 
      f.getline(tmp,1024);
      l++;
      if (l==1){
	// Get number of columns
	std::istringstream strm;
	strm.str(tmp); 
	while (strm >> valTmp)
	  c++;
      }
    }
    result.Resize(l-1,c); // then the matrix can be allocated
    f.clear();
    f.seekg(0); // returns to beginning of the file
    for(unsigned int i=0;i<l;i++){ 
      f.getline(tmp,1024);
      std::istringstream strm;
      strm.str(tmp); 
      for(unsigned int j=0;j<c;j++){
	strm >> result(i,j);
      }
    }
    f.close();
  }
  else{
    std::cout  << std::endl << "Error opening file " << filename << std::endl; 
		exit(0);
  }
  return result;
}

bool GaussianMixture::saveDataFile(const char filename [], Matrix data)
{
  // Save the dataset to a file
  std::ofstream f(filename);
  if (f.is_open()) {
    for (unsigned int j = 0; j < data.RowSize(); j++){
      for (unsigned int i = 0; i < data.ColumnSize(); i++)
	f << data(j,i) << " ";
      f << std::endl;
    }
    f.close();
  }
  return 1;
}

bool GaussianMixture::saveRegressionResult(const char fileMu[], const char fileSigma[], Matrix inData, Matrix outData, Matrix outSigma[])
{
  // Save the result of a regression
  std::ofstream Mu_file(fileMu); // regressed data
  std::ofstream Sigma_file(fileSigma); // covariances matrices
  for(unsigned int i=0;i<outData.RowSize();i++) {
    Mu_file << inData(i,0) << " ";
    for(unsigned int j=0;j<outData.ColumnSize();j++) 
      Mu_file << outData(i,j) << " ";
    Mu_file << std::endl;
    for(unsigned int k=0;k<outData.ColumnSize();k++) {
      for(unsigned int j=0;j<outData.ColumnSize();j++)
	Sigma_file << outSigma[i](k,j) << " ";
    }
    Sigma_file << std::endl;
  }
  return 1;
}

bool GaussianMixture::loadParams(const char fileName[])
{
  // Load coefficient of a GMM from a file (stored by saveParams Method
  // or with matlab
  std::ifstream fich(fileName);
  if (!fich.is_open())
    return false;
  fich >> dim >> nState;
  priors = new float[nState];
  for (int s = 0; s < nState; s++)
  {
    fich >> priors[s];
  }
  mu.Resize(nState,dim);
  for (int i = 0; i < nState; i++)
  {
    for (int j = 0;j<dim;j++)
      fich >> mu(i,j);
  }
  sigma = new Matrix[nState];
  for (int s = 0; s < nState; s++)
  {
    sigma[s] = Matrix(dim,dim);
    for (int i = 0; i < dim; i++)
    {
      for (int j = 0;j<dim;j++)
	fich >> sigma[s](i,j);
    }
  }
  return true;
}

void GaussianMixture::debug(void)
{
  /*display on std output info about current parameters */
  Vector v;
  Matrix smat;
  std::cout << "Nb state : "<< this->nState <<std::endl;
  std::cout << "Dimensions : "<< this->dim  <<std::endl;
  std::cout << "Priors : ";
  for(int i = 0;i<nState;i++) {
    std::cout << priors[i] ;
  }
  std::cout << std::endl;
  std::cout << "Means :";
  mu.Print();
  std::cout << "Covariance Matrices :";
  v=Vector(2);
  v(0)=0;
  v(1)=2;
  for(int i =0;i<nState;i++) {
    //float det;
    //Matrix inv;
    //sigma[i].GetMatrixSpace(v,v,inv);
    //inv.Print();
    //std::cout << det << std::endl;
    sigma[i].Print();
  }
}

void GaussianMixture::saveParams(const char filename [])
{
  // save the current GMM parameters, coefficents to a file, to be retrieved 
  // by the loadParams method
  std::ofstream file(filename);
  file << dim << "  ";
  file << nState << std::endl;
  for(int i=0;i<nState;i++) file << priors[i] <<"  ";
  file << std::endl;
  for(int s=0;s<nState;s++) {
    for(int i=0;i<dim;i++) {
      file << mu(s,i) <<"  ";
    }
    file << std::endl;
  }
  for(int s=0;s<nState;s++) {
    for(int j=0;j<dim;j++) {
      for(int i=0;i<dim;i++) {
	file << sigma[s](i,j) <<"  ";
      }
      file << std::endl;
    }
  }
}

Matrix GaussianMixture::HermitteSplineFit(Matrix& inData, int nbSteps, Matrix& outData)
{
  /* Spline fitting to rescale trajectories. */

  if(nbSteps<=0)
    return outData;
    
  const int dataSize  = inData.ColumnSize(); 
  const int inSize    = inData.RowSize();
  const int outSize   = nbSteps;
   
  outData.Resize(outSize,dataSize);
  for(int i=0;i<outSize;i++){
    // Find the nearest data pair
    const float cTime = float(i)/float(outSize-1)*float(inSize-1);
    int   prev, next;
    float prevTime, nextTime;

    prev      = int(floor(cTime));
    next      = prev+1;
    prevTime  = float(prev);
    nextTime  = float(next); 
    const float nphase = (cTime-prevTime)/(nextTime-prevTime);
    const float s1 = nphase;
    const float s2 = s1*nphase;
    const float s3 = s2*nphase; 
    const float h1 =  2.0f*s3 - 3.0f*s2 + 1.0f;
    const float h2 = -2.0f*s3 + 3.0f*s2;
    const float h3 =       s3 - 2.0f*s2 + s1;
    const float h4 =       s3 -      s2;
    // The first column is considered as a temporal value 
    outData(i,0) = (float)i;
    for(int j=1;j<dataSize;j++){
      const float p0 = (prev>0?inData(prev-1,j):inData(prev,j));
      const float p1 = inData(prev,j);
      const float p2 = inData(next,j);      
      const float p3 = (next<inSize-1?inData(next+1,j):inData(next,j));
      const float t1 = 0.5f*(p2-p0);
      const float t2 = 0.5f*(p3-p1);
      outData(i,j) = p1*h1+p2*h2+t1*h3+t2*h4;
    }
  }   
  return outData;  
}

void GaussianMixture::initEM_TimeSplit(int nState,Matrix DataSet)
{
/* init the GaussianMixture by splitting the dataset into 
   time (first dimension) slices and computing variances 
   and means for each slices. 
   once initialisation has been performed, the nb of state is set */

  Vector * mean = new Vector[nState];
  int nData = DataSet.RowSize();
  this->nState = nState;
  this->dim = DataSet.ColumnSize();
  float tmax = 0;
  Matrix index(nState,nData);
  int * pop = new int[nState];
  priors = new float[nState];
  mu.Resize(nState,dim);
  sigma = new Matrix[nState];


  Matrix unity(dim,dim); /* defining unity matrix */
  for(int k = 0;k<dim;k++) unity(k,k)=1.0;

  for(int n = 0;n<nData;n++) /* getting the max value for time */
  {
    if(DataSet(n,0) > tmax) tmax = DataSet(n,0); 
  }
  for(int s=0;s<nState;s++) /* clearing values */
  {
    mean[s].Resize(dim,true);
    pop[s]=0;
  }

  /* divide the dataset into slices of equal time
     (tmax/nState) and compute the mean for each slice
     the pop table index to wich slice belongs each sample */
  for(int n = 0;n<nData;n++) 
  {
    int s = (int)((DataSet(n,0)/(tmax+1))*nState);
    //std::cout << s << std::endl;
    mean[s] += DataSet.GetRow(n);
    index(s,pop[s]) = (float)n;
    pop[s] +=1;
  }
   
  for(int s =0;s<nState;s++)
  {
    mu.SetRow(mean[s]/(float)pop[s],s); /* initiate the means computed before */
    sigma[s]=Matrix(dim,dim);
    priors[s]=1.0f/nState; /* set equi-probables states */
    for(int ind=0;ind<pop[s];ind++)
    {
      for(int i=0;i<dim;i++) /* Computing covariance matrices */
      {
	for(int j=0;j<dim;j++)
	{
	  sigma[s](i,j) += (DataSet((int)index(s,ind),i) - mu(s,i)) \
	    *(DataSet((int)index(s,ind),j)-mu(s,j));
	}
      }
    }
    sigma[s] *= 1.0f/pop[s];
    sigma[s] += unity * 1e-5f; /* prevents this matrix from being non-inversible */
  }
}

int GaussianMixture::doEM(Matrix DataSet)
{
  /* perform Expectation/Maximization on the given Dataset :
     Matrix DataSet(nSamples,Dimensions).
     The GaussianMixture Object must be initialised before 
     (see initEM_TimeSplit method ) */
  
  int nData = DataSet.RowSize();
  int iter = 0;
  float log_lik;
  float log_lik_threshold = 1e-8f;
  float log_lik_old = -1e10f;

  Matrix unity(dim,dim);
  for(int k = 0;k<dim;k++) unity(k,k)=1.0;

    
  //EM loop

  while(true)
  {
    float * sum_p = new float[nData];
    Matrix pxi(nData,nState);
    Matrix pix(nData,nState);
    Vector E;
    
    //char strtmp[64];
    //  sprintf(strtmp, "gmms/%03d.gmm",iter);
    //std::cout << strtmp << std::endl;
    //saveParams(strtmp);

    iter++;
    if (iter>MAXITER){
      std::cout << "EM stops here. Max number of iterations has been reached." << std::endl;
      return iter;
    }

    float sum_log = 0; 

    // Expectation Computing 
    for(int i =0;i<nData;i++)
    {
      sum_p[i]=0;
      for(int j=0;j<nState;j++)
      { 
	float p = pdfState(DataSet.GetRow(i),j);  // P(x|i)
	if(p==0) {
	  std::cout << p << std::endl;    
	  std::cout << "Error: Null probability. Abort.";
		exit(0);
	  return -1;
	}
	pxi(i,j)= p;
	sum_p[i] += p*priors[j];
      } 
      sum_log += log(sum_p[i]);
    }
    for(int j=0;j<nState;j++)
    {
      for(int i=0;i<nData;i++)
      {
	pix(i,j) = pxi(i,j)*priors[j]/sum_p[i]; // then P(i|x) 
      }   
    } 
    
    // here we compute the log likehood 
    log_lik = sum_log/nData; 
    if(fabs((log_lik/log_lik_old)-1) < log_lik_threshold )
    {
      /* if log likehood hasn't move enough, the algorithm has
	 converged, exiting the loop */
      //std::cout << "threshold ok" << std::endl;
      return iter;;
    }
    //std::cout << "likelihood " << log_lik << std::endl;
    log_lik_old = log_lik;

    // Update Step
    pix.SumRow(E);
    for(int j=0;j<nState;j++) 
    {
      priors[j]=E(j)/nData; // new priors 
      Vector tmu(dim);
      Matrix tmsigma(dim,dim);
      for(int i=0;i<nData;i++) // Means update loop
      {
	tmu += DataSet.GetRow(i)*pix(i,j); 
      }   
      mu.SetRow(tmu/E(j),j);
	  
      for(int i=0;i<nData;i++) // Covariances updates
      {
	Matrix Dif(dim,1);
	Dif.SetColumn((DataSet.GetRow(i)-mu.GetRow(j)),0);
	tmsigma += (Dif*Dif.Transpose())*pix(i,j);
      }
      sigma[j] = tmsigma/E(j) + unity * 1e-5f;
    }
  }
  return iter;
}

float GaussianMixture::pdfState(Vector Vin,int state)
{
  /* get the probability density for a given state and a given vector */
  Matrix inv_sigma;
  float det_sigma;
  double p;
  Vector dif;
  sigma[state].Inverse(inv_sigma,&det_sigma); 
  if(sigma[state].IsInverseOk())
  {
    dif = Vin - mu.GetRow(state);
    p=(double)(dif*(inv_sigma*dif));
    p=exp(-0.5*p)/sqrt(pow(2*3.14159,dim)*fabs(det_sigma));
    if(p < 1e-40) return 1e-40f;
    else return (float)p;
  }
  else 
  {
    // sigma[state].Print();
    std::cout << "fail invert sigma matrix" << state << std::endl;
    return 0;
  }
}
        

float GaussianMixture::pdfState(Vector Vin,Vector Components,int state) 
{
  /* Compute the probability density function at vector Vin, 
     (given along the dimensions Components), for a given state */ 
  Vector mu_s;
  Matrix sig_s;
  Matrix inv_sig_s;
  float det_sig;
  float p;
  int dim_s;
  dim_s = Components.Size();
  mu.GetRow(state).GetSubVector(Components,mu_s);
  sigma[state].GetMatrixSpace(Components,Components,sig_s);
  sig_s.Inverse(inv_sig_s,&det_sig);
  if(sig_s.IsInverseOk())
  {
    p = (Vin-mu_s) * ( inv_sig_s*(Vin-mu_s));
    p = exp(-0.5f*p)/sqrt(pow(2.0f*3.14159f,dim_s)*fabs(det_sig));
    return p;
  }
  else
  {
    std::cout << "Error in the inversion of sigma" << std::endl;
		exit(0);
    return 0;
  }
}



Matrix GaussianMixture::doRegression(Matrix in,Matrix * SigmaOut,Vector inComponents,Vector outComponents)
{
  int nData = in.RowSize();
  int outDim = outComponents.Size();
  Matrix Pxi(nData,nState);
  Matrix out(nData,outDim);
  Matrix * subSigma;
  Matrix * subSigmaVar;
  Matrix subMu;
  Matrix subMuIn;
  Matrix subMuOut;
	
  for(int i=0;i<nData;i++)
  {
    float norm_f = 0.0f;
    for(int s=0;s<nState;s++){
      float p_i = priors[s]*pdfState(in.GetRow(i),inComponents,s);
      Pxi(i,s) = p_i;
      norm_f += p_i;
    }
    Pxi.SetRow(Pxi.GetRow(i)/norm_f,i);
  }

  subSigma = new Matrix[nState];
  subSigmaVar = new Matrix[nState];
  mu.GetColumnSpace(outComponents,subMuOut);
  mu.GetColumnSpace(inComponents,subMuIn);

  for(int s=0;s<nState;s++)
  {
    Matrix isubSigmaIn;
    Matrix subSigmaOut;
    sigma[s].GetMatrixSpace(inComponents,inComponents,subSigmaOut);
    subSigmaOut.Inverse(isubSigmaIn);
    sigma[s].GetMatrixSpace(outComponents,inComponents,subSigmaOut);
    subSigma[s] = subSigmaOut*isubSigmaIn;
    sigma[s].GetMatrixSpace(outComponents,outComponents,subSigmaOut);
    sigma[s].GetMatrixSpace(inComponents,outComponents,isubSigmaIn);
    subSigmaVar[s] = subSigmaOut - subSigma[s]*isubSigmaIn;
		
  }
	
  for(int i=0;i<nData;i++)
  {
    Vector sv(outDim,true);
    Vector sp(outDim,true);
    SigmaOut[i] = Matrix(outDim,outDim);
    for(int s=0;s<nState;s++)
    {
      sp = subMuOut.GetRow(s); 
      sp = sp + subSigma[s]*(in.GetRow(i)-subMuIn.GetRow(s));
      sv += sp*Pxi(i,s);

      // CoVariance Computation
      SigmaOut[i]=SigmaOut[i] + subSigmaVar[s]*(Pxi(i,s)*Pxi(i,s));
    }
    out.SetRow(sv,i);
  }
  return out;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品丝袜91| 91精品国产色综合久久不卡蜜臀| 国产三级三级三级精品8ⅰ区| 极品少妇一区二区| 久久欧美中文字幕| 成人av资源在线| 亚洲影院理伦片| 91精品国产综合久久久久久| 久久国产精品色| 国产人久久人人人人爽| 91小视频在线观看| 午夜免费久久看| 欧美精品一区二区三区四区 | 综合欧美一区二区三区| 在线国产亚洲欧美| 六月丁香婷婷久久| 欧美国产一区视频在线观看| av不卡免费在线观看| 亚洲综合清纯丝袜自拍| 欧美一区二区观看视频| 国产成人免费视频精品含羞草妖精| 国产精品久久久久久久久快鸭| 色哟哟国产精品| 久久国产精品一区二区| 亚洲欧美一区二区在线观看| 欧美精品黑人性xxxx| 国产传媒欧美日韩成人| 亚洲亚洲精品在线观看| 久久久久久久久一| 欧美综合久久久| 国产精品亚洲人在线观看| 亚洲精品成人天堂一二三| 日韩视频123| 91美女蜜桃在线| 激情av综合网| 亚洲国产日韩一区二区| 国产亚洲美州欧州综合国| 欧美日韩在线直播| 波多野结衣在线aⅴ中文字幕不卡| 亚洲午夜av在线| 国产精品成人一区二区三区夜夜夜| 精品视频一区二区不卡| 成人免费高清在线| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美一区中文字幕| 99久久久无码国产精品| 久久精品噜噜噜成人88aⅴ| 自拍偷拍国产精品| 久久午夜国产精品| 91精品国产91热久久久做人人 | 精品国内片67194| 欧美中文字幕一区| 91网站黄www| 国产69精品久久久久777| 美女性感视频久久| 日韩精品电影一区亚洲| 亚洲宅男天堂在线观看无病毒| 国产欧美日本一区二区三区| 欧美成人在线直播| 8v天堂国产在线一区二区| 日本韩国欧美三级| 97久久精品人人做人人爽50路| 国模一区二区三区白浆| 美女视频网站久久| 美女性感视频久久| 日本不卡123| 蜜臀91精品一区二区三区| 三级精品在线观看| 天天综合日日夜夜精品| 亚洲国产成人va在线观看天堂| 亚洲日本中文字幕区| 中文字幕在线观看一区二区| 国产精品午夜在线| 中文子幕无线码一区tr| 国产精品久久久久永久免费观看| 国产日韩欧美不卡在线| 欧美经典一区二区| 国产精品青草久久| 亚洲天堂a在线| 亚洲天堂久久久久久久| 亚洲黄色av一区| 亚洲一区二区三区在线播放| 一区二区三区资源| 亚洲高清免费在线| 视频一区国产视频| 久久精品国产一区二区三| 精品一区二区在线免费观看| 国产老肥熟一区二区三区| 丰满亚洲少妇av| 91在线观看视频| 欧美亚洲高清一区| 91精品国产欧美一区二区18| 欧美一区三区二区| 欧美精品一区二| 国产精品私房写真福利视频| 一区免费观看视频| 亚洲电影一区二区三区| 秋霞影院一区二区| 国产高清视频一区| 91免费版pro下载短视频| 精品视频在线免费观看| 欧美福利视频一区| 久久久久久久精| 国产精品国产三级国产普通话三级| 亚洲视频图片小说| 日韩成人免费电影| 国产成人三级在线观看| 一本一本久久a久久精品综合麻豆| 欧美日韩国产精品成人| 久久影音资源网| 亚洲黄色性网站| 精品一区二区成人精品| av电影天堂一区二区在线观看| 欧美日韩二区三区| 久久精品欧美一区二区三区不卡| 亚洲区小说区图片区qvod| 美洲天堂一区二卡三卡四卡视频| 国产 日韩 欧美大片| 欧美日韩国产综合久久| 久久久久久久网| 午夜在线成人av| 东方欧美亚洲色图在线| 欧美日韩成人综合| 国产精品午夜在线观看| 日韩不卡手机在线v区| 丁香婷婷综合激情五月色| 欧美日韩黄色影视| 国产精品久线在线观看| 日韩高清在线一区| 色综合色综合色综合| 久久一区二区视频| 天天综合天天做天天综合| 成人禁用看黄a在线| 日韩欧美激情一区| 有码一区二区三区| 成人免费三级在线| 欧美成人艳星乳罩| 天堂资源在线中文精品| 97久久精品人人爽人人爽蜜臀 | 久久精品人人做人人综合| 一区av在线播放| 不卡在线视频中文字幕| 精品久久久久久亚洲综合网| 亚洲一区二区三区视频在线| 成人午夜精品一区二区三区| 欧美不卡一区二区三区四区| 亚洲资源中文字幕| 91在线精品秘密一区二区| 国产欧美视频在线观看| 久久精品国产澳门| 正在播放亚洲一区| 亚洲高清免费在线| 欧美午夜精品久久久久久孕妇| 国产精品国产a| 成人av影视在线观看| 久久精品男人的天堂| 狠狠色狠狠色综合日日91app| 制服丝袜成人动漫| 三级久久三级久久| 在线播放日韩导航| 婷婷久久综合九色国产成人| 欧美在线高清视频| 亚洲尤物在线视频观看| 欧美亚洲国产一区二区三区va| 一级特黄大欧美久久久| 色综合久久天天| 一区二区不卡在线播放| 欧洲激情一区二区| 亚洲成人自拍一区| 欧美日韩精品一区二区| 午夜精品一区二区三区电影天堂| 欧美三片在线视频观看| 天使萌一区二区三区免费观看| 欧美美女视频在线观看| 日韩激情在线观看| 6080国产精品一区二区| 蜜桃视频在线观看一区二区| 欧美不卡激情三级在线观看| 韩国v欧美v日本v亚洲v| 国产午夜精品一区二区三区四区| 国产91在线观看丝袜| 国产精品电影一区二区| 在线观看欧美黄色| 日日夜夜一区二区| 亚洲精品在线三区| 风流少妇一区二区| 亚洲精品欧美激情| 欧美日韩国产首页在线观看| 强制捆绑调教一区二区| 久久久久久久久久久黄色| 99久久精品国产导航| 亚洲国产精品一区二区久久恐怖片| 欧美三级电影在线看| 蜜桃av一区二区三区电影| 久久精品夜夜夜夜久久| 色吊一区二区三区| 日本亚洲欧美天堂免费| 国产欧美一区二区三区网站 | 精品国精品国产| 99精品桃花视频在线观看|