ВВЕДЕНИЕ : У меня есть список из более чем 30000 целочисленных значений в диапазоне от 0 до 47 включительно, например, [0,0,0,0,..,1,1,1,1,...,2,2,2,2,...,47,47,47,...]
взятых из некоторого непрерывного распределения. Значения в списке не обязательно в порядке, но порядок не имеет значения для этой проблемы.
ПРОБЛЕМА : Исходя из моего распределения, я хотел бы рассчитать значение p (вероятность увидеть большие значения) для любого данного значения. Например, как вы можете видеть, значение p для 0 будет приближаться к 1, а значение p для больших чисел будет стремиться к 0.
Я не знаю, прав ли я, но для определения вероятностей я думаю, что мне нужно согласовать мои данные с теоретическим распределением, наиболее подходящим для описания моих данных. Я предполагаю, что для определения наилучшей модели необходим какой-то тест на пригодность.
Есть ли способ реализовать такой анализ в Python ( Scipy
или Numpy
)? Не могли бы вы привести примеры?
Спасибо!
источник
Ответы:
Распределительная арматура с ошибкой суммы квадратов (SSE)
Это обновление и модификация ответа Саулло , который использует полный список текущих
scipy.stats
распределений и возвращает распределение с наименьшим SSE между гистограммой распределения и гистограммой данных.Пример примерки
Используя набор данных Эль-Ниньо из
statsmodels
, распределения соответствуют и определяется ошибка. Распределение с наименьшей ошибкой возвращается.Все Распределения
Best Fit Distribution
Пример кода
источник
density=True
вместоnormed=True
вnp.histogram()
. ^^.plot()
методах, чтобы избежать путаницы в будущем. ^^from scipy.stats._continuous_distns import _distn_names
. Затем вы можете использовать что-то подобноеgetattr(scipy.stats, distname)
для каждогоdistname
в _distn_names`. Полезно, потому что дистрибутивы обновляются с различными версиями SciPy.ax = data.plot(kind='hist', bins=50, normed=True, alpha=0.5, color=list(matplotlib.rcParams['axes.prop_cycle'])[1]['color'])
В SciPy 0.12.0 реализовано 82 функции распределения . Вы можете проверить, как некоторые из них соответствуют вашим данным, используя их
fit()
метод . Проверьте код ниже для более подробной информации:Ссылки:
- Распределение фитингов, качество посадки, значение p. Возможно ли это сделать с помощью Scipy (Python)?
- Распределительная арматура со Scipy
А вот список с именами всех функций распределения, доступных в Scipy 0.12.0 (VI):
источник
normed = True
при построении гистограммы? Ты бы не умножилpdf_fitted
наsize
, верно?from scipy.stats._continuous_distns import _distn_names
. Затем вы можете использовать что-то подобноеgetattr(scipy.stats, distname)
для каждогоdistname
в _distn_names`. Полезно, потому что дистрибутивы обновляются с различными версиями SciPy.fit()
Метод, упомянутый @Saullo Castro, обеспечивает оценку максимального правдоподобия (MLE). Лучшее распределение ваших данных - это то, которое дает вам самое высокое, может быть определено несколькими различными способами: например,1, тот, который дает вам наибольшую вероятность регистрации.
2, тот, который дает вам наименьшие значения AIC, BIC или BICc (см. Вики: http://en.wikipedia.org/wiki/Akaike_information_criterion) , в основном можно рассматривать как логарифмическую вероятность, скорректированную на количество параметров, как распределение с большим количеством параметров. Ожидается, что параметры будут соответствовать лучше)
3, тот, который максимизирует байесовскую апостериорную вероятность. (см. вики: http://en.wikipedia.org/wiki/Posterior_probability )
Конечно, если у вас уже есть дистрибутив, который должен описывать ваши данные (основанные на теориях в вашей конкретной области) и вы хотите придерживаться этого, вы пропустите этап определения наиболее подходящего распределения.
scipy
не поставляется с функцией для вычисления правдоподобия журнала (хотя предусмотрен метод MLE), но жесткий код один прост: см. Медленнее ли встроенные функции плотности вероятности `scipy.stat.distributions`, чем предоставленные пользователем?источник
scipy
AFAICU, ваше распределение дискретно (и ничего, кроме дискретного). Поэтому достаточно просто подсчитать частоты различных значений и нормализовать их. Итак, пример, чтобы продемонстрировать это:
Таким образом, вероятность увидеть значения выше, чем
1
просто (согласно дополнительной кумулятивной функции распределения (ccdf) :Обратите внимание, что ccdf тесно связан с функцией выживания (sf) , но он также определяется с помощью дискретных распределений, тогда как sf определяется только для смежных распределений.
источник
Для меня это похоже на проблему оценки плотности вероятности.
Также см. Http://jpktd.blogspot.com/2009/03/using-gaussian-kernel-density.html .
источник
Попробуйте
distfit
библиотеку.pip install distfit
Обратите внимание, что в этом случае все точки будут значимыми из-за равномерного распределения. Вы можете фильтровать с помощью dist.y_pred, если требуется.
источник
С OpenTURNS я бы использовал критерии BIC, чтобы выбрать лучшее распределение, подходящее для таких данных. Это потому, что этот критерий не дает слишком большого преимущества для распределений, которые имеют больше параметров. Действительно, если у распределения есть больше параметров, подобранному распределению легче быть ближе к данным. Кроме того, Колмогоров-Смирнов может не иметь смысла в этом случае, потому что небольшая ошибка в измеренных значениях окажет огромное влияние на значение p.
Чтобы проиллюстрировать этот процесс, я загружаю данные Эль-Ниньо, которые содержат 732 ежемесячных измерения температуры с 1950 по 2010 год:
Легко получить 30 встроенных одномерных фабрик распределений
GetContinuousUniVariateFactories
статическим методом. После этогоBestModelBIC
статический метод возвращает лучшую модель и соответствующий показатель BIC.который печатает:
Для того, чтобы графически сравнить подгонку к гистограмме, я использую
drawPDF
методы наилучшего распределения.Это производит:
Более подробная информация по этой теме представлена в документе BestModelBIC . Можно было бы включить дистрибутив Scipy в SciPyDistribution или даже с дистрибутивами ChaosPy с ChaosPyDistribution , но я предполагаю, что текущий скрипт выполняет большинство практических целей.
источник
Извините, если я не понимаю вашу потребность, но как насчет хранения ваших данных в словаре, где ключами будут числа от 0 до 47 и значения количества вхождений связанных ключей в вашем исходном списке?
Таким образом, ваша вероятность p (x) будет суммой всех значений для ключей больше x, деленной на 30000.
источник