Нужны математические формулы для IPP GMM-функций.Как ippsLogGaussMixture_32f_D2 () и другие - PullRequest
1 голос
/ 27 марта 2012

Пытаюсь заменить мою пользовательскую реализацию вычисления вероятности вероятности для гауссовой смеси на процедуры IPP, например ippsLogGaussMixture_32f_D2, но я не удовлетворен и не понимаю результаты этой функции, поэтому я хочу знать, как она обрабатывает мои входные данныетак что мне нужны формулы.

1 Ответ

0 голосов
/ 19 июня 2015

Хорошо, это немного запоздалый ответ, и я думаю, что вы, вероятно, продолжили с тех пор, но мне просто пришлось заново их реализовать.Я отметил, насколько много я заметил для каждой из 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]);
    }
}
...