{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Инфраструктура Python. Машинное обучение" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Машинное обучение это построение по достаточно большому набору данных $(X, y)_{i=1}^n$ интерполяционной функции из некоторого достаточно богатого пространства, такой что $y \\approx F(X)$. Это, например, часто позволяет «предсказывать» значение неизвестной, но полезной взаимосвязи для никогда не наблюдавшегося образца, скажем, распознать речь на впервые встреченном аудио в текст, после тренировки на большом массиве распознанных людьми аудиозаписей.\n", "\n", "В машинном обучении выделяют:\n", "\n", "* задачу классификации — $y$ это некоторые категории, часто две, например, «болен» или «здоров», а $X$ данные медобследований\n", "* задачу регрессии — $y$ это некоторое вещественное число, например «цена», а $X$ характеристики домов\n", "* задачу кластеризации — unsupervised машинное обучение, $y$ неизвестны, но $X$ с одинаковыми $y$ в каком-то смысле близки. Мы можем сгруппировать похожие рукописные символы на чужом языке, даже если не знаем, какие символы подразумевались\n", "* поиск аномалий — $y$ неизвестны, но мы хотим опознавать, когда $X$ непохоже на все, виденное ранее, например, если система с многочисленными датчиками впервые начала разваливаться\n", "* снижение размерности — $y$ неизвестны, имеют значительно меньшую размерность, чем $X$, но тем не менее отображают значительную часть взаимосвязей в исходном $X$. Например, вектор координат помеченных точек лица имеет размерность порядка тысяч, но может быть сжат до 12 координат так, что по ним можно восстановить лицо с хорошей точностью." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Основной библиотекой машинного обучения в Python является `sklearn` (она же `scikit-learn`, входит в Anaconda). Для большинства задач она предполагает, что `X` это векторы фич, записанные построчно, а `y` вектор предсказываемых величин." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Пример задачи машинного обучения" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чаще всего в решении задачи классификации исследователь:\n", "* чистит, преобразовывает данные, добавляет ручками фичи\n", "* разбивает данные с известными ответами (обычно несколькими способами) на train и test подвыборку — кроссвалидация\n", "* на train выборке тренирует (`fit`) некоторый классификатор с некоторым набором гиперпараметров\n", "* на test выборке предсказывает (`predict`) ответы натренированным классификатором\n", "* сравнивает вычисленные и известные заранее ответы некоторой функцией качества, усредняя ее по разбиениям на train/test.\n", "* ориентируясь на функцию качества, меняет входные данные, кроссвалидацию, классификатор или гиперпараметры" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В нарративах IPython важно, чтобы при перезапуске кода из нотебука получался тот же результат. Для этого в большинстве алгоритмов библиотек машинного обучения доступен параметр вроде `random_state` или `seed`, для того, чтобы выдача ГСЧ совпадала между запусками." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Библиотека `sklearn` содержит несколько небольших датасетов, которые можно использовать как образцы, например, небольшой датасет про вино: 178 образцов, 13 численных атрибутов для каждого, один из трех классов." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids', 'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines', 'proline']\n", "[[ 1.42300000e+01 1.71000000e+00 2.43000000e+00 ..., 1.04000000e+00\n", " 3.92000000e+00 1.06500000e+03]\n", " [ 1.32000000e+01 1.78000000e+00 2.14000000e+00 ..., 1.05000000e+00\n", " 3.40000000e+00 1.05000000e+03]\n", " [ 1.31600000e+01 2.36000000e+00 2.67000000e+00 ..., 1.03000000e+00\n", " 3.17000000e+00 1.18500000e+03]\n", " ..., \n", " [ 1.32700000e+01 4.28000000e+00 2.26000000e+00 ..., 5.90000000e-01\n", " 1.56000000e+00 8.35000000e+02]\n", " [ 1.31700000e+01 2.59000000e+00 2.37000000e+00 ..., 6.00000000e-01\n", " 1.62000000e+00 8.40000000e+02]\n", " [ 1.41300000e+01 4.10000000e+00 2.74000000e+00 ..., 6.10000000e-01\n", " 1.60000000e+00 5.60000000e+02]]\n", "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n", " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]\n" ] } ], "source": [ "import sklearn.datasets\n", "\n", "dataset = sklearn.datasets.load_wine()\n", "print dataset['feature_names']\n", "print dataset['data']\n", "print dataset['target']" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: pylab import has clobbered these variables: ['test']\n", "`%matplotlib` prevents importing * from pylab and numpy\n" ] } ], "source": [ "%pylab inline" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xlabel('alcohol')\n", "ylabel('hue')\n", "scatter(\n", " dataset['data'][:, dataset['feature_names'].index('alcohol')],\n", " dataset['data'][:, dataset['feature_names'].index('hue')],\n", " c=dataset['target']\n", ");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Фичи в 2D numpy-массиве, предсказываемая переменная в 1D." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(178L, 13L) (178L,)\n" ] } ], "source": [ "X = dataset['data']\n", "Y = dataset['target']\n", "print X.shape, Y.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Разбиение данных на 3 примерно равных куска (fold) (на 2 тренируем, на 1 предсказываем), с примерно исходными долями классов (stratified), с перемешиванием" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sklearn.model_selection\n", "import sklearn.ensemble" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "cv = sklearn.model_selection.StratifiedKFold(n_splits=3, shuffle=True, random_state=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В качестве классификатора — простой и безотказный случайный лес на 100 деревьях" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "rf = sklearn.ensemble.RandomForestClassifier(n_estimators=100, criterion='entropy', random_state=0)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.966666666667\n", "0.983333333333\n", "0.98275862069\n" ] } ], "source": [ "for train, test in cv.split(X, Y):\n", " X_train = X[train]\n", " Y_train = Y[train]\n", " X_test = X[test]\n", " Y_test = Y[test]\n", " rf.fit(X_train, Y_train)\n", " Y_pred_proba = rf.predict_proba(X_test)\n", " Y_pred = rf.predict(X_test)\n", " print sklearn.metrics.accuracy_score(Y_test, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Этот цикл по разбиениям кроссвалидации, с `fit`, `predict`, функцией качества можно записать в одну строчку" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.96666667 0.98333333 0.98275862]\n", "0.977586206897 ± 0.00772484488646\n" ] } ], "source": [ "qs = sklearn.model_selection.cross_val_score(rf, X, Y, scoring='accuracy', cv=cv)\n", "print qs\n", "print mean(qs), '±', std(qs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Натренированный случайный лес считает статистику о том, по какому признаку чаще всего ветвились деревья, что довольно неплохо соответствует тому, какие признаки важны, а какие нет." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(0.17702664133632834, 'flavanoids'),\n", " (0.16999140023532355, 'alcohol'),\n", " (0.15491658127652433, 'proline'),\n", " (0.13544688063922203, 'color_intensity'),\n", " (0.094188110714468781, 'od280/od315_of_diluted_wines'),\n", " (0.068970267741025562, 'total_phenols'),\n", " (0.06553220208373757, 'hue'),\n", " (0.045178197289937883, 'malic_acid'),\n", " (0.028022264615764483, 'magnesium'),\n", " (0.016848326507225814, 'nonflavanoid_phenols'),\n", " (0.016296799390085048, 'ash'),\n", " (0.015298515457697821, 'proanthocyanins'),\n", " (0.012283812712658942, 'alcalinity_of_ash')]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(zip(rf.feature_importances_, dataset['feature_names']), reverse=True)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[58, 1, 0],\n", " [ 1, 68, 2],\n", " [ 0, 0, 48]], dtype=int64)" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.confusion_matrix(Y, sklearn.model_selection.cross_val_predict(rf, X, Y, cv=cv))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Видно, что всего 4 образца были классифицированы неправильно" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Датасеты\n", "\n", "todo\n", "* import skdata.iris.view\n", "* from mnist import load_dataset\n", "* datasets (fetch_mldata, fetch_olivetti_faces, load_boston, load_digits, load_iris, make_classification, make_blobs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Подготовка данных" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Данные можно шкалировать (линейно [min(x), max(x)] → [0, 1]), стандартизовать (линейно $\\bar{x} \\rightarrow 0$, $\\bar{x} + \\sigma \\rightarrow 1$) или нормализовать (построчно! $\\vec{v} \\rightarrow \\frac{\\vec{v}}{\\|\\vec{v}\\|}$)." ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. 2. 3. 4.]\n", " [ 4. 5. 7. 7.]\n", " [ 1. 1. 1. 1.]]\n", "\n", "[[ 0. 0.25 0.33333333 0.5 ]\n", " [ 1. 1. 1. 1. ]\n", " [ 0. 0. 0. 0. ]]\n", "[[-0.70710678 -0.39223227 -0.26726124 0. ]\n", " [ 1.41421356 1.37281295 1.33630621 1.22474487]\n", " [-0.70710678 -0.98058068 -1.06904497 -1.22474487]]\n", "[[ 0.18257419 0.36514837 0.54772256 0.73029674]\n", " [ 0.33927557 0.42409446 0.59373225 0.59373225]\n", " [ 0.5 0.5 0.5 0.5 ]]\n" ] } ], "source": [ "import sklearn.preprocessing\n", "data = array([[1, 2, 3, 4], [4, 5, 7, 7], [1, 1, 1, 1]], dtype=float)\n", "print data\n", "print\n", "print sklearn.preprocessing.MinMaxScaler().fit_transform(data)\n", "print sklearn.preprocessing.scale(data)\n", "print sklearn.preprocessing.normalize(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Подготовка данных\n", "todo\n", "* preprocessing (Imputer, StandardScaler, scale, normalize/Normalizer, Binarizer, MinMaxScaler, LabelEncoder, PolynomialFeatures)\n", "\n", "## Извлечение фич\n", "todo\n", "* feature_extraction.text (CountVectorizer)\n", "* nltk & K" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Кроссвалидация" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Зачем нужна странная схема (кроссвалидация): тренировать на одном поднаборе данных, а предсказывать результат на другом? Проблема в том, что чем сложнее классификатор, чем больше разных функций он может представить, тем проще ему просто запомнить тренировочную выборку, а не улавливать какие-то закономерности в аппроксимируемой функции. В таком случае качество на train растет, а на test с какого-то момента (при итеративном построении классификатора) начинает падать. Это явление называется переобучение.\n", "\n", "todo bias+variance+noise\n", "\n", "http://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import sklearn.model_selection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Основной рабочей лошадкой в кроссвалидации является `KFold`, схема при которой данные разбиваются на `n_splits` примерно равных частей, в качестве test берется одна часть, в качестве train остальные, и так `n_splits` раз. Объекты кроссвалидации из `sklearn` выдают пары массивов индексов `train`, `test` генератором `.split(X[, Y])`." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4 5 6 7 8 9] [0 1 2 3]\n", "[0 1 2 3 7 8 9] [4 5 6]\n", "[0 1 2 3 4 5 6] [7 8 9]\n" ] } ], "source": [ "cv = sklearn.model_selection.KFold(n_splits=3)\n", "X_10 = random.random((10, 3))\n", "for train, test in cv.split(X_10):\n", " print train, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Почти всегда `KFold` используется с `shuffle=True` и установленным `random_state`, чтобы объекты в части брались вперемешку, а не подряд." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 3 5 6 7] [2 4 8 9]\n", "[0 2 3 4 5 8 9] [1 6 7]\n", "[1 2 4 6 7 8 9] [0 3 5]\n" ] } ], "source": [ "cv = sklearn.model_selection.KFold(n_splits=3, shuffle=True, random_state=0)\n", "for train, test in cv.split(X_10):\n", " print train, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если на некоторый важный класс приходится не так много примеров (если классов много или мало данных), то стоит использовать `StratifiedKFold`, который пытается разбивать выборку так, чтобы объекты всех классов были представлены более-менее равномерно.\n", "\n", "Процедуру `KFold` (или `StratifiedKFold`) можно повторять для уменьшения вероятности неожиданностей много (`n_repeats`) раз, используя `RepeatedKFold` (или `RepeatedStratifiedKFold`).\n", "\n", "Другая популярная стратегия — разбивать выборку в определенном соотношении на две части `n_split` раз, она реализована в `ShuffleSplit` (+`StratifiedShuffleSplit`)." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 6 7 3 0 5] [2 8 4 9]\n", "[9 8 0 6 7 4] [3 5 1 2]\n", "[5 1 0 6 9 7] [2 3 8 4]\n", "[7 5 8 0 3 4] [6 1 9 2]\n" ] } ], "source": [ "cv = sklearn.model_selection.ShuffleSplit(n_splits=4, test_size=0.4, random_state=0)\n", "for train, test in cv.split(X_10):\n", " print train, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для предсказания временных рядов используют `TimeSeriesSplit`, при этом объекты должны быть упорядочены по времени. Ряд бьется на `n_splits+1` часть (первая может быть длиннее за счет остатка), затем `n_splits` раз в качестве test выборки берется i+1-й фолд, а в качестве train все до нее." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3] [4 5 6 7]\n", "[0 1 2 3 4 5 6 7] [ 8 9 10 11]\n", "[ 0 1 2 3 4 5 6 7 8 9 10 11] [12 13 14 15]\n" ] } ], "source": [ "cv = sklearn.model_selection.TimeSeriesSplit(n_splits=3)\n", "for train, test in cv.split(range(16)):\n", " print train, test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Цикл `for train, test in cv.split(X, Y)` можно не писать самостоятельно, используя функции-обертки `cross_val_predict` для получения предсказаний классификатора на test-фолдах (расставляемых в соответствии с порядком объектов в `X`), и `cross_val_score` для их качества." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": true }, "outputs": [], "source": [ "cv = sklearn.model_selection.KFold(n_splits=4, shuffle=True, random_state=0)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", " 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.model_selection.cross_val_predict(rf, X, Y, cv=cv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вызов с параметром `method='predict_proba'` вернет 2D массив предсказаний `[№ объекта, № класса] = вероятность`." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-0.12676593, -0.22558422, -0.09682255, -0.12924299])" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.model_selection.cross_val_score(rf, X, Y, scoring='neg_log_loss', cv=cv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Качество классификации" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотреть на сводную табличку истина—предсказание можно с помощью матрицы конфуза" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": true }, "outputs": [], "source": [ "Y_true = [0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1]\n", "Y_pred = [0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,0]" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[8, 2],\n", " [1, 9]], dtype=int64)" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.confusion_matrix(Y_true, Y_pred)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.89 0.80 0.84 10\n", " 1 0.82 0.90 0.86 10\n", "\n", "avg / total 0.85 0.85 0.85 20\n", "\n" ] } ], "source": [ "print sklearn.metrics.classification_report(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы оценивать предсказания классификаторов относительно реальных классов объектов, `sklearn` предлагает ряд полезных вещественных метрик. Наиболее очевидная из них — `accuracy_score`, доля совпавших классов. Первым аргументом метрики принимают истинные классы, вторым предсказанные." ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.84999999999999998" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.accuracy_score(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Например, в медицине часто встречается задача классификации на два класса, где «положительный» класс редок (пациент болен греговирусом), но заметно важнее не пропустить больного, чем лишний раз не обследовать здорового. В таком случае возникают понятия ошибок 1-го и 2-го рода и табличка связанных метрик. True/false относится к тому, угадал ли предиктор, positive/negative к его ответу." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
Реальность\n", "
+ (болен)− (здоров)\n", "
Предсказание+ (болен)TP, true positiveFP, false positive, ошибка 1-го рода
лишние исследования\n", "
− (здоров)FN, false negative, ошибка 2-го рода
недиагностированный пациент мертв
TN, true negative\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Рассматривают две связанные метрики: Precision = TP/(TP+FP) (сколько из положительных пациентов реально больны) и Recall = TP/(TP+FN) (какую долю больных алгоритм обнаружил).\n", "\n", "todo Найти precision-recall анализа на ВИЧ?" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "0.81818181818181823" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.precision_score(Y_true, Y_pred)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.90000000000000002" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.recall_score(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Часто Precision и Recall объединяют в одну метрику, F1-score, равный их среднему гармоническому $\\frac{2}{\\frac{1}{\\mathtt{precision}} + \\frac{1}{\\mathtt{recall}}}$." ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.85714285714285721" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.f1_score(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Другой вариант двух связанных метрик: Sensitivity = Recall = TP/(TP+FN) (какую долю больных алгоритм обнаружил) и Specificity = TN/(FP+TN) (какой доле здоровых не трепали нервы). Самый взвешенный подход к качеству бинарной классификации — ROC AUC. Классификатор выдает вероятности классов, порог меняют с 0 до 1 и рисуют график FPR—TPR (1−Specificity—Sensitivity). График называется ROC curve (receiver operating characteristic curve), а площадь под ним ROC AUC (area under curve). Если классификатор идеальный, AUC = 1, а если выдает рандом, то 0.5." ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": true }, "outputs": [], "source": [ "Y_true = [0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1]\n", "Y_pred = [0.1,0.2,0.1,0.3,0.4,0.1,0.2,0.2,0.8,0.7, 0.9,0.7,0.7,0.8,0.95,0.9,0.6,0.8,0.9,0.3]" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fpr, tpr, thresholds = sklearn.metrics.roc_curve(Y_true, Y_pred)\n", "\n", "gca().set_aspect('equal')\n", "xlabel('TPR')\n", "ylabel('FPR')\n", "xlim([-0.01,1])\n", "ylim([0,1.01])\n", "plot([0,1],[0,1], ls='--', c='gray')\n", "plot(fpr, tpr);" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.90500000000000003" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.roc_auc_score(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если важно, чтобы классификатор возвращал как можно более точные значения вероятности принадлежности к классу, стоит оптимизировать $\\mathtt{logloss} = -\\frac1N\\sum_{n=1}^N\\ \\bigg[y_n \\log \\hat y_n + (1 - y_n) \\log (1 - \\hat y_n)\\bigg]$ ($y_n$ — реальность, $\\hat y_n$ — предсказание вероятности)." ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.39541168726698539" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.log_loss(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo make_scorer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Классификатор\n", "todo\n", "(KNN, RF, SGD, SVC) (predict_proba)\n", "* dummy (DummyClassifier)\n", "* neighbors (DistanceMetric, KNeighborsClassifier, KNeighborsRegressor, NearestNeighbors)\n", " * картинку потому что 3 ваших соседа under age\n", "* linear_model (ElasticNet, SGDClassifier, Lasso, LinearRegression, LogisticRegression, Ridge!)\n", "* svm (LinearSVC, SVC)\n", "* naive_bayes (GaussianNB, MultinomialNB)\n", "* tree (DecisionTreeClassifier, DecisionTreeRegressor, export_graphviz, ExtraTreeClassifier)\n", "* ensemble (RandomForestClassifier, RandomForestRegressor, BaggingRegressor, GradientBoostingRegressor)\n", "* xgboost, lightgbm, catboost" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Бустинг" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Одним из наиболее успешных и универсальных алгоритмов машинного обучения является хорошо натюненный бустинг над деревьями. Помимо `sklearn` их реализацию содержат библиотеки `xgboost` от китайцев, `lightgbm` от MS и `CatBoost` от Яндекса, каждая со своими достоинствами." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", " xgboost (0.40)\n", "\n", " xgboost release 0.4\n", " Open project in xgboost/windows with Visual Studio 2013\n", " Visual Studio 2013, Release, x64\n", " Rebuild xgboost, xgboost_wrapper\n", " Copy all file in xgboost/windows/x64/Release folder to xgboost/wrapper\n", " Go to xgboost/python-package, run command python setup.py install\n", "\n", "\n", " xgboost-0.6\n", " git clone --recursive https://github.com/dmlc/xgboost в какую-нибудь папку\n", " cmake 3.5+, vs 2015 x64\n", " build libxgboost Release -> /lib/libxgboost.dll\n", " cd /python-package; python setup.py install\n", "\n", "\n", " CatBoost\n", "\n", "\n", " lightgbm https://github.com/Microsoft/LightGBM\n", " скачать, windows/LightGBM.sln DLL,x64 build\n", " python-package, python setup.py install\n", " https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.md" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Factorization machines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Factorization machines доступны в Python благодаря библиотеке `lightfm`. Пример использует датасет MovieLens, предразбитый на train и test. В нем одни и те же 943 юзеров оценивают некоторые из 1682 фильмов и нужно предсказать их оценки некоторым другим фильмам (проставленные в test)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo что он и как предсказывает, и как осмысленно считать и трактовать качество http://lyst.github.io/lightfm/docs/lightfm.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "pip install lightfm\n", "```" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from lightfm import LightFM\n", "from lightfm.datasets import fetch_movielens\n", "from lightfm.evaluation import precision_at_k\n", "\n", "# Load the MovieLens 100k dataset. Only five star ratings are treated as positive.\n", "data = fetch_movielens()\n", "\n", "# Instantiate and train the model\n", "model = LightFM(loss='warp')\n", "model.fit(data['train'], epochs=30, num_threads=2)\n", "\n", "# Evaluate the trained model\n", "test_precision = precision_at_k(model, data['test'], k=5).mean()" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [], "source": [ "indices = []\n", "arr = data['test'].tocsr()\n", "for i in range(943):\n", " for j in range(1682):\n", " if arr[i,j]:\n", " indices.append((i, j))" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(0, 19),\n", " (0, 32),\n", " (0, 60),\n", " (0, 116),\n", " (0, 154),\n", " (0, 159),\n", " (0, 170),\n", " (0, 188),\n", " (0, 201),\n", " (0, 264),\n", " (1, 12),\n", " (1, 49),\n", " (1, 250),\n", " (1, 279),\n", " (1, 280),\n", " (1, 289),\n", " (1, 291),\n", " (1, 296),\n", " (1, 311),\n", " (1, 313),\n", " (2, 244),\n", " (2, 293),\n", " (2, 322),\n", " (2, 327),\n", " (2, 330),\n", " (2, 331),\n", " (2, 333),\n", " (2, 334),\n", " (2, 336),\n", " (2, 342),\n", " (3, 49),\n", " (3, 259),\n", " (3, 263),\n", " (3, 287),\n", " (3, 293),\n", " (3, 302),\n", " (3, 353),\n", " (3, 355),\n", " (3, 356),\n", " (3, 360),\n", " (4, 0),\n", " (4, 1),\n", " (4, 16),\n", " (4, 97),\n", " (4, 109),\n", " (4, 224),\n", " (4, 362),\n", " (4, 423),\n", " (4, 438),\n", " (4, 453),\n", " (5, 13),\n", " (5, 22),\n", " (5, 68),\n", " (5, 85),\n", " (5, 97),\n", " (5, 257),\n", " (5, 300),\n", " (5, 462),\n", " (5, 491),\n", " (5, 516),\n", " (6, 31),\n", " (6, 162),\n", " (6, 381),\n", " (6, 429),\n", " (6, 454),\n", " (6, 478),\n", " (6, 491),\n", " (6, 496),\n", " (6, 647),\n", " (6, 660),\n", " (7, 21),\n", " (7, 49),\n", " (7, 78),\n", " (7, 88),\n", " (7, 181),\n", " (7, 293),\n", " (7, 337),\n", " (7, 384),\n", " (7, 456),\n", " (7, 549),\n", " (8, 5),\n", " (8, 285),\n", " (8, 297),\n", " (8, 339),\n", " (8, 478),\n", " (8, 486),\n", " (8, 506),\n", " (8, 520),\n", " (8, 526),\n", " (8, 690),\n", " (9, 6),\n", " (9, 15),\n", " (9, 99),\n", " (9, 174),\n", " (9, 284),\n", " (9, 460),\n", " (9, 485),\n", " (9, 487),\n", " (9, 503),\n", " (9, 610),\n", " (10, 37),\n", " (10, 109),\n", " (10, 110),\n", " (10, 226),\n", " (10, 424),\n", " (10, 557),\n", " (10, 722),\n", " (10, 724),\n", " (10, 731),\n", " (10, 739),\n", " (11, 81),\n", " (11, 95),\n", " (11, 96),\n", " (11, 131),\n", " (11, 142),\n", " (11, 171),\n", " (11, 203),\n", " (11, 299),\n", " (11, 470),\n", " (11, 734),\n", " (12, 55),\n", " (12, 97),\n", " (12, 185),\n", " (12, 197),\n", " (12, 214),\n", " (12, 271),\n", " (12, 343),\n", " (12, 359),\n", " (12, 525),\n", " (12, 835),\n", " (13, 21),\n", " (13, 97),\n", " (13, 110),\n", " (13, 173),\n", " (13, 212),\n", " (13, 268),\n", " (13, 356),\n", " (13, 473),\n", " (13, 529),\n", " (13, 708),\n", " (14, 24),\n", " (14, 126),\n", " (14, 221),\n", " (14, 330),\n", " (14, 404),\n", " (14, 472),\n", " (14, 677),\n", " (14, 684),\n", " (14, 748),\n", " (14, 931),\n", " (15, 7),\n", " (15, 54),\n", " (15, 63),\n", " (15, 88),\n", " (15, 177),\n", " (15, 193),\n", " (15, 196),\n", " (15, 208),\n", " (15, 704),\n", " (15, 943),\n", " (16, 0),\n", " (16, 8),\n", " (16, 12),\n", " (16, 116),\n", " (16, 124),\n", " (16, 150),\n", " (16, 236),\n", " (16, 244),\n", " (16, 507),\n", " (16, 743),\n", " (17, 25),\n", " (17, 85),\n", " (17, 112),\n", " (17, 181),\n", " (17, 201),\n", " (17, 407),\n", " (17, 442),\n", " (17, 495),\n", " (17, 728),\n", " (17, 949),\n", " (18, 3),\n", " (18, 152),\n", " (18, 200),\n", " (18, 257),\n", " (18, 309),\n", " (18, 312),\n", " (18, 381),\n", " (18, 434),\n", " (18, 654),\n", " (18, 691),\n", " (19, 10),\n", " (19, 117),\n", " (19, 171),\n", " (19, 175),\n", " (19, 185),\n", " (19, 193),\n", " (19, 207),\n", " (19, 287),\n", " (19, 404),\n", " (19, 677),\n", " (20, 102),\n", " (20, 128),\n", " (20, 163),\n", " (20, 221),\n", " (20, 323),\n", " (20, 369),\n", " (20, 439),\n", " (20, 446),\n", " (20, 557),\n", " (20, 947),\n", " (21, 78),\n", " (21, 79),\n", " (21, 127),\n", " (21, 240),\n", " (21, 257),\n", " (21, 375),\n", " (21, 376),\n", " (21, 509),\n", " (21, 510),\n", " (21, 790),\n", " (22, 169),\n", " (22, 171),\n", " (22, 195),\n", " (22, 257),\n", " (22, 322),\n", " (22, 380),\n", " (22, 384),\n", " (22, 403),\n", " (22, 462),\n", " (22, 1005),\n", " (23, 63),\n", " (23, 128),\n", " (23, 152),\n", " (23, 190),\n", " (23, 366),\n", " (23, 371),\n", " (23, 426),\n", " (23, 661),\n", " (23, 741),\n", " (23, 762),\n", " (24, 24),\n", " (24, 180),\n", " (24, 207),\n", " (24, 221),\n", " (24, 227),\n", " (24, 256),\n", " (24, 257),\n", " (24, 356),\n", " (24, 500),\n", " (24, 614),\n", " (25, 14),\n", " (25, 24),\n", " (25, 124),\n", " (25, 234),\n", " (25, 257),\n", " (25, 454),\n", " (25, 684),\n", " (25, 929),\n", " (25, 1014),\n", " (25, 1015),\n", " (26, 120),\n", " (26, 245),\n", " (26, 280),\n", " (26, 297),\n", " (26, 369),\n", " (26, 474),\n", " (26, 595),\n", " (26, 741),\n", " (26, 924),\n", " (26, 977),\n", " (27, 6),\n", " (27, 78),\n", " (27, 94),\n", " (27, 97),\n", " (27, 172),\n", " (27, 200),\n", " (27, 208),\n", " (27, 216),\n", " (27, 233),\n", " (27, 379),\n", " (28, 97),\n", " (28, 188),\n", " (28, 244),\n", " (28, 331),\n", " (28, 357),\n", " (28, 538),\n", " (28, 677),\n", " (28, 688),\n", " (28, 747),\n", " (28, 1017),\n", " (29, 81),\n", " (29, 180),\n", " (29, 254),\n", " (29, 285),\n", " (29, 288),\n", " (29, 434),\n", " (29, 538),\n", " (29, 677),\n", " (29, 687),\n", " (29, 1006),\n", " (30, 134),\n", " (30, 301),\n", " (30, 320),\n", " (30, 483),\n", " (30, 492),\n", " (30, 497),\n", " (30, 503),\n", " (30, 681),\n", " (30, 704),\n", " (30, 885),\n", " (31, 116),\n", " (31, 150),\n", " (31, 245),\n", " (31, 248),\n", " (31, 249),\n", " (31, 275),\n", " (31, 289),\n", " (31, 293),\n", " (31, 590),\n", " (31, 1011),\n", " (32, 257),\n", " (32, 291),\n", " (32, 306),\n", " (32, 312),\n", " (32, 327),\n", " (32, 332),\n", " (32, 342),\n", " (32, 750),\n", " (32, 871),\n", " (32, 894),\n", " (33, 241),\n", " (33, 244),\n", " (33, 258),\n", " (33, 285),\n", " (33, 298),\n", " (33, 309),\n", " (33, 311),\n", " (33, 328),\n", " (33, 331),\n", " (33, 689),\n", " (34, 241),\n", " (34, 242),\n", " (34, 258),\n", " (34, 260),\n", " (34, 321),\n", " (34, 331),\n", " (34, 679),\n", " (34, 876),\n", " (34, 880),\n", " (34, 1024),\n", " (35, 267),\n", " (35, 268),\n", " (35, 306),\n", " (35, 318),\n", " (35, 338),\n", " (35, 681),\n", " (35, 747),\n", " (35, 881),\n", " (35, 882),\n", " (35, 884),\n", " (36, 54),\n", " (36, 55),\n", " (36, 78),\n", " (36, 116),\n", " (36, 182),\n", " (36, 221),\n", " (36, 287),\n", " (36, 402),\n", " (36, 539),\n", " (36, 684),\n", " (37, 94),\n", " (37, 138),\n", " (37, 152),\n", " (37, 160),\n", " (37, 327),\n", " (37, 431),\n", " (37, 464),\n", " (37, 572),\n", " (37, 678),\n", " (37, 757),\n", " (38, 257),\n", " (38, 299),\n", " (38, 305),\n", " (38, 312),\n", " (38, 314),\n", " (38, 332),\n", " (38, 344),\n", " (38, 346),\n", " (38, 351),\n", " (38, 899),\n", " (39, 242),\n", " (39, 257),\n", " (39, 267),\n", " (39, 270),\n", " (39, 302),\n", " (39, 332),\n", " (39, 339),\n", " (39, 344),\n", " (39, 753),\n", " (39, 879),\n", " (40, 27),\n", " (40, 30),\n", " (40, 97),\n", " (40, 169),\n", " (40, 264),\n", " (40, 312),\n", " (40, 434),\n", " (40, 485),\n", " (40, 745),\n", " (40, 750),\n", " (41, 43),\n", " (41, 95),\n", " (41, 273),\n", " (41, 402),\n", " (41, 422),\n", " (41, 545),\n", " (41, 587),\n", " (41, 624),\n", " (41, 793),\n", " (41, 1027),\n", " (42, 4),\n", " (42, 13),\n", " (42, 39),\n", " (42, 119),\n", " (42, 136),\n", " (42, 150),\n", " (42, 202),\n", " (42, 203),\n", " (42, 322),\n", " (42, 814),\n", " (43, 14),\n", " (43, 194),\n", " (43, 239),\n", " (43, 257),\n", " (43, 293),\n", " (43, 442),\n", " (43, 448),\n", " (43, 506),\n", " (43, 643),\n", " (43, 659),\n", " (44, 24),\n", " (44, 108),\n", " (44, 117),\n", " (44, 120),\n", " (44, 126),\n", " (44, 471),\n", " (44, 472),\n", " (44, 475),\n", " (44, 762),\n", " (44, 1060),\n", " (45, 126),\n", " (45, 150),\n", " (45, 180),\n", " (45, 287),\n", " (45, 306),\n", " (45, 312),\n", " (45, 327),\n", " (45, 332),\n", " (45, 689),\n", " (45, 1061),\n", " (46, 267),\n", " (46, 291),\n", " (46, 301),\n", " (46, 305),\n", " (46, 320),\n", " (46, 322),\n", " (46, 323),\n", " (46, 339),\n", " (46, 682),\n", " (46, 994),\n", " (47, 173),\n", " (47, 209),\n", " (47, 258),\n", " (47, 307),\n", " (47, 308),\n", " (47, 602),\n", " (47, 608),\n", " (47, 660),\n", " (47, 679),\n", " (47, 689),\n", " (48, 46),\n", " (48, 67),\n", " (48, 301),\n", " (48, 546),\n", " (48, 558),\n", " (48, 580),\n", " (48, 624),\n", " (48, 958),\n", " (48, 994),\n", " (48, 1002),\n", " (49, 8),\n", " (49, 122),\n", " (49, 124),\n", " (49, 245),\n", " (49, 252),\n", " (49, 285),\n", " (49, 324),\n", " (49, 474),\n", " (49, 822),\n", " (49, 1083),\n", " (50, 63),\n", " (50, 82),\n", " (50, 131),\n", " (50, 147),\n", " (50, 181),\n", " (50, 202),\n", " (50, 484),\n", " (50, 495),\n", " (50, 602),\n", " (50, 678),\n", " (51, 94),\n", " (51, 115),\n", " (51, 249),\n", " (51, 256),\n", " (51, 279),\n", " (51, 404),\n", " (51, 497),\n", " (51, 747),\n", " (51, 1008),\n", " (51, 1085),\n", " (52, 23),\n", " (52, 99),\n", " (52, 173),\n", " (52, 180),\n", " (52, 198),\n", " (52, 227),\n", " (52, 249),\n", " (52, 280),\n", " (52, 844),\n", " (52, 923),\n", " (53, 105),\n", " (53, 267),\n", " (53, 297),\n", " (53, 301),\n", " (53, 312),\n", " (53, 594),\n", " (53, 675),\n", " (53, 684),\n", " (53, 741),\n", " (53, 819),\n", " (54, 55),\n", " (54, 88),\n", " (54, 143),\n", " (54, 253),\n", " (54, 256),\n", " (54, 404),\n", " (54, 677),\n", " (54, 684),\n", " (54, 1015),\n", " (54, 1088),\n", " (55, 70),\n", " (55, 90),\n", " (55, 120),\n", " (55, 221),\n", " (55, 446),\n", " (55, 448),\n", " (55, 545),\n", " (55, 754),\n", " (55, 868),\n", " (55, 1046),\n", " (56, 27),\n", " (56, 78),\n", " (56, 203),\n", " (56, 242),\n", " (56, 303),\n", " (56, 418),\n", " (56, 681),\n", " (56, 755),\n", " (56, 759),\n", " (56, 1046),\n", " (57, 8),\n", " (57, 99),\n", " (57, 108),\n", " (57, 143),\n", " (57, 172),\n", " (57, 213),\n", " (57, 267),\n", " (57, 708),\n", " (57, 1097),\n", " (57, 1098),\n", " (58, 22),\n", " (58, 91),\n", " (58, 195),\n", " (58, 234),\n", " (58, 322),\n", " (58, 467),\n", " (58, 484),\n", " (58, 714),\n", " (58, 741),\n", " (58, 950),\n", " (59, 59),\n", " (59, 161),\n", " (59, 207),\n", " (59, 221),\n", " (59, 402),\n", " (59, 426),\n", " (59, 429),\n", " (59, 524),\n", " (59, 603),\n", " (59, 1020),\n", " (60, 242),\n", " (60, 303),\n", " (60, 322),\n", " (60, 327),\n", " (60, 330),\n", " (60, 341),\n", " (60, 346),\n", " (60, 677),\n", " (60, 689),\n", " (60, 1126),\n", " (61, 11),\n", " (61, 20),\n", " (61, 64),\n", " (61, 67),\n", " (61, 256),\n", " (61, 381),\n", " (61, 497),\n", " (61, 664),\n", " (61, 711),\n", " (61, 1015),\n", " (62, 19),\n", " (62, 49),\n", " (62, 99),\n", " (62, 241),\n", " (62, 276),\n", " (62, 288),\n", " (62, 761),\n", " (62, 1006),\n", " (62, 1027),\n", " (62, 1066),\n", " (63, 159),\n", " (63, 175),\n", " (63, 380),\n", " (63, 391),\n", " (63, 432),\n", " (63, 515),\n", " (63, 683),\n", " (63, 735),\n", " (63, 777),\n", " (63, 1062),\n", " (64, 46),\n", " (64, 55),\n", " (64, 96),\n", " (64, 99),\n", " (64, 124),\n", " (64, 195),\n", " (64, 201),\n", " (64, 675),\n", " (64, 805),\n", " (64, 1141),\n", " (65, 0),\n", " (65, 6),\n", " (65, 116),\n", " (65, 180),\n", " (65, 248),\n", " (65, 257),\n", " (65, 297),\n", " (65, 470),\n", " (65, 596),\n", " (65, 876),\n", " (66, 0),\n", " (66, 63),\n", " (66, 120),\n", " (66, 146),\n", " (66, 150),\n", " (66, 239),\n", " (66, 404),\n", " (66, 742),\n", " (66, 1092),\n", " (66, 1094),\n", " (67, 6),\n", " (67, 116),\n", " (67, 117),\n", " (67, 177),\n", " (67, 236),\n", " (67, 244),\n", " (67, 404),\n", " (67, 410),\n", " (67, 741),\n", " (67, 1046),\n", " (68, 11),\n", " (68, 55),\n", " (68, 173),\n", " (68, 174),\n", " (68, 239),\n", " (68, 255),\n", " (68, 257),\n", " (68, 267),\n", " (68, 299),\n", " (68, 426),\n", " (69, 49),\n", " (69, 81),\n", " (69, 209),\n", " (69, 216),\n", " (69, 398),\n", " (69, 418),\n", " (69, 430),\n", " (69, 583),\n", " (69, 745),\n", " (69, 1132),\n", " (70, 55),\n", " (70, 88),\n", " (70, 133),\n", " (70, 221),\n", " (70, 275),\n", " (70, 284),\n", " (70, 345),\n", " (70, 461),\n", " (70, 474),\n", " (70, 922),\n", " (71, 47),\n", " (71, 53),\n", " (71, 181),\n", " (71, 194),\n", " (71, 233),\n", " (71, 567),\n", " (71, 678),\n", " (71, 698),\n", " (71, 865),\n", " (71, 1109),\n", " (72, 11),\n", " (72, 55),\n", " (72, 93),\n", " (72, 126),\n", " (72, 205),\n", " (72, 356),\n", " (72, 474),\n", " (72, 479),\n", " (72, 587),\n", " (72, 656),\n", " (73, 8),\n", " (73, 14),\n", " (73, 99),\n", " (73, 125),\n", " (73, 236),\n", " (73, 271),\n", " (73, 284),\n", " (73, 287),\n", " (73, 325),\n", " (73, 1083),\n", " (74, 120),\n", " (74, 146),\n", " (74, 236),\n", " (74, 239),\n", " (74, 283),\n", " (74, 408),\n", " (74, 475),\n", " (74, 495),\n", " (74, 545),\n", " (74, 1016),\n", " (75, 60),\n", " (75, 91),\n", " (75, 99),\n", " (75, 134),\n", " (75, 174),\n", " (75, 275),\n", " (75, 530),\n", " (75, 581),\n", " (75, 810),\n", " (75, 1128),\n", " (76, 22),\n", " (76, 90),\n", " (76, 124),\n", " (76, 167),\n", " (76, 171),\n", " (76, 194),\n", " (76, 237),\n", " (76, 473),\n", " (76, 483),\n", " (76, 517),\n", " (77, 254),\n", " (77, 256),\n", " (77, 268),\n", " (77, 288),\n", " (77, 297),\n", " (77, 300),\n", " (77, 322),\n", " (77, 411),\n", " (77, 1046),\n", " (77, 1159),\n", " (78, 49),\n", " (78, 99),\n", " (78, 123),\n", " (78, 245),\n", " (78, 268),\n", " (78, 287),\n", " (78, 302),\n", " (78, 507),\n", " (78, 936),\n", " (78, 1160),\n", " (79, 44),\n", " (79, 49),\n", " (79, 57),\n", " (79, 86),\n", " (79, 193),\n", " (79, 268),\n", " (79, 422),\n", " (79, 465),\n", " (79, 581),\n", " (79, 885),\n", " (80, 2),\n", " (80, 168),\n", " (80, 272),\n", " (80, 279),\n", " (80, 410),\n", " (80, 431),\n", " (80, 470),\n", " (80, 475),\n", " (80, 741),\n", " (80, 823),\n", " (81, 55),\n", " (81, 134),\n", " (81, 182),\n", " (81, 193),\n", " (81, 476),\n", " (81, 507),\n", " (81, 596),\n", " (81, 716),\n", " (81, 755),\n", " (81, 1133),\n", " (82, 77),\n", " (82, 96),\n", " (82, 209),\n", " (82, 214),\n", " (82, 233),\n", " (82, 280),\n", " (82, 384),\n", " (82, 575),\n", " (82, 622),\n", " (82, 659),\n", " (83, 11),\n", " (83, 120),\n", " (83, 288),\n", " (83, 321),\n", " (83, 404),\n", " (83, 527),\n", " (83, 528),\n", " (83, 741),\n", " (83, 747),\n", " (83, 1032),\n", " (84, 24),\n", " (84, 50),\n", " (84, 227),\n", " (84, 258),\n", " (84, 426),\n", " (84, 432),\n", " (84, 506),\n", " (84, 587),\n", " (84, 641),\n", " (84, 1064),\n", " (85, 257),\n", " (85, 285),\n", " (85, 299),\n", " (85, 318),\n", " (85, 326),\n", " (85, 871),\n", " (85, 878),\n", " (85, 880),\n", " (85, 888),\n", " (85, 1174),\n", " (86, 39),\n", " (86, 81),\n", " (86, 209),\n", " (86, 273),\n", " (86, 366),\n", " (86, 383),\n", " (86, 400),\n", " (86, 553),\n", " (86, 584),\n", " (86, 1015),\n", " (87, 260),\n", " (87, 300),\n", " (87, 301),\n", " (87, 314),\n", " (87, 320),\n", " (87, 689),\n", " (87, 749),\n", " (87, 880),\n", " (87, 885),\n", " (87, 903),\n", " (88, 116),\n", " (88, 126),\n", " (88, 196),\n", " (88, 215),\n", " (88, 220),\n", " (88, 245),\n", " (88, 380),\n", " (88, 731),\n", " (88, 935),\n", " (88, 1047),\n", " (89, 24),\n", " (89, 97),\n", " (89, 258),\n", " (89, 288),\n", " (89, 346),\n", " (89, 381),\n", " (89, 647),\n", " (89, 899),\n", " (89, 1085),\n", " (89, 1197),\n", " (90, 27),\n", " (90, 171),\n", " (90, 192),\n", " (90, 263),\n", " (90, 322),\n", " (90, 422),\n", " (90, 426),\n", " (90, 479),\n", " (90, 506),\n", " (90, 682),\n", " (91, 76),\n", " (91, 167),\n", " (91, 171),\n", " (91, 228),\n", " (91, 500),\n", " (91, 586),\n", " (91, 738),\n", " (91, 793),\n", " (91, 1048),\n", " (91, 1078),\n", " (92, 14),\n", " (92, 221),\n", " (92, 234),\n", " (92, 274),\n", " (92, 411),\n", " (92, 475),\n", " (92, 476),\n", " (92, 814),\n", " (92, 819),\n", " (92, 844),\n", " (93, 61),\n", " (93, 183),\n", " (93, 264),\n", " (93, 342),\n", " (93, 719),\n", " (93, 743),\n", " (93, 788),\n", " (93, 1216),\n", " (93, 1219),\n", " (93, 1223),\n", " (94, 0),\n", " (94, 67),\n", " (94, 134),\n", " (94, 171),\n", " (94, 232),\n", " (94, 526),\n", " (94, 545),\n", " (94, 624),\n", " (94, 786),\n", " (94, 1216),\n", " (95, 7),\n", " (95, 86),\n", " (95, 90),\n", " (95, 152),\n", " (95, 155),\n", " (95, 478),\n", " (95, 483),\n", " (95, 518),\n", " (95, 644),\n", " (95, 672),\n", " (96, 49),\n", " (96, 88),\n", " (96, 97),\n", " (96, 114),\n", " (96, 193),\n", " (96, 221),\n", " (96, 227),\n", " (96, 481),\n", " (96, 483),\n", " (96, 669),\n", " (97, 46),\n", " (97, 69),\n", " (97, 115),\n", " (97, 162),\n", " (97, 208),\n", " (97, 320),\n", " (97, 516),\n", " (97, 654),\n", " (97, 744),\n", " (97, 937),\n", " (98, 3),\n", " (98, 49),\n", " (98, 78),\n", " (98, 110),\n", " (98, 245),\n", " (98, 267),\n", " (98, 273),\n", " (98, 402),\n", " (98, 872),\n", " (98, 1015),\n", " (99, 265),\n", " (99, 267),\n", " (99, 287),\n", " (99, 301),\n", " (99, 320),\n", " (99, 339),\n", " (99, 343),\n", " (99, 353),\n", " (99, 354),\n", " (99, 749),\n", " ...]" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indices" ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['test'].tocsr()[1,1]" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "9430" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(data['test'].data)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "9430" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(data['test'].tocsr().indices)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "collapsed": true }, "outputs": [], "source": [ "userids, movieids = zip(*indices)" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(9430, 9430)" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(userids), len(movieids)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-6.99811459, -6.43219757, -7.19871473, ..., -4.63822937,\n", " -4.38094759, -5.96341372])" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.predict(array(userids), array(movieids))" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4, 4, 4, 3, 2, 4, 5, 3, 5, 4, 4, 5, 5, 3, 3, 3, 4, 4, 3, 1, 1, 2, 2, 5, 4, 1, 3, 1, 1, 3, 5, 4, 3, 4, 5, 5, 5, 3, 4, 5, 4, 3, 4, 3, 1, 2, 3, 1, 1, 1, 5, 4, 3, 3, 5, 2, 2, 4, 5, 4, 4, 4, 4, 3, 4, 4, 5, 4, 5, 5, 5, 5, 4, 4, 5, 3, 4, 1, 1, 3, 5, 5, 5, 4, 4, 5, 4, 4, 3, 5, 4, 4, 5, 3, 5, 3, 4, 5, 5, 5, 3, 3, 4, 3, 4, 3, 5, 3, 3, 4, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, 4, 4, 3, 5, 4, 2, 4, 3, 2, 3, 3, 3, 5, 5, 4, 2, 4, 5, 5, 3, 2, 3, 3, 2, 1, 1, 4, 1, 1, 5, 5, 5, 2, 5, 5, 5, 5, 5, 1, 4, 3, 3, 3, 1, 4, 2, 2, 3, 3, 4, 4, 5, 4, 3, 5, 3, 5, 3, 3, 4, 4, 3, 4, 4, 2, 3, 5, 3, 3, 2, 4, 3, 2, 3, 3, 2, 1, 3, 4, 1, 4, 5, 2, 4, 1, 1, 5, 5, 1, 4, 4, 5, 3, 5, 3, 1, 5, 4, 1, 4, 4, 2, 5, 2, 4, 4, 4, 4, 3, 5, 3, 4, 5, 2, 4, 5, 5, 4, 5, 5, 5, 4, 4, 4, 4, 5, 4, 3, 5, 4, 3, 4, 2, 3, 3, 3, 2, 3, 3, 4, 4, 3, 4, 4, 2, 2, 3, 3, 2, 5, 4, 3, 5, 3, 3, 4, 3, 4, 4, 4, 4, 3, 4, 2, 2, 3, 2, 2, 4, 4, 4, 4, 5, 2, 5, 3, 2, 3, 5, 4, 4, 4, 5, 5, 4, 5, 2, 5, 2, 3, 3, 4, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 5, 4, 4, 4, 4, 3, 3, 5, 4, 2, 5, 5, 4, 4, 5, 5, 4, 2, 2, 4, 3, 3, 4, 4, 2, 2, 3, 2, 3, 4, 2, 5, 1, 4, 5, 5, 5, 3, 5, 4, 4, 4, 3, 4, 5, 2, 3, 5, 2, 5, 5, 4, 1, 5, 1, 5, 1, 4, 3, 3, 4, 4, 4, 3, 4, 5, 3, 2, 3, 4, 2, 4, 4, 2, 4, 4, 3, 4, 3, 4, 4, 3, 3, 3, 4, 3, 4, 3, 5, 5, 3, 5, 3, 5, 3, 3, 4, 4, 2, 3, 4, 4, 4, 4, 4, 3, 4, 4, 5, 4, 4, 4, 5, 5, 3, 3, 5, 4, 5, 4, 4, 5, 3, 3, 3, 2, 2, 5, 4, 4, 2, 3, 5, 4, 5, 5, 5, 4, 4, 5, 4, 4, 2, 3, 5, 3, 3, 5, 3, 4, 5, 3, 4, 4, 5, 3, 4, 5, 1, 4, 5, 2, 3, 3, 2, 3, 2, 4, 4, 2, 3, 5, 2, 1, 5, 3, 5, 4, 5, 4, 3, 3, 4, 1, 4, 3, 3, 4, 4, 3, 3, 3, 4, 5, 4, 5, 4, 3, 5, 5, 4, 5, 3, 2, 4, 3, 3, 3, 5, 4, 4, 4, 3, 5, 3, 5, 3, 4, 5, 5, 2, 3, 1, 3, 1, 1, 1, 4, 4, 5, 5, 4, 5, 3, 3, 3, 4, 4, 5, 4, 3, 5, 3, 3, 3, 2, 4, 4, 5, 4, 4, 5, 2, 5, 5, 4, 2, 5, 5, 5, 1, 4, 3, 2, 5, 3, 3, 5, 4, 5, 4, 3, 5, 5, 5, 4, 5, 2, 4, 3, 5, 2, 2, 5, 3, 2, 4, 4, 3, 4, 1, 2, 3, 4, 2, 4, 4, 3, 4, 5, 3, 4, 2, 3, 5, 3, 3, 4, 4, 4, 3, 2, 5, 4, 4, 5, 3, 2, 3, 5, 3, 4, 5, 4, 5, 4, 4, 3, 3, 3, 5, 4, 4, 4, 5, 3, 1, 3, 5, 4, 3, 4, 5, 5, 4, 5, 4, 3, 4, 2, 5, 5, 3, 3, 1, 1, 1, 5, 5, 5, 3, 3, 5, 4, 5, 3, 3, 4, 4, 4, 4, 4, 5, 3, 3, 3, 3, 5, 5, 3, 3, 4, 3, 4, 5, 5, 5, 4, 3, 5, 5, 4, 4, 2, 3, 4, 3, 5, 4, 1, 5, 3, 5, 4, 4, 2, 5, 4, 4, 4, 3, 4, 5, 3, 3, 4, 3, 4, 3, 2, 1, 2, 3, 1, 5, 3, 5, 4, 4, 5, 5, 4, 5, 4, 3, 4, 5, 4, 3, 3, 4, 3, 5, 5, 5, 5, 4, 4, 4, 3, 4, 3, 5, 1, 4, 1, 5, 4, 5, 5, 5, 5, 3, 4, 3, 2, 2, 4, 3, 4, 4, 3, 3, 3, 5, 3, 4, 4, 4, 4, 4, 2, 2, 3, 2, 2, 3, 3, 3, 3, 4, 3, 2, 3, 1, 1, 2, 2, 4, 5, 4, 4, 5, 4, 4, 4, 4, 5, 4, 5, 3, 3, 5, 5, 3, 4, 4, 2, 2, 3, 2, 3, 3, 4, 3, 4, 3, 5, 3, 3, 3, 4, 3, 2, 2, 5, 5, 3, 5, 5, 4, 4, 4, 2, 4, 4, 4, 5, 4, 3, 4, 1, 4, 2, 5, 5, 5, 5, 5, 5, 5, 1, 5, 4, 5, 5, 3, 5, 5, 2, 3, 4, 5, 4, 4, 4, 5, 4, 4, 3, 4, 2, 5, 4, 4, 4, 3, 3, 4, 4, 3, 2, 3, 2, 3, 1, 3, 5, 4, 4, 4, 2, 4, 5, 4, 3, 4, 3, 2, 4, 4, 1, 4, 4, 3, 3, 3, 5, 4, 3, 4, 4, 4, 2, 4, 2, 3, 5, 4, 5, 4, 4, 4, 5, 4, 5, 4, 5, 5, 4, 5, 3, 5, 5, 5, 3, 5, 4, 3, 5, 3, 2, 3, 5, 3, 3, 3, 5, 5, 4, 1, 3, 3, 1, 4, 1, 5, 2, 3, 2, 4, 1, 3, 4, 2, 4, 4, 3, 3, 2, 3, 3, 2, 4, 3, 3, 3, 3, 2, 3, 2, 3, 1, 3, 3, 2, 3, 4, 5, 4, 3, 5, 4, 4, 3, 3, 5, 2, 4, 2, 3, 3, 2, 2, 1, 1, 1, 5, 4, 5, 4, 4, 4, 2, 4, 3, 3, 4, 4, 3, 4, 4, 4, 3, 4, 4, 2, 4, 4, 5, 2, 1, 4, 4, 2, 3, 5, 3, 4, 4, 3, 3, 3, 3, 5, 3, 4, 4, 3, 3, 2, 3, 4, 1, 4, 3, 4, 3, 2, 4, 3, 3, 4, 1, 3, 2, 2, 5, 3, 4, 4, 3, 4, 4, 3, 2, 3, 5, 5, 4, 1, 4, 3, 4, 3, 4, 1, 4, 5, 2, 4, 3, 5, 5, 3, 5, 5, 2, 5, 5, 3, 4, 3, 4, 3, 3, 5, 5, 4, 3, 4, 5, 4, 5, 2, 4, 4, 2, 3, 4, 3, 4, 3, 3, 3, 3, 3, 5, 5, 4, 4, 5, 5, 5, 2, 3, 2, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 4, 3, 5, 5, 4, 5, 3, 3, 2, 4, 5, 4, 2, 4, 5, 5, 1, 2, 3, 3, 2, 5, 3, 3, 5, 4, 4, 5, 3, 4, 4, 5, 5, 2, 3, 4, 5, 5, 5, 4, 3, 3, 3, 4, 5, 3, 3, 4, 2, 5, 4, 1, 4, 4, 4, 5, 5, 5, 2, 5, 1, 4, 3, 2, 3, 4, 4, 3, 3, 3, 2, 5, 5, 2, 4, 5, 5, 1, 1, 4, 5, 5, 4, 5, 4, 4, 4, 4, 1, 4, 3, 4, 5, 4, 4, 3, 4, 3, 2, 3, 2, 2, 1, 2, 4, 3, 4, 4, 4, 3, 3, 4, 3, 3, 4, 5, 4, 3, 3, 2, 5, 5, 4, 4, 4, 5, 4, 4, 4, 4, 3, 3, 4, 5, 5, 1, 5, 3, 3, 4, 4, 2, 3, 3, 4, 2, 3, 3, 5, 4, 2, 4, 5, 4, 4, 3, 3, 2, 3, 4, 2, 3, 3, 3, 5, 4, 4, 4, 5, 4, 2, 4, 4, 4, 5, 5, 5, 5, 4, 5, 5, 4, 5, 4, 5, 4, 4, 4, 5, 4, 4, 4, 4, 5, 5, 3, 4, 4, 4, 5, 4, 4, 4, 4, 3, 4, 4, 3, 4, 3, 3, 3, 2, 4, 5, 4, 3, 5, 5, 5, 5, 5, 2, 3, 4, 4, 3, 5, 5, 4, 1, 4, 3, 4, 4, 5, 3, 5, 4, 5, 5, 5, 3, 3, 3, 3, 4, 5, 3, 4, 4, 4, 4, 3, 2, 5, 5, 2, 3, 2, 2, 2, 1, 3, 4, 3, 4, 3, 4, 4, 3, 1, 5, 4, 4, 4, 5, 4, 5, 4, 4, 4, 2, 5, 4, 5, 5, 1, 5, 2, 1, 5, 4, 5, 5, 3, 4, 2, 2, 1, 2, 2, 2, 4, 4, 4, 2, 2, 4, 5, 4, 5, 4, 1, 5, 5, 3, 2, 5, 4, 3, 5, 5, 3, 3, 5, 5, 5, 3, 5, 3, 2, 5, 5, 2, 5, 5, 3, 1, 2, 3, 2, 3, 2, 3, 5, 3, 4, 2, 4, 4, 4, 4, 4, 4, 3, 3, 4, 2, 2, 2, 2, 2, 2, 3, 4, 3, 4, 4, 3, 3, 4, 5, 4, 3, 5, 5, 1, 5, 4, 4, 3, 2, 3, 4, 3, 2, 4, 4, 3, 2, 3, 5, 4, 4, 5, 4, 4, 4, 3, 4, 3, 5, 2, 5, 4, 4, 5, 5, 5, 5, 2, 4, 3, 4, 1, 4, 2, 1, 2, 5, 3, 1, 3, 4, 4, 4, 4, 2, 4, 3, 4, 4, 5, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 5, 4, 4, 2, 4, 4, 3, 5, 5, 4, 3, 5, 4, 5, 2, 3, 4, 5, 4, 5, 4, 3, 5, 5, 5, 5, 4, 1, 2, 4, 1, 1, 3, 1, 3, 4, 4, 4, 1, 5, 5, 2, 1, 4, 2, 4, 4, 5, 5, 3, 4, 5, 4, 5, 1, 4, 3, 3, 5, 5, 5, 3, 5, 3, 5, 3, 4, 5, 3, 5, 3, 4, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 3, 3, 3, 3, 4, 3, 3, 3, 5, 4, 5, 4, 5, 4, 4, 5, 5, 3, 1, 5, 4, 5, 1, 1, 5, 5, 5, 5, 4, 2, 4, 3, 5, 3, 4, 5, 3, 1, 4, 5, 3, 2, 3, 5, 5, 3, 1, 4, 5, 1, 4, 4, 4, 1, 4, 2, 4, 3, 4, 4, 4, 3, 4, 4, 4, 4, 3, 4, 5, 4, 5, 5, 1, 1, 4, 1, 5, 4, 1, 5, 3, 3, 4, 5, 5, 3, 4, 3, 2, 4, 2, 1, 1, 2, 1, 1, 1, 1, 5, 3, 3, 5, 3, 3, 5, 3, 3, 4, 3, 3, 1, 4, 2, 4, 5, 3, 4, 3, 4, 3, 4, 4, 3, 3, 5, 2, 3, 4, 4, 4, 5, 4, 4, 4, 5, 5, 4, 4, 4, 1, 3, 4, 3, 4, 5, 5, 4, 3, 4, 5, 4, 5, 4, 4, 3, 5, 3, 3, 4, 5, 5, 3, 5, 3, 4, 4, 5, 2, 5, 5, 5, 4, 5, 4, 3, 4, 4, 5, 4, 4, 3, 5, 1, 3, 3, 4, 2, 2, 4, 3, 4, 4, 3, 5, 3, 3, 3, 3, 4, 1, 4, 5, 4, 2, 3, 4, 4, 5, 1, 4, 3, 4, 4, 3, 3, 3, 4, 4, 3, 3, 4, 3, 3, 2, 2, 4, 2, 2, 3, 4, 4, 3, 4, 4, 4, 4, 4, 1, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5, 3, 5, 3, 4, 3, 3, 4, 5, 5, 1, 4, 3, 1, 2, 5, 4, 3, 4, 3, 3, 4, 5, 4, 5, 1, 2, 1, 4, 1, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 1, 5, 4, 3, 3, 1, 4, 2, 2, 4, 3, 2, 3, 4, 3, 1, 3, 4, 1, 5, 4, 4, 3, 5, 1, 2, 3, 5, 3, 4, 3, 4, 4, 2, 3, 5, 1, 4, 5, 1, 3, 3, 4, 3, 3, 4, 4, 4, 1, 1, 1, 5, 5, 1, 4, 1, 1, 2, 4, 1, 3, 3, 2, 3, 4, 5, 2, 3, 3, 2, 5, 5, 4, 3, 5, 1, 4, 4, 4, 5, 4, 5, 2, 2, 2, 2, 4, 1, 3, 2, 3, 4, 4, 5, 5, 5, 5, 5, 4, 5, 4, 1, 5, 3, 4, 2, 3, 4, 3, 2, 1, 1, 3, 5, 4, 5, 4, 4, 4, 5, 4, 3, 5, 5, 4, 1, 5, 3, 4, 4, 4, 3, 4, 4, 3, 4, 3, 4, 4, 3, 4, 5, 4, 3, 4, 4, 4, 2, 4, 5, 5, 5, 2, 4, 5, 5, 3, 4, 3, 4, 3, 4, 5, 1, 5, 4, 2, 5, 4, 4, 4, 3, 3, 5, 3, 4, 3, 3, 5, 3, 1, 1, 5, 5, 5, 4, 1, 4, 3, 3, 5, 5, 4, 4, 4, 4, 1, 3, 3, 4, 5, 4, 4, 4, 4, 3, 4, 3, 4, 2, 4, 4, 4, 3, 2, 4, 3, 5, 4, 3, 2, 3, 4, 3, 1, 3, 3, 1, 2, 2, 3, 3, 4, 4, 4, 4, 3, 1, 3, 2, 4, 5, 2, 5, 4, 5, 5, 5, 4, 4, 4, 5, 4, 3, 5, 4, 5, 4, 2, 4, 3, 4, 2, 4, 3, 4, 3, 5, 5, 4, 1, 3, 4, 5, 4, 3, 3, 4, 4, 1, 1, 4, 2, 1, 1, 1, 4, 1, 2, 1, 3, 4, 4, 5, 5, 4, 4, 5, 5, 2, 4, 5, 3, 1, 4, 4, 4, 3, 4, 4, 4, 2, 5, 5, 5, 4, 2, 5, 3, 5, 5, 3, 4, 5, 4, 5, 4, 4, 4, 5, 3, 4, 4, 4, 3, 3, 4, 2, 3, 3, 5, 4, 4, 4, 5, 4, 5, 4, 4, 4, 5, 3, 4, 3, 2, 5, 4, 5, 3, 5, 4, 4, 5, 4, 4, 4, 2, 4, 5, 5, 4, 3, 3, 3, 3, 4, 3, 3, 2, 3, 5, 4, 5, 5, 3, 5, 5, 5, 5, 5, 5, 5, 4, 3, 5, 5, 3, 3, 3, 5, 4, 3, 4, 4, 3, 2, 2, 5, 5, 4, 4, 4, 3, 5, 5, 5, 5, 5, 5, 5, 4, 3, 2, 2, 4, 4, 3, 3, 4, 4, 2, 2, 3, 4, 4, 1, 3, 4, 2, 4, 3, 4, 2, 4, 4, 4, 1, 3, 2, 5, 2, 5, 3, 2, 3, 5, 1, 4, 4, 4, 4, 5, 5, 4, 4, 4, 2, 4, 5, 3, 5, 5, 3, 3, 4, 3, 2, 2, 5, 4, 5, 4, 4, 3, 5, 3, 4, 4, 5, 2, 4, 3, 4, 2, 4, 3, 4, 4, 4, 5, 3, 4, 4, 4, 5, 2, 3, 3, 2, 5, 4, 5, 5, 4, 5, 5, 4, 4, 3, 4, 4, 4, 5, 4, 4, 2, 5, 5, 3, 3, 3, 4, 1, 4, 4, 3, 3, 2, 4, 3, 4, 2, 4, 3, 1, 2, 3, 3, 1, 1, 5, 4, 3, 3, 4, 4, 5, 4, 5, 2, 5, 4, 4, 3, 5, 4, 4, 4, 4, 2, 3, 1, 5, 4, 5, 3, 4, 5, 5, 1, 4, 4, 4, 4, 3, 3, 4, 2, 4, 4, 3, 3, 2, 4, 5, 1, 4, 5, 5, 5, 4, 4, 4, 4, 5, 5, 4, 3, 5, 5, 3, 5, 3, 3, 3, 4, 3, 3, 2, 4, 4, 3, 5, 4, 5, 5, 4, 4, 3, 4, 3, 4, 5, 3, 2, 5, 5, 4, 5, 4, 2, 3, 4, 2, 2, 4, 3, 4, 3, 5, 3, 4, 4, 4, 3, 4, 4, 4, 3, 2, 4, 3, 4, 3, 4, 4, 3, 5, 4, 3, 2, 3, 1, 4, 2, 4, 3, 2, 2, 2, 1, 4, 4, 2, 5, 3, 4, 4, 5, 1, 5, 4, 4, 5, 5, 4, 5, 4, 5, 5, 3, 3, 5, 5, 4, 4, 4, 4, 3, 2, 4, 4, 5, 4, 5, 4, 5, 4, 5, 2, 4, 4, 4, 4, 4, 3, 3, 4, 3, 5, 5, 5, 2, 5, 4, 4, 3, 5, 5, 5, 3, 4, 3, 4, 2, 3, 3, 3, 3, 2, 4, 3, 3, 3, 3, 3, 3, 1, 4, 3, 4, 4, 3, 4, 3, 5, 4, 4, 3, 4, 5, 4, 5, 5, 2, 5, 4, 4, 5, 5, 4, 5, 4, 3, 4, 3, 4, 1, 1, 2, 4, 5, 3, 2, 3, 3, 5, 4, 3, 2, 2, 4, 4, 4, 2, 4, 3, 4, 2, 2, 5, 4, 3, 4, 4, 5, 3, 1, 5, 3, 4, 5, 4, 4, 5, 5, 4, 4, 4, 5, 4, 2, 4, 4, 4, 3, 3, 3, 3, 3, 5, 5, 4, 4, 3, 4, 5, 5, 5, 2, 4, 4, 5, 4, 4, 2, 5, 4, 5, 5, 5, 5, 5, 5, 1, 4, 5, 5, 4, 4, 5, 3, 5, 4, 5, 4, 3, 2, 3, 2, 3, 4, 4, 3, 2, 1, 4, 3, 4, 5, 5, 4, 4, 3, 5, 4, 3, 4, 3, 3, 5, 4, 2, 5, 3, 4, 5, 4, 4, 4, 4, 5, 4, 5, 5, 5, 3, 4, 4, 5, 3, 5, 3, 3, 2, 3, 3, 3, 3, 3, 4, 5, 5, 3, 4, 3, 3, 3, 2, 3, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 5, 5, 4, 4, 5, 5, 5, 5, 5, 5, 4, 5, 2, 4, 4, 2, 3, 5, 4, 3, 2, 3, 4, 4, 3, 4, 4, 3, 4, 3, 4, 3, 4, 4, 3, 3, 3, 3, 4, 3, 3, 4, 4, 3, 4, 3, 4, 5, 5, 4, 4, 4, 5, 4, 3, 3, 4, 3, 4, 4, 2, 3, 2, 2, 4, 2, 2, 2, 3, 2, 5, 5, 5, 4, 3, 4, 3, 3, 2, 4, 5, 1, 4, 4, 3, 5, 4, 2, 3, 3, 3, 2, 2, 4, 5, 3, 4, 5, 4, 4, 5, 4, 5, 4, 4, 5, 4, 3, 3, 4, 5, 3, 3, 4, 3, 3, 3, 1, 4, 4, 4, 3, 5, 5, 3, 4, 4, 4, 4, 4, 4, 3, 2, 2, 3, 5, 5, 3, 4, 2, 5, 4, 5, 5, 3, 5, 4, 3, 1, 5, 4, 5, 3, 2, 3, 4, 2, 4, 3, 4, 4, 4, 3, 5, 2, 5, 5, 5, 4, 5, 3, 5, 4, 4, 3, 4, 3, 4, 5, 3, 5, 5, 1, 4, 4, 5, 4, 2, 2, 4, 3, 4, 1, 4, 4, 3, 5, 2, 3, 4, 1, 5, 5, 4, 4, 4, 5, 1, 4, 4, 4, 3, 3, 4, 2, 3, 4, 4, 5, 3, 2, 4, 5, 4, 4, 4, 4, 5, 4, 2, 4, 3, 4, 4, 5, 4, 2, 3, 5, 4, 4, 5, 4, 4, 5, 4, 4, 4, 3, 4, 4, 3, 3, 3, 3, 4, 2, 3, 5, 4, 5, 5, 3, 5, 5, 5, 5, 4, 5, 4, 2, 4, 4, 3, 5, 4, 2, 4, 4, 2, 4, 3, 5, 3, 5, 4, 5, 5, 4, 5, 3, 5, 1, 2, 5, 3, 3, 4, 4, 4, 4, 5, 2, 4, 3, 4, 2, 3, 4, 5, 4, 5, 3, 4, 2, 2, 3, 4, 2, 4, 4, 4, 3, 5, 4, 3, 3, 4, 4, 3, 4, 4, 4, 3, 3, 4, 3, 4, 4, 2, 4, 5, 4, 5, 5, 5, 4, 5, 3, 5, 4, 5, 5, 4, 3, 3, 3, 2, 3, 2, 5, 5, 5, 4, 5, 5, 4, 5, 3, 3, 5, 3, 5, 4, 1, 4, 5, 5, 4, 3, 4, 4, 3, 4, 2, 2, 4, 5, 2, 4, 4, 3, 4, 4, 4, 1, 3, 4, 5, 3, 3, 3, 3, 1, 2, 3, 1, 1, 3, 1, 2, 5, 3, 5, 3, 3, 4, 4, 5, 4, 3, 4, 3, 3, 4, 3, 3, 4, 4, 3, 3, 4, 3, 3, 5, 3, 4, 4, 5, 1, 5, 4, 4, 4, 5, 5, 5, 4, 5, 5, 4, 5, 3, 1, 4, 3, 5, 5, 3, 4, 5, 5, 3, 3, 3, 4, 1, 3, 4, 2, 3, 4, 3, 5, 5, 4, 2, 3, 4, 3, 3, 3, 5, 3, 3, 3, 5, 2, 4, 2, 5, 4, 4, 3, 4, 4, 4, 3, 3, 3, 4, 5, 3, 3, 3, 4, 3, 3, 1, 1, 5, 5, 5, 5, 4, 3, 3, 4, 4, 3, 4, 5, 3, 5, 4, 4, 4, 4, 4, 5, 2, 2, 2, 4, 1, 2, 4, 2, 4, 4, 4, 3, 5, 4, 4, 4, 4, 4, 4, 5, 4, 5, 1, 4, 4, 3, 5, 5, 4, 4, 3, 3, 1, 4, 1, 4, 5, 4, 4, 4, 5, 2, 5, 5, 3, 5, 2, 2, 5, 4, 5, 3, 4, 5, 3, 4, 3, 4, 5, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 3, 5, 4, 4, 5, 5, 4, 1, 2, 3, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 2, 4, 2, 3, 4, 1, 3, 3, 4, 4, 4, 4, 3, 5, 4, 4, 3, 5, 3, 5, 3, 4, 4, 3, 2, 4, 5, 3, 1, 2, 4, 3, 4, 3, 4, 4, 2, 4, 2, 4, 3, 5, 5, 2, 2, 5, 2, 2, 4, 4, 3, 2, 4, 3, 2, 2, 5, 3, 4, 4, 3, 5, 2, 4, 3, 2, 5, 3, 2, 4, 4, 4, 5, 5, 1, 3, 4, 5, 5, 3, 5, 5, 5, 5, 5, 5, 2, 5, 5, 4, 5, 4, 3, 5, 4, 4, 4, 4, 3, 2, 3, 4, 2, 3, 4, 3, 2, 5, 5, 4, 3, 5, 5, 3, 5, 2, 3, 4, 3, 2, 3, 3, 5, 4, 5, 3, 3, 4, 4, 5, 4, 1, 4, 3, 5, 5, 4, 5, 5, 5, 5, 5, 4, 5, 5, 4, 3, 4, 4, 3, 5, 3, 3, 5, 4, 5, 3, 3, 5, 3, 2, 3, 2, 4, 4, 1, 3, 3, 3, 4, 4, 4, 4, 2, 4, 3, 2, 4, 5, 4, 3, 5, 3, 5, 3, 3, 4, 3, 5, 4, 3, 5, 2, 4, 4, 4, 3, 4, 5, 3, 3, 3, 4, 3, 3, 3, 2, 5, 4, 5, 3, 5, 4, 2, 2, 4, 5, 4, 3, 3, 3, 3, 2, 4, 5, 4, 4, 5, 4, 5, 5, 2, 4, 4, 5, 4, 2, 2, 3, 3, 3, 3, 4, 5, 3, 4, 2, 2, 5, 4, 4, 5, 2, 4, 5, 4, 5, 4, 5, 4, 3, 4, 4, 4, 4, 4, 4, 2, 3, 4, 5, 4, 4, 3, 5, 4, 5, 3, 4, 3, 4, 3, 3, 5, 2, 3, 4, 5, 4, 4, 4, 3, 4, 3, 4, 1, 3, 4, 3, 5, 4, 4, 5, 5, 5, 5, 4, 4, 3, 4, 4, 4, 4, 3, 5, 4, 3, 5, 4, 4, 5, 4, 2, 4, 4, 5, 4, 4, 5, 5, 4, 5, 3, 5, 1, 5, 3, 5, 5, 5, 5, 2, 4, 5, 4, 4, 4, 3, 4, 3, 3, 4, 2, 2, 3, 4, 3, 4, 5, 3, 4, 5, 4, 4, 5, 4, 3, 3, 3, 5, 5, 3, 5, 5, 5, 3, 4, 4, 4, 3, 4, 4, 3, 3, 4, 3, 4, 5, 4, 5, 3, 4, 3, 3, 1, 4, 3, 3, 5, 5, 4, 4, 2, 5, 3, 3, 4, 3, 3, 3, 2, 4, 3, 3, 3, 3, 3, 3, 4, 4, 3, 4, 4, 3, 3, 4, 4, 3, 1, 3, 2, 2, 4, 3, 4, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 5, 3, 5, 4, 5, 3, 5, 4, 4, 3, 4, 4, 4, 4, 5, 2, 4, 2, 3, 3, 4, 2, 4, 1, 1, 1, 1, 3, 1, 1, 1, 1, 5, 5, 3, 5, 4, 4, 5, 2, 3, 4, 4, 4, 4, 4, 4, 3, 2, 3, 4, 3, 3, 3, 4, 3, 5, 5, 3, 3, 3, 5, 2, 5, 4, 3, 3, 2, 4, 1, 2, 1, 4, 1, 3, 2, 5, 3, 2, 3, 2, 3, 5, 5, 3, 4, 4, 4, 4, 4, 4, 3, 3, 4, 3, 4, 4, 3, 3, 5, 4, 4, 3, 5, 4, 3, 1, 4, 5, 3, 4, 4, 5, 5, 3, 3, 5, 2, 4, 4, 5, 1, 5, 4, 5, 5, 1, 5, 4, 3, 4, 5, 4, 5, 4, 5, 3, 5, 4, 4, 1, 3, 4, 5, 2, 4, 4, 3, 3, 3, 3, 3, 5, 5, 2, 2, 4, 3, 2, 3, 1, 1, 5, 4, 4, 4, 4, 5, 5, 4, 5, 4, 3, 4, 5, 5, 5, 3, 4, 4, 3, 5, 5, 4, 5, 4, 3, 5, 5, 4, 4, 4, 2, 4, 4, 4, 2, 3, 4, 4, 5, 4, 4, 4, 5, 3, 5, 3, 4, 3, 4, 4, 5, 4, 4, 3, 5, 5, 3, 1, 2, 4, 4, 3, 2, 3, 4, 5, 2, 2, 3, 2, 4, 5, 5, 4, 4, 5, 4, 4, 4, 4, 5, 4, 4, 3, 5, 5, 5, 5, 5, 5, 4, 4, 5, 4, 4, 4, 2, 5, 5, 4, 3, 4, 3, 5, 3, 5, 3, 4, 4, 3, 4, 5, 4, 5, 1, 4, 4, 2, 4, 3, 4, 4, 3, 4, 3, 4, 4, 3, 3, 2, 5, 4, 4, 5, 3, 3, 3, 3, 4, 4, 5, 5, 4, 5, 5, 2, 5, 2, 2, 4, 4, 5, 5, 3, 4, 3, 5, 2, 4, 3, 3, 4, 3, 3, 3, 5, 3, 3, 2, 2, 4, 1, 3, 4, 3, 3, 4, 5, 4, 5, 5, 4, 4, 3, 5, 4, 4, 5, 3, 2, 4, 4, 5, 5, 4, 5, 4, 5, 5, 2, 3, 5, 4, 3, 5, 4, 3, 3, 4, 3, 5, 1, 3, 4, 4, 3, 5, 5, 4, 4, 5, 4, 3, 3, 4, 3, 2, 3, 2, 4, 1, 3, 3, 3, 4, 4, 3, 3, 2, 2, 5, 5, 4, 5, 2, 4, 5, 3, 2, 3, 5, 5, 4, 4, 3, 4, 4, 4, 3, 2, 1, 2, 3, 3, 1, 1, 1, 1, 1, 4, 4, 2, 1, 2, 2, 3, 2, 2, 3, 1, 4, 3, 5, 5, 4, 4, 4, 4, 3, 2, 4, 3, 5, 4, 4, 1, 4, 4, 5, 1, 5, 5, 4, 3, 4, 2, 4, 4, 4, 4, 3, 4, 5, 5, 5, 5, 3, 3, 4, 4, 4, 1, 2, 1, 5, 4, 4, 3, 2, 1, 2, 3, 2, 5, 3, 4, 2, 3, 3, 2, 4, 4, 3, 5, 4, 2, 4, 4, 1, 2, 4, 4, 3, 3, 3, 3, 4, 2, 2, 4, 3, 5, 5, 3, 4, 3, 3, 3, 3, 3, 3, 4, 3, 3, 1, 3, 4, 3, 4, 3, 4, 5, 2, 4, 4, 5, 4, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 4, 4, 2, 3, 3, 2, 1, 3, 4, 3, 2, 3, 4, 4, 3, 4, 3, 3, 2, 2, 2, 3, 3, 4, 3, 1, 5, 1, 5, 5, 5, 5, 5, 1, 3, 5, 4, 1, 3, 3, 2, 4, 1, 3, 1, 3, 1, 5, 5, 4, 4, 3, 4, 3, 5, 3, 5, 4, 3, 4, 2, 4, 3, 3, 3, 4, 4, 2, 4, 4, 3, 3, 1, 2, 5, 2, 2, 4, 5, 4, 3, 4, 2, 5, 4, 3, 2, 3, 4, 5, 2, 4, 3, 3, 3, 2, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 4, 2, 3, 4, 3, 4, 4, 3, 3, 3, 4, 5, 4, 2, 5, 3, 5, 1, 1, 2, 5, 5, 5, 4, 5, 4, 5, 3, 3, 4, 3, 4, 5, 4, 4, 2, 3, 3, 4, 5, 5, 3, 5, 2, 5, 4, 5, 3, 3, 3, 4, 5, 5, 2, 2, 4, 5, 4, 4, 5, 4, 4, 3, 3, 4, 4, 4, 4, 1, 2, 4, 5, 4, 5, 5, 4, 5, 4, 4, 5, 3, 2, 5, 5, 5, 3, 5, 3, 4, 1, 4, 4, 5, 5, 4, 4, 1, 4, 3, 2, 3, 5, 3, 4, 5, 4, 4, 3, 3, 4, 3, 3, 4, 4, 1, 5, 4, 5, 4, 3, 4, 4, 3, 3, 4, 4, 4, 3, 3, 4, 2, 4, 3, 2, 3, 3, 2, 3, 3, 3, 3, 5, 5, 4, 5, 2, 4, 4, 4, 4, 3, 3, 3, 1, 3, 4, 3, 4, 2, 3, 3, 2, 4, 5, 3, 2, 2, 4, 2, 3, 4, 4, 5, 2, 5, 4, 4, 3, 3, 3, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 2, 4, 4, 3, 3, 3, 2, 4, 5, 3, 4, 1, 2, 2, 3, 3, 3, 1, 1, 4, 5, 4, 5, 5, 4, 4, 5, 5, 3, 3, 3, 4, 5, 3, 5, 2, 4, 5, 3, 4, 5, 5, 5, 3, 4, 4, 5, 5, 4, 3, 5, 5, 4, 4, 5, 4, 4, 4, 4, 5, 3, 2, 5, 4, 5, 5, 4, 3, 3, 3, 1, 3, 2, 3, 2, 4, 3, 3, 2, 3, 2, 2, 1, 2, 3, 2, 3, 3, 1, 2, 4, 2, 4, 4, 5, 5, 4, 3, 3, 3, 3, 2, 4, 4, 2, 5, 5, 3, 3, 4, 2, 3, 3, 3, 3, 5, 5, 4, 3, 3, 5, 4, 3, 4, 4, 4, 4, 3, 4, 3, 1, 4, 4, 4, 3, 3, 3, 2, 2, 4, 5, 5, 3, 5, 5, 4, 5, 5, 1, 4, 4, 4, 1, 3, 4, 4, 4, 4, 4, 4, 4, 1, 3, 4, 5, 4, 3, 1, 1, 4, 3, 4, 2, 4, 4, 4, 5, 3, 4, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 5, 5, 4, 3, 4, 4, 4, 4, 5, 2, 5, 3, 1, 2, 1, 1, 3, 1, 2, 3, 2, 3, 1, 2, 1, 4, 2, 2, 5, 5, 4, 2, 5, 4, 4, 2, 1, 4, 4, 5, 4, 5, 4, 5, 4, 3, 5, 4, 5, 4, 4, 5, 5, 3, 5, 3, 4, 4, 4, 4, 5, 4, 5, 5, 3, 4, 4, 5, 3, 4, 3, 4, 4, 2, 2, 4, 2, 1, 5, 5, 4, 4, 3, 4, 4, 3, 4, 5, 3, 3, 5, 4, 2, 5, 5, 4, 3, 1, 3, 5, 3, 4, 3, 3, 1, 5, 3, 4, 1, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 3, 4, 4, 4, 4, 2, 1, 3, 3, 3, 1, 3, 4, 4, 4, 3, 3, 3, 3, 3, 5, 4, 3, 4, 5, 4, 5, 5, 5, 5, 4, 4, 3, 5, 5, 5, 5, 4, 5, 1, 5, 5, 3, 1, 2, 2, 5, 3, 4, 4, 3, 4, 3, 4, 4, 3, 2, 2, 4, 4, 5, 3, 3, 2, 5, 3, 2, 3, 3, 3, 5, 2, 5, 4, 4, 5, 4, 4, 5, 4, 5, 3, 2, 1, 4, 2, 3, 4, 3, 4, 4, 4, 3, 4, 1, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 2, 1, 3, 5, 5, 3, 4, 1, 1, 4, 5, 4, 4, 5, 5, 5, 4, 3, 3, 5, 5, 5, 3, 4, 2, 4, 4, 2, 2, 4, 1, 5, 5, 4, 5, 5, 4, 4, 5, 3, 4, 3, 4, 3, 2, 5, 3, 3, 2, 5, 4, 4, 2, 5, 5, 4, 5, 5, 4, 2, 3, 3, 3, 3, 4, 3, 3, 3, 3, 1, 1, 3, 5, 4, 4, 4, 4, 3, 5, 3, 4, 5, 3, 4, 5, 4, 5, 3, 5, 5, 5, 3, 4, 5, 5, 4, 3, 3, 3, 3, 4, 4, 5, 3, 4, 3, 3, 5, 4, 4, 5, 3, 2, 3, 4, 4, 4, 2, 3, 4, 4, 4, 4, 3, 5, 4, 4, 3, 4, 4, 3, 3, 4, 2, 2, 1, 3, 3, 2, 4, 3, 2, 4, 4, 4, 5, 4, 5, 4, 3, 3, 4, 5, 5, 2, 4, 5, 4, 5, 3, 4, 4, 3, 2, 4, 5, 4, 3, 4, 4, 4, 5, 4, 4, 5, 3, 4, 4, 3, 4, 4, 5, 4, 3, 3, 4, 3, 5, 3, 4, 3, 1, 3, 2, 4, 5, 4, 5, 2, 2, 4, 1, 4, 5, 3, 3, 5, 5, 5, 1, 5, 3, 4, 3, 3, 2, 4, 3, 3, 3, 3, 5, 3, 5, 3, 4, 4, 5, 5, 4, 4, 4, 4, 5, 4, 5, 3, 4, 3, 3, 3, 4, 4, 4, 5, 4, 5, 4, 5, 3, 3, 5, 5, 4, 5, 2, 5, 5, 5, 5, 5, 5, 4, 4, 4, 2, 2, 4, 3, 4, 4, 4, 5, 5, 5, 4, 5, 5, 4, 5, 2, 4, 4, 5, 3, 1, 5, 2, 4, 3, 4, 3, 1, 3, 2, 4, 1, 4, 2, 3, 3, 5, 5, 3, 1, 2, 2, 3, 4, 3, 3, 1, 1, 5, 5, 5, 5, 4, 5, 2, 4, 5, 4, 4, 5, 3, 4, 4, 2, 5, 4, 4, 4, 3, 3, 4, 4, 4, 3, 3, 2, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 4, 2, 2, 4, 4, 1, 2, 4, 5, 2, 4, 1, 4, 5, 4, 4, 4, 5, 4, 5, 1, 4, 3, 4, 4, 5, 4, 3, 2, 4, 4, 1, 4, 5, 3, 5, 5, 3, 4, 3, 1, 1, 2, 3, 4, 5, 5, 2, 1, 3, 3, 4, 4, 4, 3, 4, 3, 3, 4, 4, 4, 2, 5, 1, 3, 4, 4, 2, 3, 3, 4, 4, 2, 4, 4, 5, 4, 4, 4, 4, 5, 5, 4, 4, 4, 3, 1, 1, 3, 4, 2, 5, 2, 4, 3, 3, 4, 3, 2, 2, 3, 3, 5, 4, 4, 2, 5, 3, 4, 4, 5, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 1, 3, 3, 2, 1, 3, 3, 2, 3, 4, 5, 3, 4, 4, 3, 3, 4, 4, 3, 3, 4, 4, 2, 4, 3, 3, 4, 4, 3, 5, 4, 5, 3, 2, 4, 2, 5, 3, 5, 5, 4, 4, 4, 3, 4, 3, 5, 3, 1, 5, 4, 5, 4, 4, 2, 4, 5, 4, 4, 4, 3, 4, 4, 1, 4, 3, 4, 5, 2, 3, 5, 3, 3, 5, 3, 2, 4, 5, 3, 4, 3, 4, 3, 3, 3, 5, 3, 3, 1, 3, 4, 3, 3, 3, 1, 1, 1, 2, 3, 3, 4, 3, 5, 2, 3, 5, 4, 5, 3, 5, 1, 5, 3, 5, 3, 1, 4, 5, 1, 5, 5, 5, 4, 3, 4, 5, 3, 1, 4, 4, 5, 4, 4, 2, 4, 4, 3, 3, 5, 4, 5, 4, 5, 5, 5, 1, 4, 5, 4, 4, 4, 4, 2, 4, 2, 3, 5, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 3, 2, 4, 2, 3, 2, 3, 4, 4, 3, 5, 2, 2, 2, 4, 3, 4, 4, 5, 4, 3, 4, 5, 4, 5, 5, 5, 4, 3, 3, 1, 4, 5, 4, 4, 5, 4, 2, 4, 4, 5, 4, 3, 5, 4, 4, 5, 4, 3, 4, 4, 4, 3, 3, 5, 4, 3, 4, 3, 3, 2, 2, 4, 2, 5, 2, 4, 4, 1, 3, 1, 2, 5, 4, 5, 4, 5, 4, 4, 3, 3, 4, 5, 3, 4, 1, 5, 4, 3, 5, 4, 2, 2, 4, 3, 2, 1, 3, 5, 3, 2, 5, 5, 5, 5, 3, 4, 2, 4, 4, 4, 5, 5, 5, 3, 5, 5, 3, 5, 4, 4, 2, 4, 4, 4, 2, 4, 3, 4, 4, 4, 4, 4, 5, 4, 3, 2, 4, 3, 4, 3, 5, 4, 3, 5, 2, 5, 1, 1, 1, 1, 1, 4, 4, 4, 5, 5, 4, 4, 4, 4, 3, 5, 5, 1, 5, 3, 4, 5, 4, 4, 3, 3, 4, 3, 3, 3, 4, 2, 5, 2, 5, 4, 3, 5, 5, 4, 5, 5, 4, 3, 4, 4, 1, 5, 3, 4, 3, 3, 2, 3, 1, 4, 4, 1, 2, 5, 4, 3, 2, 5, 4, 4, 5, 3, 4, 4, 4, 2, 4, 5, 4, 3, 1, 2, 1, 1, 1, 4, 3, 3, 1, 2, 4, 3, 3, 4, 4, 5, 3, 3, 3, 2, 1, 5, 5, 5, 4, 1, 4, 5, 1, 5, 2, 4, 5, 3, 4, 4, 5, 2, 4, 4, 5, 3, 1, 3, 4, 2, 3, 4, 3, 4, 2, 1, 4, 4, 4, 3, 2, 3, 4, 5, 4, 5, 5, 5, 4, 3, 3, 3, 2, 5, 4, 3, 5, 4, 3, 4, 4, 3, 3, 5, 3, 3, 4, 4, 5, 3, 3, 3, 3, 1, 5, 3, 1, 3, 4, 1, 3, 1, 1, 3, 2, 5, 3, 3, 2, 5, 1, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 5, 5, 5, 3, 4, 4, 5, 4, 5, 2, 4, 4, 5, 3, 3, 2, 3, 4, 4, 3, 4, 4, 4, 4, 2, 2, 4, 2, 1, 3, 3, 4, 4, 4, 4, 3, 4, 4, 4, 5, 4, 3, 4, 2, 2, 4, 2, 2, 5, 3, 5, 5, 4, 4, 3, 2, 3, 2, 2, 5, 5, 3, 3, 3, 2, 3, 2, 4, 3, 3, 5, 5, 5, 5, 5, 5, 4, 5, 4, 3, 2, 4, 2, 3, 5, 2, 1, 1, 4, 2, 4, 4, 5, 4, 3, 4, 3, 3, 3, 3, 4, 4, 4, 5, 5, 4, 3, 3, 4, 4, 4, 5, 5, 5, 5, 4, 5, 5, 4, 4, 4, 4, 4, 3, 4, 5, 4, 5, 4, 2, 3, 5, 4, 3, 5, 3, 5, 4, 5, 4, 4, 4, 3, 4, 3, 4, 3, 3, 4, 4, 5, 4, 5, 4, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 4, 4, 1, 3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 3, 4, 3, 3, 4, 4, 4, 4, 4, 4, 5, 3, 5, 5, 4, 2, 5, 3, 3, 3, 5, 4, 4, 4, 2, 5, 3, 4, 3, 2, 5, 4, 3, 3, 3, 4, 5, 3, 2, 3, 2, 5, 2, 4, 4, 2, 1, 5, 4, 3, 4, 2, 4, 2, 2, 1, 3, 3, 4, 5, 5, 3, 3, 3, 4, 1, 1, 5, 1, 1, 4, 4, 5, 1, 4, 5, 4, 4, 3, 3, 2, 2, 2, 4, 3, 3, 3, 3, 3, 3, 1, 1, 4, 3, 2, 4, 4, 2, 2, 2, 3, 4, 4, 2, 4, 4, 3, 4, 4, 4, 4, 5, 4, 4, 3, 4, 4, 4, 3, 3, 4, 4, 4, 4, 5, 2, 3, 4, 5, 4, 2, 3, 2, 3, 2, 2, 2, 3, 3, 2, 4, 4, 3, 5, 4, 4, 4, 4, 5, 4, 5, 3, 5, 5, 3, 2, 3, 4, 4, 3, 4, 5, 4, 4, 4, 3, 4, 4, 4, 4, 2, 5, 3, 4, 5, 3, 3, 5, 5, 1, 4, 3, 4, 3, 2, 4, 3, 3, 4, 4, 4, 2, 4, 4, 5, 4, 3, 3, 3, 4, 5, 5, 2, 5, 1, 4, 5, 3, 5, 3, 3, 2, 2, 4, 3, 4, 2, 4, 4, 3, 4, 3, 3, 1, 4, 5, 3, 4, 3, 1, 4, 4, 5, 3, 5, 5, 3, 2, 4, 4, 4, 2, 5, 4, 5, 5, 2, 3, 3, 3, 3, 4, 2, 3, 5, 2, 3, 1, 4, 4, 4, 4, 4, 4, 5, 4, 4, 5, 4, 5, 4, 4, 5, 3, 5, 5, 3, 4, 4, 3, 4, 5, 4, 5, 5, 5, 4, 4, 1, 5, 5, 5, 3, 4, 5, 4, 4, 1, 4, 4, 4, 1, 4, 3, 4, 1, 5, 4, 4, 3, 5, 4, 2, 4, 4, 4, 3, 3, 3, 2, 4, 2, 3, 3, 5, 4, 4, 5, 3, 4, 4, 4, 3, 4, 3, 5, 5, 4, 3, 2, 1, 2, 5, 1, 5, 3, 4, 4, 4, 4, 5, 5, 4, 3, 4, 4, 1, 3, 4, 5, 4, 2, 4, 2, 2, 2, 5, 3, 2, 3, 3, 4, 4, 4, 2, 3, 1, 3, 4, 4, 3, 1, 3, 2, 3, 2, 1, 2, 2, 1, 4, 5, 4, 5, 5, 4, 5, 5, 5, 5, 3, 3, 4, 4, 2, 4, 4, 3, 4, 3, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 3, 3, 3, 5, 5, 3, 4, 4, 2, 3, 4, 3, 1, 3, 5, 3, 3, 3, 3, 5, 2, 4, 4, 4, 5, 4, 4, 5, 5, 3, 4, 3, 3, 3, 4, 3, 2, 2, 2, 3, 4, 3, 3, 3, 3, 4, 4, 3, 3, 5, 4, 4, 5, 4, 4, 4, 4, 4, 3, 4, 1, 3, 4, 2, 5, 2, 4, 4, 5, 4, 4, 4, 4, 5, 5, 5, 1, 4, 4, 5, 5, 4, 4, 5, 5, 3, 3, 1, 5, 5, 5, 3, 3, 4, 3, 4, 5, 2, 2, 3, 3, 4, 3, 4, 1, 2, 3, 3, 3, 3, 5, 3, 4, 4, 3, 3, 5, 3, 4, 5, 3, 4, 5, 4, 4, 5, 5, 3, 5, 5, 4, 3, 1, 1, 3, 5, 1, 1, 2, 4, 4, 3, 5, 4, 4, 4, 2, 3, 3, 2, 5, 3, 5, 2, 4, 4, 3, 3, 5, 2, 4, 5, 4, 2, 2, 3, 4, 4, 5, 4, 3, 4, 5, 1, 3, 3, 5, 1, 4, 3, 3, 4, 4, 1, 2, 4, 4, 2, 2, 5, 3, 4, 3, 4, 4, 2, 1, 3, 4, 5, 3, 5, 5, 4, 2, 3, 1, 3, 3, 3, 4, 4, 4, 4, 2, 4, 3, 4, 3, 4, 4, 3, 5, 3, 4, 4, 3, 3, 3, 4, 5, 5, 5, 5, 5, 4, 3, 4, 4, 3, 4, 3, 3, 3, 3, 3, 3, 3, 2, 4, 5, 3, 3, 2, 4, 2, 2, 3, 3, 3, 4, 5, 4, 3, 3, 4, 4, 2, 2, 5, 2, 5, 4, 5, 5, 2, 5, 5, 5, 5, 4, 5, 5, 5, 3, 5, 3, 4, 3, 4, 4, 1, 5, 4, 4, 5, 4, 2, 2, 2, 3, 2, 5, 3, 3, 4, 4, 5, 3, 4, 3, 4, 4, 4, 2, 3, 4, 4, 5, 3, 3, 3, 4, 3, 4, 3, 3, 4, 3, 4, 4, 3, 4, 3, 5, 4, 3, 2, 3, 3, 3, 3, 4, 4, 3, 3, 4, 2, 2, 1, 1, 3, 3, 1, 3, 1, 1, 1, 3, 4, 5, 4, 4, 4, 1, 4, 2, 3, 3, 1, 3, 4, 4, 3, 3, 3, 1, 2, 5, 4, 1, 3, 3, 4, 3, 2, 3, 2, 3, 4, 5, 4, 4, 4, 4, 4, 2, 4, 2, 2, 3, 4, 5, 2, 4, 2, 4, 3, 1, 4, 4, 4, 3, 4, 4, 3, 3, 4, 3, 1, 1, 5, 5, 5, 5, 1, 5, 4, 1, 4, 5, 4, 2, 2, 5, 5, 1, 5, 1, 3, 1, 3, 2, 2, 4, 3, 2, 4, 4, 4, 4, 4, 3, 4, 1, 4, 4, 4, 5, 4, 4, 4, 4, 4, 3, 4, 2, 3, 4, 3, 2, 4, 4, 1, 3, 4, 5, 4, 5, 4, 3, 4, 5, 5, 4, 5, 3, 3, 4, 4, 5, 5, 3, 4, 4, 5, 5, 3, 4, 5, 4, 5, 5, 4, 4, 2, 5, 1, 5, 4, 5, 4, 4, 4, 4, 3, 3, 3, 1, 3, 3, 4, 3, 2, 2, 4, 3, 1, 1, 4, 1, 2, 3, 2, 3, 5, 3, 4, 4, 3, 5, 5, 4, 3, 2, 5, 4, 5, 2, 3, 5, 4, 4, 3, 5, 5, 2, 5, 3, 4, 3, 3, 5, 3, 1, 4, 5, 5, 3, 3, 4, 4, 3, 4, 4, 2, 3, 3, 4, 5, 3, 5, 4, 5, 5, 4, 5, 5, 3, 4, 4, 4, 3, 3, 5, 3, 4, 3, 4, 4, 4, 4, 2, 5, 4, 3, 4, 3, 4, 4, 4, 4, 4, 4, 3, 4, 4, 2, 4, 5, 5, 3, 5, 2, 4, 5, 2, 5, 3, 5, 4, 1, 5, 3, 1, 3, 4, 4, 3, 4, 1, 3, 4, 5, 5, 4, 5, 1, 4, 4, 3, 3, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 4, 4, 3, 3, 3, 5, 1, 3, 3, 4, 5, 4, 3, 3, 3, 2, 5, 4, 4, 3, 3, 4, 3, 3, 3, 4, 2, 5, 5, 5, 4, 4, 4, 3, 3, 4, 2, 5, 5, 5, 4, 4, 5, 4, 2, 5, 5, 2, 3, 2, 2, 3, 2, 4, 4, 2, 1, 4, 5, 1, 4, 2, 3, 5, 2, 4, 3, 1, 5, 3, 4, 5, 5, 5, 5, 5, 1, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4, 5, 3, 3, 3, 5, 3, 4, 1, 3, 3, 2, 4, 5, 3, 5, 2, 5, 5, 5, 4, 4, 2, 3, 1, 3, 4, 2, 3, 3, 2, 4, 5, 5, 4, 4, 5, 4, 4, 4, 4, 4, 4, 5, 4, 2, 4, 2, 3, 2, 2, 3, 3, 5, 2, 4, 2, 2, 1, 4, 3, 5, 5, 4, 4, 4, 4, 5, 4, 4, 5, 5, 5, 4, 1, 2, 5, 4, 5, 4, 2, 4, 4, 4, 5, 5, 4, 4, 4, 4, 3, 1, 4, 3, 4, 5, 3, 4, 2, 4, 4, 2, 3, 1, 3, 1, 1, 2, 2, 1, 1, 4, 4, 4, 2, 4, 4, 3, 4, 4, 3, 5, 5, 5, 2, 4, 2, 2, 3, 3, 3, 4, 5, 1, 1, 5, 4, 4, 2, 5, 4, 4, 1, 2, 4, 2, 4, 4, 4, 1, 3, 4, 4, 5, 4, 4, 4, 3, 3, 3, 4, 2, 1, 5, 5, 4, 3, 1, 3, 4, 5, 4, 5, 5, 5, 4, 2, 2, 4, 5, 5, 2, 4, 4, 3, 1, 3, 2, 3, 2, 3, 4, 4, 3, 4, 4, 3, 3, 4, 5, 4, 5, 3, 3, 4, 4, 4, 3, 3, 4, 3, 4, 4, 4, 4, 5, 4, 3, 4, 2, 3, 4, 4, 4, 1, 4, 4, 4, 2, 4, 4, 3, 3, 4, 5, 4, 4, 3, 4, 3, 3, 3, 4, 4, 3, 3, 3, 3, 3, 3, 4, 5, 5, 4, 5, 1, 4, 3, 5, 4, 3, 2, 4, 2, 4, 4, 4, 4, 5, 3, 2, 5, 4, 3, 3, 4, 2, 5, 2, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 4, 3, 4, 3, 5, 4, 3, 3, 4, 4, 5, 5, 5, 2, 4, 5, 5, 5, 5, 4, 4, 4, 5, 4, 3, 3, 3, 3, 3, 3, 2, 5, 3, 1, 3, 3, 4, 2, 4, 4, 1, 5, 4, 5, 2, 2, 2, 2, 5, 1, 1, 4, 3, 3, 3, 4, 5, 1, 3, 3, 3, 4, 4, 5, 5, 4, 5, 3, 4, 5, 3, 3, 3, 4, 4, 3, 2, 4, 4, 4, 3, 3, 5, 5, 5, 4, 4, 5, 4, 2, 5, 4, 2, 4, 4, 5, 2, 3, 4, 2, 4, 1, 4, 2, 5, 5, 1, 4, 1, 2, 5, 4, 4, 5, 5, 4, 5, 4, 3, 4, 3, 4, 4, 2, 3, 3, 5, 3, 4, 3, 3, 2, 3, 5, 4, 2, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 3, 4, 5, 3, 4, 5, 5, 5, 1, 4, 5, 3, 5, 4, 1, 5, 5, 4, 5, 2, 3, 3, 5, 5, 4, 5, 5, 5, 4, 5, 5, 5, 2, 3, 4, 5, 5, 5, 5, 3, 4, 2, 1, 2, 4, 5, 4, 3, 4, 5, 3, 2, 4, 1, 2, 1, 3, 3, 1, 1, 3, 4, 3, 4, 3, 3, 3, 3, 2, 3, 3, 5, 3, 5, 4, 3, 5, 2, 5, 4, 3, 3, 2, 4, 5, 5, 5, 4, 4, 4, 2, 4, 3, 3, 4, 4, 3, 4, 4, 4, 4, 4, 5, 4, 2, 4, 3, 5, 4, 3, 1, 4, 5, 4, 4, 5, 4, 5, 2, 4, 5, 3, 2, 5, 2, 2, 3, 3, 4, 3, 1, 5, 5, 3, 5, 5, 5, 4, 5, 4, 5, 3, 3, 4, 5, 1, 3, 2, 1, 4, 3, 5, 4, 2, 5, 4, 5, 5, 4, 4, 1, 4, 2, 2, 3, 3, 3, 2, 4, 3, 3, 2, 3, 1, 2, 4, 3, 5, 3, 5, 3, 3, 5, 4, 5, 4, 4, 5, 4, 5, 4, 3, 4, 4, 4, 3, 3, 3, 3, 3, 3, 5, 3, 3, 4, 2, 4, 4, 4, 4, 4, 4, 5, 3, 4, 1, 5, 2, 4, 2, 4, 5, 3, 5, 3, 3, 1, 4, 1, 5, 4, 4, 5, 5, 2, 3, 4, 4, 4, 2, 4, 2, 3, 3, 4, 4, 3, 2, 4, 2, 3, 1, 3, 4, 1, 5, 3, 4, 1, 2, 4, 4, 4, 4, 5, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 5, 5, 3, 5, 4, 5, 5, 4, 5, 4, 3, 4, 4, 1, 4, 3, 4, 4, 3, 4, 5, 3, 1, 3, 3, 4, 4, 4, 5, 5, 3, 5, 5, 5, 4, 3, 3, 3, 3, 3, 2, 3, 3, 5, 4, 1, 5, 4, 5, 4, 3, 4, 4, 5, 3, 5, 4, 4, 5, 3, 3, 5, 1, 4, 4, 3, 5, 5, 5, 4, 1, 3, 4, 1, 4, 2, 3, 2, 3, 2, 2, 4, 2, 3, 4, 3, 4, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 4, 3, 2, 4, 4, 1, 3, 2, 4, 2, 4, 2, 3, 5, 4, 3, 2, 2, 2, 4, 4, 3, 3, 1, 3, 3, 1, 5, 2, 5, 5, 5, 3, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 1, 5, 4, 5, 5, 5, 5, 5, 5, 5, 4, 3, 5, 3, 4, 5, 1, 2, 4, 4, 4, 4, 4, 3, 5, 3, 4, 3, 3, 3, 4, 1, 4, 2, 2, 2, 3, 4, 4, 4, 3, 3, 3, 4, 2, 4, 4, 4, 3, 3, 3, 2, 4, 3, 4, 3, 4, 3, 3, 4, 3, 5, 5, 2, 3, 2, 3, 5, 3, 4, 4, 3, 3, 4, 1, 1, 5, 1, 5, 3, 2, 4, 4, 3, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 5, 4, 3, 5, 5, 5, 5, 5, 3, 4, 4, 4, 4, 5, 5, 4, 4, 4, 4, 5, 3, 3, 4, 3, 3, 4, 5, 1, 3, 4, 5, 4, 4, 5, 4, 3, 4, 4, 5, 5, 3, 3, 3, 5, 3, 5, 3, 1, 2, 1, 1, 2, 1, 3, 3, 1, 2, 2, 4, 4, 3, 3, 2, 5, 4, 5, 5, 3, 3, 5, 5, 4, 4, 4, 2, 5, 1, 2, 1, 2, 2, 1, 1, 4, 1, 3, 4, 1, 4, 2, 5, 2, 1, 2, 4, 4, 4, 3, 2, 3, 2, 4, 3, 2, 5, 5, 3, 3, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 2, 3, 4, 4, 4, 3, 2, 2, 5, 4, 4, 5, 1, 3, 2, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 5, 5, 4, 4, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 3, 4, 4, 4, 4, 5, 4, 4, 4, 4, 2, 3, 5, 3, 4, 3, 5, 4, 4, 3, 3, 4, 4, 3, 4, 4, 5, 3, 4, 4, 4, 3, 5, 3, 4, 4, 4, 4, 3, 3, 5, 2, 3, 4, 5, 2, 4, 4, 5, 4, 3, 5, 3, 3, 5, 3, 5, 5, 5, 5, 5, 4, 5, 4, 5, 4, 4, 3, 5, 4, 4, 3, 3, 4, 5, 4, 4, 3, 3, 5, 5, 4, 3, 1, 5, 5, 4, 5, 4, 4, 4, 4, 3, 2, 3, 3, 5, 1, 4, 3, 3, 4, 4, 1, 5, 5, 1, 5, 5, 4, 3, 5, 1, 5, 4, 4, 4, 5, 5, 5, 4, 5, 5, 4, 3, 4, 3, 4, 4, 4, 4, 3, 4, 3, 4, 4, 2, 3, 5, 4, 3, 4, 4, 4, 4, 3, 4, 3, 5, 5, 4, 3, 4, 3, 5, 5, 4, 3, 4, 3, 5, 4, 2, 2, 5, 5, 4, 3, 3, 3, 3, 5, 4, 4, 3, 4, 4, 3, 4, 4, 4, 3, 3, 4, 5, 5, 3, 5, 5, 3, 4, 2, 3, 3, 2, 3, 5, 2, 2, 4, 1, 5, 1, 2, 5, 5, 5, 5, 3, 4, 5, 3, 5, 5, 4, 4, 2, 4, 2, 5, 4, 3, 4, 3, 5, 3, 5, 5, 1, 4, 4, 3, 5, 4, 2, 1, 3, 3, 2, 2, 2, 4, 2, 5, 3, 5, 4, 3, 3, 4, 4, 4, 4, 3, 5, 3, 4, 3, 2, 5, 3, 3, 5, 3, 5, 5, 4, 3, 5, 4, 4, 2, 3, 3, 4, 4, 4, 5, 2, 5, 3, 3, 4, 3, 4, 4, 3, 3, 3, 4, 4, 3, 3, 1, 3, 4, 4, 4, 3, 4, 3, 5, 4, 4, 5, 4, 5, 2, 5, 2, 5, 5, 5, 3, 3, 4, 5, 3, 3, 2, 4, 3, 4, 4, 5, 5, 4, 4, 5, 5, 4, 5, 3, 5, 4, 4, 4, 4, 4, 2, 3, 4, 4, 4, 2, 4, 4, 5, 4, 5, 5, 3, 3, 4, 5, 5, 4, 3, 2, 4, 5, 5, 4, 4, 2, 4, 5, 4, 4, 1, 1, 5, 5, 1, 2, 1, 5, 4, 4, 3, 2, 3, 3, 1, 5, 3, 2, 3, 3, 3, 4, 2, 3, 2, 5, 3, 3, 3, 3, 3, 3, 3, 2, 3, 4, 3, 5, 5, 3, 4, 4, 4, 5, 2, 3, 5, 1, 3, 5, 3, 3, 4, 4, 4, 4, 3, 3, 4, 4, 3, 3, 3, 3, 5, 3, 3, 2, 3, 3, 4, 4, 4, 3, 4, 3, 3, 3, 4, 2, 5, 4, 3, 1, 2, 4, 5, 4, 3, 3, 3, 3, 4, 2, 3, 4, 5, 4, 5, 3, 4, 4, 4, 3, 4, 4, 4, 2, 3, 5, 5, 3, 5, 2, 4, 4, 3, 4, 4, 3, 4, 4, 3, 4, 2, 4, 4, 3, 3, 3, 3, 4, 2, 1, 4, 3, 5, 3, 4, 5, 5, 5, 5, 2, 4, 5, 5, 5, 3, 5, 5, 5, 5, 5, 5, 3, 2, 5, 4, 4, 3, 4, 4, 5, 5, 3, 4, 1, 2, 3, 4, 1, 1, 3, 3, 3, 2, 3, 4, 4, 3, 3, 3, 3, 4, 4, 3, 2, 5, 5, 4, 4, 4, 5, 5, 4, 5, 5, 4, 4, 4, 2, 4, 1, 3, 4, 5, 3, 3, 5, 5, 5, 3, 2, 1, 3, 4, 4, 2, 4, 4, 4, 4, 5, 4, 3, 4, 5, 4, 4, 4, 4, 4, 4, 2, 5, 4, 4, 3, 1, 4, 4, 4, 4, 5, 1, 3, 2, 5, 4, 1, 4, 4, 3, 2, 3, 5, 4, 4, 5, 5, 2, 4, 4, 5, 3, 4, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 5, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 3, 5, 5, 4, 4, 4, 3, 4, 4, 4, 5, 5, 4, 4, 1, 4, 2]\n" ] } ], "source": [ "print data['test'].tocsr()[userids, movieids].tolist()[0]" ] }, { "cell_type": "code", "execution_count": 106, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "scatter(\n", " array(data['test'].tocsr()[userids, movieids].tolist()[0]) + randn(9430) * 0.1,\n", " model.predict(array(userids), array(movieids)),\n", " alpha=0.2\n", ");" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Counter({0.0: 1486126,\n", " 1.0: 5568,\n", " 2.0: 10375,\n", " 3.0: 24721,\n", " 4.0: 30858,\n", " 5.0: 19048,\n", " 10.0: 542,\n", " 20.0: 995,\n", " 30.0: 2424,\n", " 40.0: 3316,\n", " 50.0: 2153})" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter((data['test'] * 10 + data['train']).toarray().ravel())" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.12576883" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test_precision" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'item_feature_labels': array([u'Toy Story (1995)', u'GoldenEye (1995)', u'Four Rooms (1995)', ...,\n", " u'Sliding Doors (1998)', u'You So Crazy (1994)',\n", " u'Scream of Stone (Schrei aus Stein) (1991)'], dtype=object),\n", " 'item_features': <1682x1682 sparse matrix of type ''\n", " \twith 1682 stored elements in Compressed Sparse Row format>,\n", " 'item_labels': array([u'Toy Story (1995)', u'GoldenEye (1995)', u'Four Rooms (1995)', ...,\n", " u'Sliding Doors (1998)', u'You So Crazy (1994)',\n", " u'Scream of Stone (Schrei aus Stein) (1991)'], dtype=object),\n", " 'test': <943x1682 sparse matrix of type ''\n", " \twith 9430 stored elements in COOrdinate format>,\n", " 'train': <943x1682 sparse matrix of type ''\n", " \twith 90570 stored elements in COOrdinate format>}" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "data['item_feature_labels'] == data['item_labels']\n", "data['item_features'][i,j] = i == j" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "figure(figsize=(16,6))\n", "subplot(121)\n", "imshow(data['train'].toarray());\n", "subplot(122)\n", "imshow(data['test'].toarray());\n", "colorbar();" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1682" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(data['item_labels'])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Counter({0.0: 2827442, 1.0: 1682})" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(data['item_features'].toarray().ravel())" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Counter({0: 1576696, 1: 542, 2: 995, 3: 2424, 4: 3316, 5: 2153})" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(data['test'].toarray().ravel())" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Counter({0.0: 1495556,\n", " 1.0: 5568,\n", " 2.0: 10375,\n", " 3.0: 24721,\n", " 4.0: 30858,\n", " 5.0: 19048})" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(data['train'].toarray().ravel())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Регрессия\n", "todo\n", "* Качество регрессии: mean_absolute_error, mean_squared_error, r2_score\n", "\n", "\n", "## Временные ряды\n", "todo\n", "* scikit-timeseries\n", "\n", "* metrics.pairwise (linear_kernel, polynomial_kernel, rbf_kernel)\n", "\n", "## Калибровка\n", "todo\n", "* calibration (CalibratedClassifierCV)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Кластеризация" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Задача кластеризации возникает, когда классы объектов неизвестны (unsupervised learning), но телепатия говорит нам, что есть несколько сильно отличающихся по свойствам групп объектов. Для ее решения существует много методов, но наиболее популярны K-Means (тупой и прямолинейный) и DBSCAN (хитрый и долгий)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В качестве датасета используем избитый набор про морфологию трех видов ирисов." ] }, { "cell_type": "code", "execution_count": 103, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dataset = sklearn.datasets.load_iris()" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['sepal length (cm)',\n", " 'sepal width (cm)',\n", " 'petal length (cm)',\n", " 'petal width (cm)']" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset['feature_names']" ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['target_names', 'data', 'target', 'DESCR', 'feature_names']" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dataset.keys()" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X = dataset['data']" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nzuYAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "scatter(X[:,2], X[:,3], c=dataset['target']);" ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sklearn.cluster" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "K-Means случайно выбирает центры `n_clusters` кластеров, а затем итеративно уточняет их положения, то относя точки к ближайшему центру, то смещая центр в их центр тяжести." ] }, { "cell_type": "code", "execution_count": 143, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 5.006 , 3.418 , 1.464 , 0.244 ],\n", " [ 6.52916667, 3.05833333, 5.50833333, 2.1625 ],\n", " [ 5.53214286, 2.63571429, 3.96071429, 1.22857143],\n", " [ 7.475 , 3.125 , 6.3 , 2.05 ],\n", " [ 6.24722222, 2.84722222, 4.775 , 1.575 ]])" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "kmeans = sklearn.cluster.KMeans(n_clusters=5, random_state=0)\n", "components = kmeans.fit_predict(X)\n", "kmeans.cluster_centers_" ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "figure(figsize=(16,5))\n", "subplot(121)\n", "scatter(X[:,2], X[:,3], c=dataset['target']);\n", "scatter(kmeans.cluster_centers_[:,2], kmeans.cluster_centers_[:,3], marker='^', c='r', s=100);\n", "\n", "subplot(122)\n", "scatter(X[:,2], X[:,3], c=components);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "K-Means примерно равномерно расположил центры кластеров по облаку точек, и за счет удачного выбора числа кластеров их номера примерно соответствуют реальным классам (показаны цветом на скаттере слева)." ] }, { "cell_type": "code", "execution_count": 147, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dbscan = sklearn.cluster.DBSCAN()\n", "components = dbscan.fit_predict(X)" ] }, { "cell_type": "code", "execution_count": 149, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "figure(figsize=(16,5))\n", "subplot(121)\n", "scatter(X[:,2], X[:,3], c=components);\n", "\n", "subplot(122)\n", "scatter(X[:,0], X[:,1], c=components);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "DBSCAN больше полагается на близость соседних точек, чем на шарообразность облака, поэтому отнес к одному кластеру маленькое облако, к другому большое, а к третьему рассеянные точки на периферии большого облака." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Качество кластеризации" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Качество кластеризации можно оценивать, имея на руках настоящие метки классов или не имея.\n", "\n", "https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/cluster/supervised.py" ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "collapsed": true }, "outputs": [], "source": [ "Y_true = [0,0,0,0,0, 0,1,1,1,1]\n", "Y_pred = [1,1,1,2,2, 2,3,3,3,3]" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 156, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.homogeneity_score(Y_true, Y_pred)" ] }, { "cell_type": "code", "execution_count": 157, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.61806564629215444" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.completeness_score(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo Понять, как считалось" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Их среднее гармоническое — `v_measure_score`." ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.76395620623733063" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sklearn.metrics.v_measure_score(Y_true, Y_pred)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo adjusted_rand_score? Ward metric?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Снижение размерности\n", "todo\n", "* decomposition (PCA, RandomizedPCA, TruncatedSVD, FastICA, NMF, LatentDirichletAllocation)\n", "* manifold (Isomap, MDS, LocallyLinearEmbedding, TSNE)\n", "* discriminant_analysis.LinearDiscriminantAnalysis\n", "* discriminant_analysis.QuadraticDiscriminantAnalysis\n", "* сети Кохонена\n", "\n", "## Поиск аномалий\n", "todo\n", "* IsolationForest\n", "* OneClassSVM\n", "\n", "## Пайплайн\n", "todo\n", "* from skdata.base import SklearnClassifier\n", "* base (BaseEstimator, ClassifierMixin, TransformerMixin)\n", "* pipeline (FeatureUnion, Pipeline)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Подбор гиперпараметров\n", "todo\n", "* feature_selection (RFECV)\n", "* grid_search (GridSearchCV, RandomizedSearchCV)\n", "* hyperopt\n", "\n", "```\n", "pip install git+git://github.com/hyperopt/hyperopt.git\n", "\n", "hyperopt (0.0.3.dev0)\n", "\n", "from hpsklearn import any_classifier, components\n", "import hpsklearn.demo_support\n", "from hpsklearn.components import svc, pca\n", "from hpsklearn.estimator import HyperoptEstimatorFactory, hyperopt_estimator\n", "\n", "from hyperopt import anneal, base, criteria, fmin, plotting, rand, tpe, hp, Trials, Domain, exceptions, space_eval, STATUS_FAIL, STATUS_OK\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Обработка естественного языка (NLP)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", "https://habr.com/company/mailru/blog/358736/\n", "\n", " nltk, bigARTM, gensim, artm\n", " import nltk.classify.util\n", " from nltk import bigrams, trigrams\n", " from nltk.classify import NaiveBayesClassifier\n", " from nltk.collocations import BigramCollocationFinder\n", " from nltk.corpus import brown, conll2000, movie_reviews, names, stopwords\n", " from nltk.metrics.scores import precision, recall\n", " from nltk.probability import FreqDist, KneserNeyProbDist\n", " from nltk.stem.porter import PorterStemmer\n", " from nltk.tokenize import word_tokenize\n", "\n", " pip install gensim\n", "\n", " from gensim import corpora, models, similarities\n", " from gensim.corpora import WikiCorpus\n", " from gensim.models.word2vec import Word2Vec\n", "\n", " pymorphy2 Morphological analyzer (POS tagger + inflection engine) for Russian language\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "asses\n", "eleven thousand, three hundred and forty-five\n" ] } ], "source": [ "import inflect\n", "engine = inflect.engine()\n", "print engine.plural('ass')\n", "print engine.number_to_words(11345)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Делает запросы к api.wordnik.com" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from vocabulary.vocabulary import Vocabulary\n", "import json" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[u'hit',\n", " u'dismiss',\n", " u'give forth',\n", " u'sack',\n", " u'break wind',\n", " u'lay off',\n", " u'discharge',\n", " u'emit']" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Vocabulary.synonym('fire', format='list')" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from nltk.corpus import wordnet" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fire.n.01 : fire\n", "fire.n.02 : fire firing\n", "fire.n.03 : fire flame flaming\n", "fire.n.04 : fire\n", "fire.n.05 : fire\n", "ardor.n.03 : ardor ardour fervor fervour fervency fire fervidness\n", "fire.n.07 : fire\n", "fire.n.08 : fire\n", "fire.n.09 : fire attack flak flack blast\n", "open_fire.v.01 : open_fire fire\n", "fire.v.02 : fire discharge\n", "fire.v.03 : fire\n", "displace.v.03 : displace fire give_notice can dismiss give_the_axe send_away sack force_out give_the_sack terminate\n", "fire.v.05 : fire discharge go_off\n", "fire.v.06 : fire\n", "arouse.v.01 : arouse elicit enkindle kindle evoke fire raise provoke\n", "burn.v.01 : burn fire burn_down\n", "fuel.v.02 : fuel fire\n" ] } ], "source": [ "for syn in wordnet.synsets('fire'):\n", " print syn.name(), ':',\n", " for lemma in syn.lemmas():\n", " print lemma.name(),\n", " print" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[u'hire']" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Vocabulary.antonym('fire', format='list')" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[[u'in', u'stress'], u'no', u'cence']" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Vocabulary.hyphenation('innocence', format='list')" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{0: {u'raw': u'(\\u0103k-s\\u0115p\\u02c8t\\u0259ns)', u'rawType': u'ahd-legacy'},\n", " 1: {u'raw': u'AE0 K S EH1 P T AH0 N S', u'rawType': u'arpabet'},\n", " 2: {u'raw': u'AH0 K S EH1 P T AH0 N S', u'rawType': u'arpabet'}}" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Vocabulary.pronunciation('acceptance', format='dict')" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(ăk-sĕpˈtəns)\n" ] } ], "source": [ "print Vocabulary.pronunciation('acceptance', format='dict')[0]['raw']" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[u'very wide flat strips of pasta',\n", " u'baked dish of layers of lasagna pasta with sauce and cheese and meat or vegetables',\n", " u'Variant of lasagna',\n", " u'Synonym of [i]lasagna[/i]',\n", " u'plural of [i]lasagna[/i]']" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Vocabulary.meaning('lasagne', format='list')" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{0: {'example': u'Present participle of accord.', 'text': u'verb'},\n", " 1: {'example': u'Agreeing; in agreement or harmony; harmonious.',\n", " 'text': u'adjective'}}" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Vocabulary.part_of_speech('according', format='dict')" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "невероятный\n", "неправдоподобный\n", "неимоверный\n", "невероятно\n" ] } ], "source": [ "for res in Vocabulary.translate('unbelievable', 'en', 'ru', format='list'):\n", " print res" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "pip install pymorphy2\n", "```" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Parse(word=u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u044e\\u0449\\u0438\\u0445\\u0441\\u044f', tag=OpencorporaTag('PRTF,impf,intr,pres,actv plur,gent'), normal_form=u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u0442\\u044c\\u0441\\u044f', score=0.3333333333333333, methods_stack=((, u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u044e\\u0449\\u0438\\u0445\\u0441\\u044f', 224, 34),))\n", "защищаться\n", "Parse(word=u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u044e\\u0449\\u0438\\u0445\\u0441\\u044f', tag=OpencorporaTag('PRTF,impf,intr,pres,actv anim,plur,accs'), normal_form=u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u0442\\u044c\\u0441\\u044f', score=0.3333333333333333, methods_stack=((, u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u044e\\u0449\\u0438\\u0445\\u0441\\u044f', 224, 36),))\n", "защищаться\n", "Parse(word=u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u044e\\u0449\\u0438\\u0445\\u0441\\u044f', tag=OpencorporaTag('PRTF,impf,intr,pres,actv plur,loct'), normal_form=u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u0442\\u044c\\u0441\\u044f', score=0.3333333333333333, methods_stack=((, u'\\u0437\\u0430\\u0449\\u0438\\u0449\\u0430\\u044e\\u0449\\u0438\\u0445\\u0441\\u044f', 224, 39),))\n", "защищаться\n" ] } ], "source": [ "import pymorphy2\n", "\n", "morph = pymorphy2.MorphAnalyzer()\n", "for p in morph.parse(u'защищающихся'):\n", " print p\n", " print p.normal_form" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo POS-tagging" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "p.tag.POS == 'NOUN'" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "явиться даже опасный мечтатели. руководимый не столько разумом, сколько движение благодарный|благодарное сердца, они утверждали, что пря|при|переть новый|новое градоначальник процвести торговля, и|исполняющий что, под наблюдение квартальный надзирателей, возникнуть наука и|исполняющий искусства. не удержаться и|исполняющий от сравнений. вспомнить только что выехать из|иза город старое|старый градоначальника, и|исполняющий находили, что хотя|хотеть он тоже быть красавчик и|исполняющий умница, но что, за весь тем, новый|новое правитель уже|узкий|уж по тома|тот|том один должно|должный быть отдать преимущество, что он новый. один словом, пря|при|переть это|этот случае, как и|исполняющий пря|при|переть другой подобных, вполне выразились: и|исполняющий обычный глуповский восторженность, и|исполняющий обычный глуповское|глуповский легкомыслие.\n" ] } ], "source": [ "text = u'''\n", "Явились даже опасные мечтатели. Руководимые не столько разумом, сколько движениями\n", "благодарного сердца, они утверждали, что при новом градоначальнике процветет торговля,\n", "и что, под наблюдением квартальных надзирателей, возникнут науки и искусства.\n", "Не удержались и от сравнений. Вспомнили только что выехавшего из города старого градоначальника,\n", "и находили, что хотя он тоже был красавчик и умница, но что, за всем тем, новому правителю\n", "уже по тому одному должно быть отдано преимущество, что он новый. Одним словом, при этом случае,\n", "как и при других подобных, вполне выразились: и обычная глуповская восторженность,\n", "и обычное глуповское легкомыслие.'''\n", "for w in text.split():\n", " print '|'.join(set(pymorphy2.MorphAnalyzer().normal_forms(w)))," ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Перевод" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Враппером над онлайн-сервисом перевода может послужить библиотека `yandex-translater`. Для ее использования нужно получить бесплатный ключ по адресу https://translate.yandex.com/developers/keys . Перевод ограничен 1кк символами в день и 10кк в месяц.\n", "\n", "todo Еще есть https://github.com/matheuss/google-translate-api/blob/master/index.js" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "pip install yandex-translater\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import os, locale\n", "from ultra import file_get\n", "locale.setlocale(locale.LC_ALL, '')\n", "os.environ['HTTPS_PROXY'] = 'socks5h://127.0.0.1:9050'" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "text = '''\n", "— А что, отец, — спросил молодой человек, затянувшись, — невесты у вас в городе есть? Старик дворник ничуть не удивился.\n", "— Кому и кобыла невеста, — ответил он, охотно ввязываясь в разговор.\n", "— Больше вопросов не имею, — быстро проговорил молодой человек.\n", "'''" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "— And what, father, ' asked the young man, inhaled, bride in your city have? The old man janitor I was not surprised.\n", "— To whom and Mare bride, he answered, willingly engaging in conversation.\n", "— I have no more questions, young man said.\n", "\n" ] } ], "source": [ "from yandex import Translater\n", "tr = Translater(\n", " key=file_get('yandex-translater-key.txt'),\n", " text=text,\n", " from_lang='ru', to_lang='en')\n", "print tr.translate()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Нейронные сети" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если данные для машинного обучения имеют ярко выраженную пространственную зависимость между соседними элементами, как, например, пиксели в изображении, интенсивности звука в аудио или буквы в тексте, хорошие результаты могут показать нейронные сети. Поскольку задачи с такими данными достаточно хорошо (но дорого) решаются и людьми, а еще потому, что вычисления для тренировки этого алгоритма машинного обучения хорошо и быстро проводятся на современных GPU, область переживает свой расцвет (2017)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### GPGPU и CUDA" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На видеокартах от nVidia произвольные вычисления (General-purpose computing on GPU) возможны с использованием библиотеки и тулсета CUDA. Для ее использования установите https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64&target_version=7&target_type=exelocal (1.5 ГБ).\n", "\n", "Затем следует воспользоваться библиотекой-враппером `pycuda`. Документация https://documen.tician.de/pycuda/ . Она позволяет немного удобнее писать на C++ (на самом деле сильно урезанном диалекте CUDA C, который компилируется программой `nvcc` из библиотеки CUDA) вычислительные ядра.\n", "\n", "Архитектура GPU включает в себя иерархию вычислительных блоков и доступных им блоков памяти; она заточена под быстрое умножение матриц, но даже это делать на ней очень неудобно и требует заката байтиков по вычислительным блокам вручную.\n", "\n", "Примеры https://docs.nvidia.com/cuda/cuda-samples/index.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "В консоли VC++2008 for Python:\n", "pip install pycuda --global-option build_ext --global-option --compiler=msvc\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 устройств доступно\n", "0 : GeForce GTX 1060\n", "\tcompute capability version: (6, 1)\n", "\ttotal memory: 6442450944\n", "\tattributes: {pycuda._driver.device_attribute.MAX_THREADS_PER_BLOCK: 1024, pycuda._driver.device_attribute.MAX_BLOCK_DIM_X: 1024, pycuda._driver.device_attribute.MAX_BLOCK_DIM_Y: 1024, pycuda._driver.device_attribute.MAX_BLOCK_DIM_Z: 64, pycuda._driver.device_attribute.MAX_GRID_DIM_X: 2147483647, pycuda._driver.device_attribute.MAX_GRID_DIM_Y: 65535, pycuda._driver.device_attribute.MAX_GRID_DIM_Z: 65535, pycuda._driver.device_attribute.MAX_SHARED_MEMORY_PER_BLOCK: 49152, pycuda._driver.device_attribute.TOTAL_CONSTANT_MEMORY: 65536, pycuda._driver.device_attribute.WARP_SIZE: 32, pycuda._driver.device_attribute.MAX_PITCH: 2147483647, pycuda._driver.device_attribute.MAX_REGISTERS_PER_BLOCK: 65536, pycuda._driver.device_attribute.CLOCK_RATE: 1670500, pycuda._driver.device_attribute.TEXTURE_ALIGNMENT: 512, pycuda._driver.device_attribute.GPU_OVERLAP: 1, pycuda._driver.device_attribute.MULTIPROCESSOR_COUNT: 10, pycuda._driver.device_attribute.KERNEL_EXEC_TIMEOUT: 1, pycuda._driver.device_attribute.INTEGRATED: 0, pycuda._driver.device_attribute.CAN_MAP_HOST_MEMORY: 1, pycuda._driver.device_attribute.COMPUTE_MODE: pycuda._driver.compute_mode.DEFAULT, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_HEIGHT: 65536, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_WIDTH: 16384, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_HEIGHT: 16384, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_DEPTH: 16384, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_ARRAY_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_ARRAY_HEIGHT: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES: 2048, pycuda._driver.device_attribute.SURFACE_ALIGNMENT: 512, pycuda._driver.device_attribute.CONCURRENT_KERNELS: 1, pycuda._driver.device_attribute.ECC_ENABLED: 0, pycuda._driver.device_attribute.PCI_BUS_ID: 1, pycuda._driver.device_attribute.PCI_DEVICE_ID: 0, pycuda._driver.device_attribute.TCC_DRIVER: 0, pycuda._driver.device_attribute.MEMORY_CLOCK_RATE: 4004000, pycuda._driver.device_attribute.GLOBAL_MEMORY_BUS_WIDTH: 192, pycuda._driver.device_attribute.L2_CACHE_SIZE: 1572864, pycuda._driver.device_attribute.MAX_THREADS_PER_MULTIPROCESSOR: 2048, pycuda._driver.device_attribute.ASYNC_ENGINE_COUNT: 2, pycuda._driver.device_attribute.UNIFIED_ADDRESSING: 1, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_LAYERED_LAYERS: 2048, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_GATHER_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_GATHER_HEIGHT: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE: 8192, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE: 8192, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE: 32768, pycuda._driver.device_attribute.PCI_DOMAIN_ID: 0, pycuda._driver.device_attribute.TEXTURE_PITCH_ALIGNMENT: 32, pycuda._driver.device_attribute.MAXIMUM_TEXTURECUBEMAP_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS: 2046, pycuda._driver.device_attribute.MAXIMUM_SURFACE1D_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_HEIGHT: 65536, pycuda._driver.device_attribute.MAXIMUM_SURFACE3D_WIDTH: 16384, pycuda._driver.device_attribute.MAXIMUM_SURFACE3D_HEIGHT: 16384, pycuda._driver.device_attribute.MAXIMUM_SURFACE3D_DEPTH: 16384, pycuda._driver.device_attribute.MAXIMUM_SURFACE1D_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE1D_LAYERED_LAYERS: 2048, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_LAYERED_HEIGHT: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_LAYERED_LAYERS: 2048, pycuda._driver.device_attribute.MAXIMUM_SURFACECUBEMAP_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS: 2046, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_LINEAR_WIDTH: 134217728, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_LINEAR_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_LINEAR_HEIGHT: 65000, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_LINEAR_PITCH: 2097120, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT: 32768, pycuda._driver.device_attribute.COMPUTE_CAPABILITY_MAJOR: 6, pycuda._driver.device_attribute.COMPUTE_CAPABILITY_MINOR: 1, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH: 16384, pycuda._driver.device_attribute.STREAM_PRIORITIES_SUPPORTED: 1, pycuda._driver.device_attribute.GLOBAL_L1_CACHE_SUPPORTED: 1, pycuda._driver.device_attribute.LOCAL_L1_CACHE_SUPPORTED: 1, pycuda._driver.device_attribute.MAX_SHARED_MEMORY_PER_MULTIPROCESSOR: 98304, pycuda._driver.device_attribute.MAX_REGISTERS_PER_MULTIPROCESSOR: 65536, pycuda._driver.device_attribute.MANAGED_MEMORY: 1, pycuda._driver.device_attribute.MULTI_GPU_BOARD: 0, pycuda._driver.device_attribute.MULTI_GPU_BOARD_GROUP_ID: 0}\n" ] } ], "source": [ "import pycuda.driver\n", "import pycuda.compiler\n", "\n", "import numpy\n", "\n", "pycuda.driver.init()\n", "\n", "ndevices = pycuda.driver.Device.count()\n", "print ndevices, 'устройств доступно'\n", "for i in range(ndevices):\n", " dev = pycuda.driver.Device(i)\n", " print i, ':', dev.name()\n", " print '\\tcompute capability version:', dev.compute_capability()\n", " print '\\ttotal memory:', dev.total_memory()\n", " print '\\tattributes:', dev.get_attributes()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Shader Processors : Texture mapping units : Render output units = 1280:80:48" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def get_cuda_cores_count(dev):\n", " mpc = dev.get_attribute(pycuda.driver.device_attribute.MULTIPROCESSOR_COUNT)\n", " major, minor = dev.compute_capability()\n", " if major == 2: # Fermi\n", " return mpc * 48 if minor == 1 else mpc * 32\n", " if major == 3: # Kepler\n", " return mpc * 192\n", " if major == 5: # Maxwell\n", " return mpc * 128\n", " if major == 6: # Pascal\n", " if minor == 1:\n", " return mpc * 128\n", " elif minor == 0:\n", " return mpc * 64" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1280" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_cuda_cores_count(dev)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dev = pycuda.driver.Device(0)\n", "ctx = dev.make_context()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\User\\Anaconda2\\lib\\site-packages\\ipykernel\\__main__.py:9: UserWarning: The CUDA compiler succeeded, but said the following:\n", "kernel.cu\r\n", "\n" ] } ], "source": [ "mod = pycuda.compiler.SourceModule(\"\"\"\n", "__global__ void brute_md5(char *out)\n", "{\n", " const int tid = blockIdx.x * blockDim.x + threadIdx.x;\n", " if (tid % 2 == 0) {\n", " out[tid] = tid;\n", " }\n", "}\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\User\\Anaconda2\\lib\\site-packages\\ipykernel\\__main__.py:75: UserWarning: The CUDA compiler succeeded, but said the following:\n", "kernel.cu\r\n", "kernel.cu(159): warning: expression has no effect\r\n", "\r\n", "kernel.cu(177): warning: variable \"foo\" was declared but never referenced\r\n", "\r\n", "\n" ] } ], "source": [ "mod = pycuda.compiler.SourceModule(\n", "\"\"\"\n", "#define UINT4 uint\n", "#define uint unsigned int\n", "//#include \n", "//#include \n", "\"\"\" +\n", "md5_code + \n", "\"\"\"\n", "__device__ unsigned long long int finished = 0;\n", "\n", "__constant__ char hex[] = \"0123456789abcdef\";\n", "\n", "__device__ void print_int(char *out, int val, int len)\n", "{\n", " for (int i = 0; i < len; ++i) {\n", " out[len - 1 - i] = '0' + val % 10;\n", " val /= 10;\n", " }\n", "}\n", "\n", "__global__ void brute_md5(char *out)\n", "{\n", " int tid = 0;\n", " blockIdx.x * gridDim.y * gridDim.z * blockDim.x +\n", " blockIdx.y * gridDim.z * blockDim.x +\n", " blockIdx.z * blockDim.x +\n", " threadIdx.x;\n", " int val = tid;\n", "\n", " char buff[64] = {0};\n", " int len = 10;\n", " print_int(buff, val, len);\n", " buff[len] = 0x80;\n", " buff[56] = len * 8;\n", " \n", " union {\n", " uint outi[4];\n", " char bytes[16];\n", " } hash;\n", " md5((uint *) &buff[0], hash.outi);\n", "\n", " int foo = 42;\n", "\n", " char outhex[32];\n", " for (int i = 0; i < 16; ++i) {\n", " outhex[2 * i + 0] = hash.bytes[i] / 16;\n", " outhex[2 * i + 1] = hash.bytes[i] % 0xF;\n", " }\n", " \n", " int digits = 0, es = 0;\n", " for (int i = 0; i < 32; ++i) {\n", " digits += outhex[i] <= 9;\n", " es += outhex[i] == 14;\n", " }\n", "\n", " if (1 || digits + es == 32 && es <= 1) {\n", " unsigned long long int old = atomicCAS(&finished, 0, 1);\n", "\n", " if (!old) {\n", "\n", " for (int i = 0; i < len; ++i) {\n", " out[i] = buff[i];\n", " }\n", "\n", " for (int i = 0; i < 32; ++i) {\n", " out[16 + i] = outhex[i]; //hex[outhex[i]];\n", " }\n", "\n", " }\n", " }\n", "}\n", "\n", "\n", "\"\"\")" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.8010001182556152" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "brute_md5 = mod.get_function(\"brute_md5\")\n", "\n", "result = numpy.zeros((48), numpy.uint8)\n", "brute_md5(pycuda.driver.Out(result), grid=(100,100,100), block=(1000,1,1), time_kernel=True)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'0000000000\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xfc\\xf3\\x00\\x08\\xfc\\xf7\\xfb\\xfb\\x07\\x07\\x01\\r\\xff\\xf8\\x04\\x0c\\xfe\\xfa\\xfa\\x00\\xfa\\xf9\\x04\\x02\\x07\\x07\\xfa\\xfb\\xfc\\xf8'" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "''.join(map(chr, result))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'303035303030303433330000000000003930303433363639333834333131353036373632346534363432373038313530'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "''.join(map(chr, result)).encode('hex')" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'f1b708bba17f1ce948dc979f4d7092bc'" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('0' * 10)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'091b0c9c4a21b0f51ed4a56da277b705'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('0050000433')" ] }, { "cell_type": "code", "execution_count": 261, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'781e5e245d69b566979b86e28d23f2c7'" ] }, "execution_count": 261, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('0123456789')" ] }, { "cell_type": "code", "execution_count": 266, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'781e5e242089f7e1692c684d7ad5418e'" ] }, "execution_count": 266, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('0879049425')" ] }, { "cell_type": "code", "execution_count": 203, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 203, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('00464') == 'fcf2cbb450285857bdfdf61a71ff4d67'" ] }, { "cell_type": "code", "execution_count": 163, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'8da131d0e5a369d7bbbc9d41a5728a47'" ] }, "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('00063')" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'ca9c491ac66b2c62500882e93f3719a8'" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('\\0' * 5)" ] }, { "cell_type": "code", "execution_count": 157, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'93b885adfe0da089cdf634904fd59f71'" ] }, "execution_count": 157, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('\\0')" ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'d1457b72c3fb323a2671125aef3eab5d'" ] }, "execution_count": 158, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('?')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 117, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'dc271beef3243c93a5c11b3fadf4ac36'" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "''.join(map(chr, result[:16])).encode('hex')" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'d41d8cd98f00b204e9800998ecf8427e'" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('')" ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'cfcd208495d565ef66e7dff9f98764da'" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('0')" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "48" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ord('0')" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'dcddb75469b4b4875094e14561e573d8'" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('00000')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from ultra import md5" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "'827ccb0eea8a706c4c34a16891f84e7b'" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "md5('12345')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "md5_code = \"\"\"\n", "/* F, G and H are basic MD5 functions: selection, majority, parity */\n", "\n", "#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))\n", "#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))\n", "#define H(x, y, z) ((x) ^ (y) ^ (z))\n", "#define I(x, y, z) ((y) ^ ((x) | (~z))) \n", "\n", "/* ROTATE_LEFT rotates x left n bits */\n", "#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))\n", "\n", "/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */\n", "/* Rotation is separate from addition to prevent recomputation */\n", "#define FF(a, b, c, d, x, s, ac) \\\n", " {(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \\\n", " (a) = ROTATE_LEFT ((a), (s)); \\\n", " (a) += (b); \\\n", " }\n", "\n", "#define GG(a, b, c, d, x, s, ac) \\\n", " {(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \\\n", " (a) = ROTATE_LEFT ((a), (s)); \\\n", " (a) += (b); \\\n", " }\n", "\n", "#define HH(a, b, c, d, x, s, ac) \\\n", " {(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \\\n", " (a) = ROTATE_LEFT ((a), (s)); \\\n", " (a) += (b); \\\n", " }\n", "\n", "#define II(a, b, c, d, x, s, ac) \\\n", " {(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \\\n", " (a) = ROTATE_LEFT ((a), (s)); \\\n", " (a) += (b); \\\n", " }\n", "\n", "\n", "__device__ void md5(uint *in, uint *hash) {\n", "\n", " uint a, b, c, d;\n", " \n", " const uint a0 = 0x67452301;\n", " const uint b0 = 0xEFCDAB89;\n", " const uint c0 = 0x98BADCFE;\n", " const uint d0 = 0x10325476;\n", "\n", " a = a0;\n", " b = b0;\n", " c = c0;\n", " d = d0;\n", "\n", " /* Round 1 */\n", "#define S11 7\n", "#define S12 12\n", "#define S13 17\n", "#define S14 22\n", " FF ( a, b, c, d, in[ 0], S11, 3614090360); /* 1 */\n", " FF ( d, a, b, c, in[ 1], S12, 3905402710); /* 2 */\n", " FF ( c, d, a, b, in[ 2], S13, 606105819); /* 3 */\n", " FF ( b, c, d, a, in[ 3], S14, 3250441966); /* 4 */\n", " FF ( a, b, c, d, in[ 4], S11, 4118548399); /* 5 */\n", " FF ( d, a, b, c, in[ 5], S12, 1200080426); /* 6 */\n", " FF ( c, d, a, b, in[ 6], S13, 2821735955); /* 7 */\n", " FF ( b, c, d, a, in[ 7], S14, 4249261313); /* 8 */\n", " FF ( a, b, c, d, in[ 8], S11, 1770035416); /* 9 */\n", " FF ( d, a, b, c, in[ 9], S12, 2336552879); /* 10 */\n", " FF ( c, d, a, b, in[10], S13, 4294925233); /* 11 */\n", " FF ( b, c, d, a, in[11], S14, 2304563134); /* 12 */\n", " FF ( a, b, c, d, in[12], S11, 1804603682); /* 13 */\n", " FF ( d, a, b, c, in[13], S12, 4254626195); /* 14 */\n", " FF ( c, d, a, b, in[14], S13, 2792965006); /* 15 */\n", " FF ( b, c, d, a, in[15], S14, 1236535329); /* 16 */\n", "\n", " /* Round 2 */\n", "#define S21 5\n", "#define S22 9\n", "#define S23 14\n", "#define S24 20\n", " GG ( a, b, c, d, in[ 1], S21, 4129170786); /* 17 */\n", " GG ( d, a, b, c, in[ 6], S22, 3225465664); /* 18 */\n", " GG ( c, d, a, b, in[11], S23, 643717713); /* 19 */\n", " GG ( b, c, d, a, in[ 0], S24, 3921069994); /* 20 */\n", " GG ( a, b, c, d, in[ 5], S21, 3593408605); /* 21 */\n", " GG ( d, a, b, c, in[10], S22, 38016083); /* 22 */\n", " GG ( c, d, a, b, in[15], S23, 3634488961); /* 23 */\n", " GG ( b, c, d, a, in[ 4], S24, 3889429448); /* 24 */\n", " GG ( a, b, c, d, in[ 9], S21, 568446438); /* 25 */\n", " GG ( d, a, b, c, in[14], S22, 3275163606); /* 26 */\n", " GG ( c, d, a, b, in[ 3], S23, 4107603335); /* 27 */\n", " GG ( b, c, d, a, in[ 8], S24, 1163531501); /* 28 */\n", " GG ( a, b, c, d, in[13], S21, 2850285829); /* 29 */\n", " GG ( d, a, b, c, in[ 2], S22, 4243563512); /* 30 */\n", " GG ( c, d, a, b, in[ 7], S23, 1735328473); /* 31 */\n", " GG ( b, c, d, a, in[12], S24, 2368359562); /* 32 */\n", "\n", " /* Round 3 */\n", "#define S31 4\n", "#define S32 11\n", "#define S33 16\n", "#define S34 23\n", " HH ( a, b, c, d, in[ 5], S31, 4294588738); /* 33 */\n", " HH ( d, a, b, c, in[ 8], S32, 2272392833); /* 34 */\n", " HH ( c, d, a, b, in[11], S33, 1839030562); /* 35 */\n", " HH ( b, c, d, a, in[14], S34, 4259657740); /* 36 */\n", " HH ( a, b, c, d, in[ 1], S31, 2763975236); /* 37 */\n", " HH ( d, a, b, c, in[ 4], S32, 1272893353); /* 38 */\n", " HH ( c, d, a, b, in[ 7], S33, 4139469664); /* 39 */\n", " HH ( b, c, d, a, in[10], S34, 3200236656); /* 40 */\n", " HH ( a, b, c, d, in[13], S31, 681279174); /* 41 */\n", " HH ( d, a, b, c, in[ 0], S32, 3936430074); /* 42 */\n", " HH ( c, d, a, b, in[ 3], S33, 3572445317); /* 43 */\n", " HH ( b, c, d, a, in[ 6], S34, 76029189); /* 44 */\n", " HH ( a, b, c, d, in[ 9], S31, 3654602809); /* 45 */\n", " HH ( d, a, b, c, in[12], S32, 3873151461); /* 46 */\n", " HH ( c, d, a, b, in[15], S33, 530742520); /* 47 */\n", " HH ( b, c, d, a, in[ 2], S34, 3299628645); /* 48 */\n", "\n", " /* Round 4 */\n", "#define S41 6\n", "#define S42 10\n", "#define S43 15\n", "#define S44 21\n", " II ( a, b, c, d, in[ 0], S41, 4096336452); /* 49 */\n", " II ( d, a, b, c, in[ 7], S42, 1126891415); /* 50 */\n", " II ( c, d, a, b, in[14], S43, 2878612391); /* 51 */\n", " II ( b, c, d, a, in[ 5], S44, 4237533241); /* 52 */\n", " II ( a, b, c, d, in[12], S41, 1700485571); /* 53 */\n", " II ( d, a, b, c, in[ 3], S42, 2399980690); /* 54 */\n", " II ( c, d, a, b, in[10], S43, 4293915773); /* 55 */\n", " II ( b, c, d, a, in[ 1], S44, 2240044497); /* 56 */\n", " II ( a, b, c, d, in[ 8], S41, 1873313359); /* 57 */\n", " II ( d, a, b, c, in[15], S42, 4264355552); /* 58 */\n", " II ( c, d, a, b, in[ 6], S43, 2734768916); /* 59 */\n", " II ( b, c, d, a, in[13], S44, 1309151649); /* 60 */\n", " II ( a, b, c, d, in[ 4], S41, 4149444226); /* 61 */\n", " II ( d, a, b, c, in[11], S42, 3174756917); /* 62 */\n", " II ( c, d, a, b, in[ 2], S43, 718787259); /* 63 */\n", " II ( b, c, d, a, in[ 9], S44, 3951481745); /* 64 */\n", "\n", " a += a0;\n", " b += b0;\n", " c += c0;\n", " d += d0;\n", " \n", " hash[0] = a;\n", " hash[1] = b;\n", " hash[2] = c;\n", " hash[3] = d;\n", " \n", " return;\n", "}\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 устройств доступно\n", "0 : GeForce GTX 1060\n", "\tcompute capability version: (6, 1)\n", "\ttotal memory: 6442450944\n", "\tattributes: {pycuda._driver.device_attribute.MAX_THREADS_PER_BLOCK: 1024, pycuda._driver.device_attribute.MAX_BLOCK_DIM_X: 1024, pycuda._driver.device_attribute.MAX_BLOCK_DIM_Y: 1024, pycuda._driver.device_attribute.MAX_BLOCK_DIM_Z: 64, pycuda._driver.device_attribute.MAX_GRID_DIM_X: 2147483647, pycuda._driver.device_attribute.MAX_GRID_DIM_Y: 65535, pycuda._driver.device_attribute.MAX_GRID_DIM_Z: 65535, pycuda._driver.device_attribute.MAX_SHARED_MEMORY_PER_BLOCK: 49152, pycuda._driver.device_attribute.TOTAL_CONSTANT_MEMORY: 65536, pycuda._driver.device_attribute.WARP_SIZE: 32, pycuda._driver.device_attribute.MAX_PITCH: 2147483647, pycuda._driver.device_attribute.MAX_REGISTERS_PER_BLOCK: 65536, pycuda._driver.device_attribute.CLOCK_RATE: 1670500, pycuda._driver.device_attribute.TEXTURE_ALIGNMENT: 512, pycuda._driver.device_attribute.GPU_OVERLAP: 1, pycuda._driver.device_attribute.MULTIPROCESSOR_COUNT: 10, pycuda._driver.device_attribute.KERNEL_EXEC_TIMEOUT: 1, pycuda._driver.device_attribute.INTEGRATED: 0, pycuda._driver.device_attribute.CAN_MAP_HOST_MEMORY: 1, pycuda._driver.device_attribute.COMPUTE_MODE: pycuda._driver.compute_mode.DEFAULT, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_HEIGHT: 65536, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_WIDTH: 16384, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_HEIGHT: 16384, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_DEPTH: 16384, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_ARRAY_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_ARRAY_HEIGHT: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES: 2048, pycuda._driver.device_attribute.SURFACE_ALIGNMENT: 512, pycuda._driver.device_attribute.CONCURRENT_KERNELS: 1, pycuda._driver.device_attribute.ECC_ENABLED: 0, pycuda._driver.device_attribute.PCI_BUS_ID: 1, pycuda._driver.device_attribute.PCI_DEVICE_ID: 0, pycuda._driver.device_attribute.TCC_DRIVER: 0, pycuda._driver.device_attribute.MEMORY_CLOCK_RATE: 4004000, pycuda._driver.device_attribute.GLOBAL_MEMORY_BUS_WIDTH: 192, pycuda._driver.device_attribute.L2_CACHE_SIZE: 1572864, pycuda._driver.device_attribute.MAX_THREADS_PER_MULTIPROCESSOR: 2048, pycuda._driver.device_attribute.ASYNC_ENGINE_COUNT: 2, pycuda._driver.device_attribute.UNIFIED_ADDRESSING: 1, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_LAYERED_LAYERS: 2048, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_GATHER_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_GATHER_HEIGHT: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_WIDTH_ALTERNATE: 8192, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_HEIGHT_ALTERNATE: 8192, pycuda._driver.device_attribute.MAXIMUM_TEXTURE3D_DEPTH_ALTERNATE: 32768, pycuda._driver.device_attribute.PCI_DOMAIN_ID: 0, pycuda._driver.device_attribute.TEXTURE_PITCH_ALIGNMENT: 32, pycuda._driver.device_attribute.MAXIMUM_TEXTURECUBEMAP_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURECUBEMAP_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURECUBEMAP_LAYERED_LAYERS: 2046, pycuda._driver.device_attribute.MAXIMUM_SURFACE1D_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_HEIGHT: 65536, pycuda._driver.device_attribute.MAXIMUM_SURFACE3D_WIDTH: 16384, pycuda._driver.device_attribute.MAXIMUM_SURFACE3D_HEIGHT: 16384, pycuda._driver.device_attribute.MAXIMUM_SURFACE3D_DEPTH: 16384, pycuda._driver.device_attribute.MAXIMUM_SURFACE1D_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE1D_LAYERED_LAYERS: 2048, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_LAYERED_HEIGHT: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACE2D_LAYERED_LAYERS: 2048, pycuda._driver.device_attribute.MAXIMUM_SURFACECUBEMAP_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACECUBEMAP_LAYERED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_SURFACECUBEMAP_LAYERED_LAYERS: 2046, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_LINEAR_WIDTH: 134217728, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_LINEAR_WIDTH: 131072, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_LINEAR_HEIGHT: 65000, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_LINEAR_PITCH: 2097120, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_MIPMAPPED_WIDTH: 32768, pycuda._driver.device_attribute.MAXIMUM_TEXTURE2D_MIPMAPPED_HEIGHT: 32768, pycuda._driver.device_attribute.COMPUTE_CAPABILITY_MAJOR: 6, pycuda._driver.device_attribute.COMPUTE_CAPABILITY_MINOR: 1, pycuda._driver.device_attribute.MAXIMUM_TEXTURE1D_MIPMAPPED_WIDTH: 16384, pycuda._driver.device_attribute.STREAM_PRIORITIES_SUPPORTED: 1, pycuda._driver.device_attribute.GLOBAL_L1_CACHE_SUPPORTED: 1, pycuda._driver.device_attribute.LOCAL_L1_CACHE_SUPPORTED: 1, pycuda._driver.device_attribute.MAX_SHARED_MEMORY_PER_MULTIPROCESSOR: 98304, pycuda._driver.device_attribute.MAX_REGISTERS_PER_MULTIPROCESSOR: 65536, pycuda._driver.device_attribute.MANAGED_MEMORY: 1, pycuda._driver.device_attribute.MULTI_GPU_BOARD: 0, pycuda._driver.device_attribute.MULTI_GPU_BOARD_GROUP_ID: 0}\n", "True\n" ] } ], "source": [ "mod = pycuda.compiler.SourceModule(\"\"\"\n", "__global__ void multiply_them(float *dest, float *a, float *b)\n", "{\n", " const int i = threadIdx.x;\n", " dest[i] = a[i] * b[i];\n", "}\n", "\"\"\")\n", "\n", "multiply_them = mod.get_function(\"multiply_them\")\n", "\n", "a = numpy.random.randn(400).astype(numpy.float32)\n", "b = numpy.random.randn(400).astype(numpy.float32)\n", "\n", "dest = numpy.zeros_like(a)\n", "multiply_them(pycuda.driver.Out(dest), pycuda.driver.In(a), pycuda.driver.In(b), block=(400,1,1))\n", "\n", "print numpy.allclose(dest, a*b)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo распознавание лиц, объектов, сегментация, распознавание речи, ImageNet" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Тензорная операция, нелинейность, sigmoid, ReLU, обратное распространение ошибки по слоям\n", "* Фреймворк DL, параллелизация на GPU, автодифференцирование\n", "* Кирпичи conv, maxpool, dropout, batchnorm\n", "* Дообучение, расписание обучения, NAG, ADAM\n", "* Репозитории с претренированными моделями, AlexNet, VGG, ResNet\n", "* CNN, R-CNN, artistic style transfer\n", "* Генерация батчей: шум, аффинные трансформации\n", "* autoencoder, word2vec\n", "* GAN\n", "* LSTM, RNN" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo Deep learning\n", "\n", " CUDA 9.0 требует Visual Studio 2017\n", " CuDNN https://developer.nvidia.com/cudnn\n", " \tнадо ли? в Path:\n", "\tc:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\VC\\Tools\\MSVC\\14.10.25017\\bin\\HostX64\\x64\\\n", "\n", "\tpycuda? или OpenCL\n", " pytorch? tensorflow?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tensorflow это Ким Кардашьян машинного обучения." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", " Theano (0.8.0)\n", " Lasagne (0.2.dev1)\n", " pip install --upgrade https://github.com/Theano/Theano/archive/master.zip\n", " pip install --upgrade https://github.com/Lasagne/Lasagne/archive/master.zip\n", "\n", " conda install mingw libpython\n", " pip install --upgrade --no-deps git+git://github.com/Theano/Theano.git\n", " убедиться, чтобы он вызывал для компиляции свой, mingwшный gcc (x64, 4.7.0)\n", " иначе может быть sorry, unimplemented: 64-bit mode not compiled in\n", " если Theano не скомпилит, что ему там нужно, выдаст Can not import gof\n", "\n", " Добавить системную переменную окружения THEANO_FLAGS со значением “floatX=float32,device=gpu,nvcc.fastmath=True”\n", " Using gpu device 0: GeForce GT 540M (CNMeM is disabled, CuDNN not available)\n", " CNMeM (a faster CUDA memory allocator) -- стоит использовать\n", " theano.config.device должен вывести gpu\n", " Можно os.environ.update({'THEANO_FLAGS': '...'})\n", "\n", " theano.printing.pydotprint(f, outfile=\"f.png\", var_with_name_simple=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", " [под админом] pip install protobuf\n", " скачать https://github.com/Microsoft/caffe и следовать инструкциям по установке\n", " /windows/CommonSettings.props.example -> /windows/CommonSettings.props\n", " false\n", " true\n", " compute_20,sm_20\n", " c:\\Users\\User\\Anaconda2\n", " открыть /windows/Caffe.sln в VS 2013 и сбилдить\n", " скопировать /Build/x64/Release/pycaffe/caffe/ -> c:\\Users\\User\\Anaconda2\\Lib\\site-packages\\caffe\\\n", " переименовать папку со скачанным caffe-master, иначе тот почему там начинает искать файлы" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo Составить табличку зоопарков Theano, Keras, Lasagne, Caffe, Torch, Tensorflow, CNTK, еще?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo \n", "\n", " CNTK\n", " https://docs.microsoft.com/en-us/cognitive-toolkit/setup-windows-python?tabs=cntkpy22\n", " https://docs.microsoft.com/en-us/cognitive-toolkit/using-cntk-with-keras\n", " \n", " pip install cntk-gpu" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", " Keras (0.3.2)\n", " https://github.com/fchollet/hualos Keras Total Visualization project\n", " pip install keras\n", " from keras.datasets import mnist, boston_housing, cifar10, imdb\n", " from keras.layers.convolutional import Convolution2D, MaxPooling2D\n", " from keras.layers.core import Dense, Activation, Dropout, Flatten, TimeDistributedDense\n", " from keras.layers.embeddings import Embedding\n", " from keras.layers.recurrent import LSTM, SimpleRNN\n", " from keras.models import Graph, Sequential\n", " from keras.optimizers import SGD, Adam\n", " from keras.utils import np_utils" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from keras.model import Sequential\n", "from keras.layers import Dense\n", "\n", "data = random((1000,100))\n", "labels = randint(2, size=(1000,1))\n", "\n", "model = Sequential()\n", "model.add(Dense(32, activation='relu', input_dim=100, kernel_initializer='uniform'))\n", "model.add(Dense(2, activation='sigmoid'))\n", "model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])\n", "model.fit(data, labels, epochs=10, batch_size=32, verbose=1, validation_data=(X_test, Y_test))\n", "predictions = model.predict(data)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "keras.preprocessing.sequence.pad_sequences(x_train, maxlen=80)\n", "keras.utils.to_categorical(y_train, num_classes)\n", "Dropout(0.2)\n", "activatoin='softmax'\n", "Conv2D(32, (3,3), padding='same', input_shape=...)\n", "Activation('relu')\n", "MaxPooling2D(pool_size=(2,2))\n", "Flatten()\n", "\n", "Embedding(20000, 128)\n", "LSTM(128, dropout=0.2, recurrent_dropout=0.2)\n", "\n", "optimizer='adam'\n", "optimizer=keras.optimizers.RMSprop(lr=0.0001, decay=1e-6)\n", "loss='mse'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "model.output_shape\n", "model.summary()\n", "model.get_config()\n", "model.get_weights()\n", "model.save('model.h5')\n", "model = keras.models.load_model('model.h5')\n", "\n", "model.evaluate(X_test, Y_test, batch_size=32)\n", "model.predict_classes(X_test, batch_size=32)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "model.fit(..., callbacks=[keras.callbacks.EarlyStopping(patience=2)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "todo\n", "\n", " LSH lshash\n", " sklearn:\n", " multiclass (OneVsRestClassifier)\n", " neural_network\n", " utils (resample)\n", " \n", "todo обучение с подкреплением UCB1\n", "\n", "todo sentiment analysis?\n", "\n", "todo метод отжига\n", "\n", "todo\n", "\n", " rpy2, R.arima\n", "\n", " statsmodel, minepy (http://minepy.sourceforge.net/docs/1.0.0/install.html) -- для MIC, \"корреляции 21-го века\"\n", " import statsmodels.graphics.mosaicplot\n", " from statsmodels.tsa.arima_model import ARIMA" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 }