Оцените / подгоните данные к распределению exGaussian в Android

Как я могу оценить/подогнать параметры для экспоненциально измененного распределения Гаусса (exGaussian) с помощью JAVA/Android?

Мне нужно что-то вроде следующего псевдокода:

    // some observed data points
    double dataPoints[] = {200,300,400,278,366,466,325,335,322,332};

    // ex-gaussian distribution
    ExponentiallyModifiedGaussianDistribution exGaussian = new ExponentiallyModifiedGaussianDistribution();

    // MLE
    MaximumLikelihoodEstimation MLE = new MaximumLikelihoodEstimation(dataPoints, exGaussian);
    MLE.setGuess(3.0, 1.0, 1.0);
    MLE.compute();

    // get estimated / fitted parameters
    double[] parameterEstimates = MLE.getEstimates();

Есть несколько примеров, демонстрирующих оценку параметров для Гамма-распределение. Но эта библиотека, похоже, не с открытым исходным кодом.

И я нашел реализация экс-гауссовского распределения в JAVA. Но оценка параметра отсутствует.

Я думаю, что есть много способов оценить параметры, например. с использованием оценок максимального правдоподобия (MLE) и т. д.

Обновление 1:

Я не буду использовать меньше более 40 точек данных.

Обновление 2:

Простой альтернативой оценке параметров распределения является метод оценки моментов (описанный в вики )


person lidox    schedule 16.05.2017    source источник


Ответы (3)


ELKI содержит различные оценщики для дистрибутивов (обратите внимание, что для некоторых дистрибутивов у нас есть несколько методов оценки, а для некоторых у нас их еще нет — пожалуйста, внесите свой вклад!):

ExponentiallyModifiedGaussianDistribution dist = 
    EMGOlivierNorbergEstimator.STATIC.estimate(dataPoints, DoubleArrayAdapter.STATIC);

Получится распределение ExGaussian:

> ExGaussianDistribution(mean=0.2675761092764285, stddev=0.07999178722695827,
      lambda=4.4179732613344)

Вы также можете попробовать наилучшую оценку.

Distribution dist = BestFitEstimator.STATIC.estimate(dataPoints, DoubleArrayAdapter.STATIC);

что указывает на то, что сдвинутая логарифмическая норма может лучше подходить для ваших данных (но, тем не менее, ЭМГ теоретически может быть более подходящей для вашей проблемы - сдвинутая логарифмическая норма всегда немного странная).

> LogNormalDistribution(logmean=-1.945322593396174, logstddev=0.968522285758599,
      shift=0.2654438504801123)
person Erich Schubert    schedule 25.06.2017

Возможно, вы сможете получить лучший ответ на stats.stackexchange.com.

Но я думаю, что вы можете создать алгоритм оптимизации, который выполняет сопоставление моментов. В основном вам нужно минимизировать разницу между первым моментом (среднее значение), вторым моментом (дисперсией), третьим моментом (асимметрией) и т. д. между данными выборки и теоретическим распределением.

Вы можете рассматривать целевую функцию как сумму или произведение моментов. Вы также можете использовать различные веса для моментов (среднее значение получает более высокий вес).

Вы можете попытаться получить производную целевой функции, используя метод градиентного спуска (с помощью Mathematica или Sage math), или даже использовать метод конечных разностей для численного вычисления производных. Этот подход широко используется для оценки параметров регрессии, логистической регрессии и ИНС.

И вы также можете использовать метаэвристические алгоритмы (генетический, табуированный поиск и т. д.).

person Danilo M. Oliveira    schedule 16.05.2017
comment
Так что я могу использовать симплекс/оптимизатор Нелдера-Мида для оценки параметров. Существует существующая библиотека в java. - person lidox; 16.05.2017
comment
В статье в википедии предлагают использовать первые 3 момента. en.wikipedia.org/wiki/ (...) Параметры распределения могут быть оценивается по выборочным данным методом моментов следующим образом:[4][5] (...) - person Danilo M. Oliveira; 16.05.2017
comment
хорошо, я могу рассчитать среднее значение и стандартное отклонение. А как же y1? γ1 – асимметрия. как я могу получить значение, имеющее только некоторые точки данных? - person lidox; 16.05.2017
comment
y1 = (среднее / медиана) / стандартное отклонение. Я нашел это ниже перекоса главы. Спасибо за вашу помощь! - person lidox; 16.05.2017

Простой альтернативой оценке параметров распределения является метод моментов (описанный в вики).

Реализация:

    // some observed data points
    double dataPoints[] = {0.464,0.443,0.424,0.386,0.367,0.382,0.455,0.410,0.411,0.424,0.338,0.355,0.342,0.324,
            0.354,0.322,0.364,0.375,1.085,0.575,0.597,0.464,0.414,0.408,1.156,0.819,1.156,1.024,1.152,1.103,
            0.431,0.378,0.358,0.382,0.354,0.435,0.386,0.361,0.397,0.362,0.334,0.357,0.344,0.362,0.317,0.331,
            0.199,0.351,0.284,0.343,0.354,0.336,0.280,0.312,0.778,0.723,0.755,0.774,0.759,0.762,0.490,0.400,
            0.364,0.439,0.441,0.673};

    DescriptiveStatistics maths = new DescriptiveStatistics(dataPoints);
    double sampleMean = maths.getMean();
    double sampleStdDev = maths.getStandardDeviation();
    double sampleSkev = (Math.abs(sampleMean - maths.getPercentile(50)) / sampleStdDev);

    // parameter estimation using method of moments ex-gaussian distribution
    double mean = sampleMean - sampleStdDev * Math.pow(sampleSkev/2., 1./3) ;
    double stdDev = Math.sqrt(sampleStdDev*(1 - Math.pow(sampleSkev/2., 2./3)));
    double tau = sampleStdDev * (Math.pow(sampleSkev/2., 1./3));
    double lambda = 1 / tau;

    ExponentiallyModifiedGaussianDistribution exGaussian = new ExponentiallyModifiedGaussianDistribution(mean, stdDev, lambda);
    System.out.println(sampleStdDev);
    System.out.println(exGaussian.getStddev());

Зависимости Gradle:

группа компиляции: 'de.lmu.ifi.dbs.elki', имя: 'elki', версия: '0.7.1'

группа компиляции: «org.apache.commons», имя: «commons-math3», версия: «3.6»

person lidox    schedule 16.05.2017
comment
Возможно, вам следует вернуть оценщик обратно в ELKI, если он работает надежно... - person Has QUIT--Anony-Mousse; 24.06.2017
comment
Неважно, он уже существует: elki.dbs.ifi.lmu.de/releases/release0.7.1/doc/de/lmu/ifi/dbs/ - person Has QUIT--Anony-Mousse; 24.06.2017