Thursday, January 02, 2014

Парадокс Монти Холла

Парадокс Монти Холла - это одна из задачек, где интуиция не работает. Ну, по крайней мере, не работает у людей, малознакомых с теорией вероятности :)

Суть загадки в следующем:

Есть 3 двери. За одной из них - автомобиль, за другими - ничего (в оригинале там козел, но про козлов и так в последнее время слишком много пишут ;)). Ты выбираешь дверь. Затем ведущий открывает одну из оставщихся дверей, за которой козел пусто. Ты можешь поменять свой выбор или остаться со своей дверью.

Вопрос

Стоит ли менять дверь и какая вероятность выиграша в каждом варианте?
Здесь я предлагаю подумать и предложить свой вариант. Как обычно в конце - правильный ответ ;)

Решение

Решить эту задачку, написав программу предлагают на гарвардском курсе по Data Science. Также очень понятное логическое объяснение дано в википедии.  Я же воспользуюсь тем, что гарвард не обязывает подписывать соглашение о неразглашении для своих архивных онлайн курсов и расскажу как я решал эту задачку.
Внимание. Если ты решился пройти курс cs109, то лучше сделай это сам, без моих подсказок :).

Решать задачку предлагается на Python с расширениями для работы с массивами и прочими математическими штуками numpy. Numpy, а также масса других полезностей для дата анализа на питоне уже содержится в инсталлере Anaconda. Установка анаконды тривиальная, детали опустим.

Блокнот

Блокнот - обалденная штука в ipython. После установки anaconda просто запускаем команду:

ipython notebook

И в окне браузера нажимаем New Notebook:

Notebook - это что-то вроде вики, в которую можно вставлять код на питоне. Причем результаты будут отображаться тут же на странице. Код вместе с разметкой автоматически записывается в файл (в данном случае Untitled0.ipynb)



Импортирую модуль Numpy и вывожу его версию:


Определяю функцию simulate_prizedoor, которая будет генерировать массив интов. Каждый элемент массива - номер двери, за которой находится авто.


Очень похожая функция simulate_guess, которая создает массив интов, где каждый элемент - случайный выбор из 3х дверей. Код абсолютно такой же как и в simulate_prizedoor


Дальше определяю функцию goat_door, которая выбирает невыбранную пустую дверь. На входе массив с номером двери, за которой авто и массив с номером выбранной двери.


Функция switch_guesses позволяет менять выбор двери


Дальше функция win_percentage - подсчет процента угадываний


И, наконец, запускаю эксперимент 10тыс раз и выводим результат:



Вывод

Полностью совпадает с теорией. Если менять решение, то вероятность выиграша 66.6%. Подробнее о теории можно почитать в википедии

Ресурсы

1. Гарвардский курс Data Science
2. Парадокс Монти Холла в википедии
3. Анаконда
4. Код здесь: https://github.com/szelenin/cs109