2012-03-27 5 views

答えて

0

これはちょっと遅れた答えです。私はあなたがおそらくそれ以降に移動したと思いますが、私はこれらの自分自身を再実装しなければなりませんでした。私が実装した4つの機能のそれぞれについて、どれだけの変化が気づいたのか注目しました。私はLogGaussMixtureでそのような大きなバリエーションを見ているのは確かですが、同じ野球場です。

// This produces a similar result to ippsLogGaussMultiMix_32f_D2 with a very small error in the 5th or 6th decimal place. 
template< typename Type > void LogGaussMultiMix(Type* pMeans, Type* pCVars, int step, Type* pFeatures, int featureWidth, Type* pDets, Type* pPostProbs, int gaussianNum) 
{ 
    for(int g = 0; g < gaussianNum; g++) 
    { 
     Type sum = 0.0f; 
     for(int f = 0; f < featureWidth; f++) 
     { 
      const Type kFeaturesMinusMean = pFeatures[f] - pMeans[(g * step) + f]; 
      sum  += (kFeaturesMinusMean * kFeaturesMinusMean) * pCVars[(g * step) + f]; 
     } 

     pPostProbs[g] = (Type(-0.5) * sum) + pDets[g]; 
    } 
} 

// This produces a similar result to ippsLogGaussMixture_32f_D2 but with quite a large error at the second decimal place (~0.05!) 
template< typename Type > void LogGaussMixture(Type* pMeans, Type* pCVars, int step, Type* pFeatures, int featureWidth, Type* pDets, int gaussianNum, Type& out) 
{ 
    out = 1.0f; 
    for(int g = 0; g < gaussianNum; g++) 
    { 
     Type sum = 0.0f; 
     for(int f = 0; f < featureWidth; f++) 
     { 
      const Type kFeaturesMinusMean = pFeatures[f] - pMeans[(g * step) + f]; 
      sum  += (kFeaturesMinusMean * kFeaturesMinusMean) * pCVars[(g * step) + f]; 
     } 

     const Type kPostProb = (Type(-0.5) * sum) + pDets[g]; 
     out  += std::log(Type(1) + std::exp(kPostProb)); 
    } 
    out = std::log(out); 
} 

// This function is similar to ippsUpdateGConst_32f with difference at the 5th decimal place. 
template< typename Type > void UpdateGConst(Type* pCVars, int width, Type& det) 
{ 
    Type logSum = 0; 
    for(int i = 0; i < width; i++) 
    { 
     logSum += std::log(pCVars[i]); 
    } 

    // ln(2 * pi) = 1.837877066409346; 
    det = (width * Type(1.837877066409346)) - logSum; 
} 

// This function is like ippsOutProbPreCalc_32f_I and has no discernible error. 
template< typename Type > void OutProbPreCalc(Type* pWeight, Type* pDetIn, Type* pDetOut, int gaussianNum) 
{ 
    for(int g = 0; g < gaussianNum; g++) 
    { 
     pDetOut[g] = pWeight[g] - (Type(0.5) * pDetIn[g]); 
    } 
} 
関連する問題