Как определить наиболее подходящий дистрибутив в Java? - PullRequest
7 голосов
/ 03 июня 2010

У меня есть наборы данных (от 50 до 500 точек, каждая из которых может принимать положительное целое значение), и мне нужно определить, какое распределение лучше всего их описывает. Я сделал это вручную для некоторых из них, но мне нужно автоматизировать это в будущем.

Некоторые из наборов являются полностью модальными (каждый элемент имеет значение 15), некоторые являются сильно модальными или бимодальными, некоторые являются изгибами колокольчиков (часто искаженными и с различными степенями кертоза / точечности), некоторые примерно плоские и существует множество других возможных распределений (опционы, степенные законы и т. д.). Мне нужен способ определить, какое распределение лучше всего описывает данные, и (в идеале) также предоставить мне показатель пригодности, чтобы я знал, насколько я уверен в анализе.

Идеальными будут существующие библиотеки с открытым исходным кодом, за которыми следуют хорошо документированные алгоритмы, которые я могу реализовать самостоятельно.

Ответы [ 7 ]

5 голосов
/ 03 июня 2010

Это может быть сверх того, что вы хотите сделать, но это кажется наиболее полным подходом (и он предоставляет доступ к богатству статистических знаний, доступных в R):

  1. используйте JRI для связи со статистическим языком R
  2. используйте R внутри, как указано в этой теме
5 голосов
/ 03 июня 2010

Поиск подходящего дистрибутива вряд ли даст вам хорошие результаты при отсутствии некоторых априорных знаний. Вы можете найти дистрибутив, который по совпадению подходит, но вряд ли будет базовым.

Есть ли у вас какие-либо метаданные, которые бы указывали на то, что данные означают ? Например, «это открытые данные, взятые из естественной популяции, так что это какое-то нормальное распределение», в отличие от «эти данные по своей природе ограничены в 0 и дискретны, поэтому проверьте на наиболее подходящее значение Пуассона».

Я не знаю ни одного решения для распространения дистрибутива Java на макушке, и я не знаю ни одного, который бы угадывал, какой дистрибутив использовать. Вы можете изучить некоторые статистические свойства (перекос / и т. Д.) И сделать некоторые предположения здесь - но вы, скорее всего, получите случайно подходящую подборку, которая неадекватно представляет базовое распределение. Реальные данные зашумлены, и существует слишком много степеней свободы, если вы даже не знаете, что это за распределение.

3 голосов
/ 03 июня 2010

Посмотрите на Apache commons-math .

2 голосов
/ 03 июня 2010

То, что вы ищете, находится под общим заголовком «совершенство пригодности». Вы можете выполнить поиск по запросу "проверка пригодности".

Дональд Кнут описывает пару популярных тестов на пригодность в полулукционных алгоритмах: критерий хи-квадрат и критерий Колмогорова-Смирнова. Но сначала вы должны иметь представление о том, какой дистрибутив вы хотите протестировать. Например, если у вас есть данные кривой колокольчика, вы можете попробовать нормальное распределение или распределение Коши.

1 голос
/ 03 июня 2010

Если все, что вам действительно нужно для распределения, - это моделировать данные, которые вы выбрали, вы можете сделать свое собственное распределение на основе имеющихся у вас данных:

1. Создайте гистограмму вашего образца: Один из способов выбора размера корзины - здесь . Существуют и другие способы выбора размера корзины, которые вы можете выбрать.

2. Получите образец CDF : Думайте о гистограмме как о своем PDF и просто вычисляйте интеграл. Вероятно, лучше всего масштабировать высоту бункеров так, чтобы у CDF были правильные характеристики ... а именно, что значение CDF при + Infinity равно 1,0.

Чтобы использовать дистрибутив для целей моделирования:

3. Нарисуйте X из вашего распределения: Сделайте ничью Y из U (0,1). Используйте обратный поиск на вашем CDF значения Y, чтобы определить X так, чтобы CDF (X) = Y. Поскольку CDF обратим, X уникален.

0 голосов
/ 07 августа 2018

Вы можете продолжить трехэтапный подход, используя библиотеку SSJ :

  • Подберите каждое распределение отдельно, используя оценку максимального правдоподобия (MLE). Используя SSJ, это можно сделать статическим методом getInstanceFromMLE (double [] x, int n) доступно в каждом дистрибутиве .
  • Для каждого полученного вами распределения рассчитайте его соответствие с реальными данными, например, , используя Колмогорова-Смирнова : static void kolmogorovSmirnov (double [] data, ContinuousDistribution dist, double [] sval, double [] pval) , обратите внимание, что вам не нужно сортировать данные перед вызовом этой функции.
  • Выберите распределение, имеющее наибольшее p-значение , в качестве наиболее подходящего распределения
0 голосов
/ 03 июня 2010

Я слышал о пакете под названием Eureqa , который мог бы хорошо оплатить счет. Я только скачал это; Я сам еще не пробовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...