Статистика в Python

Я хожу на курс машинного обучения, и нам дают первое упражнение по статистике - "программирование".

Итак, упражнение выглядит так:

Вспомните историю из лекции «Два продавца на Amazon имеют одинаковую цену. У одного 90 положительных и 10 отрицательных отзывов. Другой - 2 положительных и 0 отрицательных. У кого покупать? » Запишите апостериорные вероятности надежности (как в лекции). Вычислите p (x> y | D1, D2) с помощью численного интегрирования. Вы можете создать бета-распределенные образцы с помощью функции scipy.stats.beta.rvs (a, b, size).

Из лекции мы знаем следующее:

применили две бета-биномиальные модели: p (x | D1) = Beta (x | 91, 11) и p (y | D2) = Beta (y | 3, 1)

Вычислите вероятность того, что продавец 1 более надежен, чем продавец 2:

p(x > y | D1, D2 ) = ∫∫ [x > y] Beta (x| 91, 11) Beta (y| 3, 1) dx dy

Итак, мои попытки на Python выглядят так:

In [1]: import numpy as np
        from scipy import integrate, stats
In [2]: f = lambda x, y: stats.beta.rvs(91, 11, x) * stats.beta.rvs(3, 1, y)
In [3]: stats.probplot(result, x > y)

И я получаю сообщение об ошибке:

... The maximum number of subdivisions (50) has been achieved....

но в конечном итоге есть ответ на расчет, который составляет ок. 1.7. (Нам говорят, что ответ примерно 0,7)

У меня такой вопрос: как рассчитать часть [x> y], означающую: вероятность того, что продавец 1 (x) более надежен, чем продавец 2 (y)?


person Liat Khitman    schedule 25.10.2018    source источник
comment
Просмотрите и отредактируйте соответственно то, что отображается в виде гиперссылки в отображаемом тексте вашего вопроса (SO не поддерживает Latex). К тому же вопрос не имеет отношения к machine-learning - не спамьте тег (удален).   -  person desertnaut    schedule 25.10.2018
comment
Не могли бы вы пересмотреть свою попытку Python? result, x и y не определены, насколько я могу судить? и вы никогда не используете f   -  person juanpa.arrivillaga    schedule 25.10.2018
comment
Я редактировал HTML-часть. ML-тег был добавлен, потому что упражнение было выполнено в моем ML-классе, но я понимаю, что это напрямую не связано. Спасибо за совет :)   -  person Liat Khitman    schedule 27.10.2018


Ответы (1)


почти правильно, я бы сделал что-то вроде:

from scipy import stats

N = 10000
P = sum(stats.beta.rvs(3, 1, size=N) < stats.beta.rvs(91, 11, size=N))
P / N

и если вам нужен графический дисплей:

import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(0.6, 0.8, 501)
Y = stats.beta.pdf(X, 1 + P, 1 + N - P)

plt.plot(X, Y)

может быть код библиотеки, чтобы сделать построение более красивым.

Приведенный выше ответ дает оценку Монте-Карло. Если вам нужна более точная численная оценка, вы можете получить квадратурную оценку, используя:

from scipy.integrate import dblquad
from scipy import stats

a = stats.beta(91, 11)
b = stats.beta(3, 1)

dblquad(
    lambda x, y: a.pdf(x) * b.pdf(y),
    0, 1, lambda x: x, lambda x: 1)

что дает мне оценку ~ 0,712592804 (с ошибкой 2e-8).

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

https://stats.stackexchange.com/questions/7061/binomial-probability-question

что включает в себя использование некоторых трансцендентальных явлений, которые я изо всех сил пытаюсь осмыслить.

person Sam Mason    schedule 25.10.2018
comment
Огромное спасибо!! Просто небольшой вопрос - где именно я здесь интегрируюсь? хе-хе - person Liat Khitman; 27.10.2018
comment
не думаю, что я действительно читаю ваш вопрос; Я просто исправлял использование вами генерации случайных величин, чтобы получить ответ. если вам нужен более точный ответ (второй блок кода выше просто показывает, насколько точна оценка Монте-Карло), тогда вы, вероятно, захотите использовать dblquad из scipy.integrate и pdf, чтобы получить плотность вероятности из ваших бета-версий - person Sam Mason; 28.10.2018
comment
так что я полностью потерялся. Как мне совместить dblquad и уже рассчитанный P, который вы предложили? def f(x, y): return P * stats.beta.rvs(3, 1, x) * stats.beta.rvs(91, 11, y), а затем integrate.dblquad(f, 0, 1, lambda x: 0, lambda x: 1) явно неверно. - person Liat Khitman; 28.10.2018