Tuesday, April 28, 2015

Парадокс дней рождения





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

Задача

Допустим в компании работает 25 человек. Какая вероятность того, что у двух людей из этой компании день рождения в один и тот же день?

Интуитивное решение

Ход мыслей может быть примерно такой: 25 человек, у каждого день рождения 1 раз в 365 дней. Поскольку надо 2 совпадения, то вероятности перемножаются, и, поскольку это надо повторить для всех, то еще умножить на 25:
  \(\frac{25}{365} * \frac{25}{365} * 25\), то есть \(\frac{25}{365}\).

Правильное решение 

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

Пишу код

Для подобных экспериментов, результаты которых можно сразу же опубликовать мне очень нравится Python notebook. Его можно установить себе на компьютер, но я воспользуюсь бесплатным сервисом от https://www.wakari.io

В wakari.io создал новый файл, вставил ячейку (cell) типа Code и в ней заимпортил NumPy и вывел номер версии:

Затем создал функцию, которая создает массив размером n, каждый элемент которого случайное число от 1 до 365:

Эта функция проверяет есть ли в массиве birthdays элементы, которые повторяются больше чем 1 раз:

Запускает эксперимент несколько раз и возвращает количество успешных экспериментов (количество совпадений > 1)

Запускаю эксперимент и получаю вероятность того, что в группе из 23 человек хотя бы у двух совпадут дни рождения:

Вероятность более 50%, то есть интуитивное решение не является правильным.

Wakari.io очень прикольный сервис, он позволяет публиковать свои поделки. Этот код целиком можно глянуть тут: https://www.wakari.io/sharing/bundle/szelenin/birthdays

Ссылки на использованные материалы

Wakari.io -  online сервис для анализа данных на Python.
Парадокс дней рождения на википедиит
- Мой код  https://www.wakari.io/sharing/bundle/szelenin/birthdays


Friday, April 17, 2015

Softmax Regression Pylearn2

На установленном ранее pylearn2 пробую пройти туториал. Начну с softmax регрессии.
ссылка на туториал:
http://nbviewer.ipython.org/github/lisa-lab/pylearn2/blob/master/pylearn2/scripts/tutorials/softmax_regression/softmax_regression.ipynb

Пытаюсь установить ipython

В принципе туториал можно запустить локально. Надо только ipython установить:
Захожу на запущенную Vagrant виртуалку и запускаю команду

sudo pip install "ipython[all]"

Нельзя инсталить без [all]:
sudo pip install ipython
и вот почему: http://stackoverflow.com/questions/24995438/pyzmq-missing-when-running-ipython-notebook

дальше перехожу в папку с туториалом:
cd /home/vagrant/pylearn2/pylearn2/scripts/tutorials/

и запускаю ipython'овский notebook:
sudo ipython notebook

ноутбук запустился в аутентичном текстовом браузере w3m :)

Немного побаловался, но в хроме все-таки удобнее было бы работать :). Для этого надо "перебросить" порт, который внутри виртуальной машины "наружу", чтобы я мог с хост системы зайти браузером.
-Смотрю какой порт использовал ipython :
Добавляю в "forwarded_port" в Vagrant файл (сразу за config.vm.box):
  config.vm.network "forwarded_port", guest: 8888, host: 8888
И перегружаю vagrant (команда vagrant reload):

не заработало... :(

Update

Проблема решилась после того как сделал uninstall ipython (тот, который не [all])
sudo pip uninstall ipython 

и заново проинсталил ipython[all]:
sudo pip install ipython[all]

Оставлю пока ipython, делаю в отдельном файле train.py.


import os
import pylearn2
dirname = os.path.abspath('/vagrant/ml_invsetigaiton/pylearn2_softmax')
with open(os.path.join(dirname, 'sr_dataset.yaml'), 'r') as f:
    dataset = f.read()
hyper_params = {'train_stop' : 50000}
dataset = dataset % (hyper_params)
print dataset


Результат:

vagrant@vagrant-ubuntu-trusty-64:/vagrant/ml_invsetigaiton/pylearn2_softmax$ sudo python train.py
OpenBLAS : Your OS does not support AVX instructions. OpenBLAS is using Nehalem kernels as a fallback, which may give poorer performance.
!obj:pylearn2.datasets.mnist.MNIST {
        which_set: 'train',
        start: 0,
        stop: 50000
}

Что это было?
грубо говоря прочел YAML файл, в котором было описание датасета из набора MNIST. Этот набор поставляется с pylearn2. Всего в наборе 60000 записей, но я передал гиперпараметр, который обозначает, что стопнуть обучение нужно на 50000

короче, скопировал я все степы, запустил, но выдалась такая ошибка:

оказывается надо самому скачать MNIST датасет. Хорошо, что pylearn2 предоставляет для этого скрипт. в папке ~/pylearn2/pylearn2/scripts/datasets запускаю python download_mnist.py:


Запускаю опять, модель в процессе обучения печатает как хорошо она обучается:


Теперь чтобы расшифровать результаты запускаю скрипт print_monitor.py, который находится в /home/vagrant/pylearn2/pylearn2/scripts и передаю ему сгенерированный файл с моделью:


Процент неправильно классифирированых записей из тестового набора 7.68 (test_y_misclass: 0.0768)