{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Домашняя работа №2\n", "Шестаков А.В. Майнор по анализу данных 2016" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "**Общая информация**\n", "\n", "**Срок сдачи:** 16 февраля 2016, 23:59 \n", "**Штраф за опоздание:** -0.5 за каждый день\n", "\n", "При отправлении ДЗ на почту указывайте фамилию в названии файла, а тему письма оформляйте в следующем виде:\n", "** [Майнор ИАД 2016] *{Фамилия}* *{Имя}* ДЗ*{Номер}* **\n", "\n", "\n", "Сопровождайте ваш код изображеними, комментариями и выводами. \n", "Иммейте ввиду, что на некоторые задачи нет единственного верного и полного ответа. Чем больше информации вы сможете извлечь, аргументированных выводов сформулировать, тем лучше.\n", "\n", "Используйте данный Ipython Notebook при оформлении домашнего задания.\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Метод главных компонент при работе с изображениями" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Скачайте небольшую [базу](http://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html) изображений лиц. В ней содержится по 10 изображений на каждого из 40 субъектов. \n", "\n", "Функция `read_pgm` загружает данные из файла формата pgm в numpy.array размера $112 \\times 92$. Значения в этом массиве лежат в интервале $[0, 255]$, значение $0$ соответствует черному цвету, а значение $255$ - белому.\n", "256 Shades of Grey..." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import re\n", "import numpy as np\n", "import os\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def read_pgm(filename, byteorder='>'):\n", " '''\n", " Return image data from a raw PGM file as numpy array.\n", "\n", " Format specification: http://netpbm.sourceforge.net/doc/pgm.html\n", "\n", " '''\n", " with open(filename, 'rb') as f:\n", " buffer = f.read()\n", " try:\n", " header, width, height, maxval = re.search(\n", " b\"(^P5\\s(?:\\s*#.*[\\r\\n])*\"\n", " b\"(\\d+)\\s(?:\\s*#.*[\\r\\n])*\"\n", " b\"(\\d+)\\s(?:\\s*#.*[\\r\\n])*\"\n", " b\"(\\d+)\\s(?:\\s*#.*[\\r\\n]\\s)*)\", buffer).groups()\n", " except AttributeError:\n", " raise ValueError(\"Not a raw PGM file: '%s'\" % filename)\n", " return np.frombuffer(buffer,\n", " dtype='u1' if int(maxval) < 256 else byteorder+'u2',\n", " count=int(width)*int(height),\n", " offset=len(header)\n", " ).reshape((int(height), int(width)))\n" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "image = read_pgm('att_faces/s1/1.pgm', byteorder='<')\n", "image.flags.writeable = True\n", "plt.imshow(image, plt.cm.gray)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 1.** Импортируйте изображения всех 40 субъектов. В результате выполнения этой задачи вы должны получить\n", "\n", "* Матрицу $X$ размера $400 \\times 10304,$ $(10304 = 112 \\cdot 92)$\n", "* Массив $y$ длинны $400$ с идентификаторами субъектов от $1$ до $40$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "X = np.empty((400, 10304))\n", "y = np.empty((400, ))\n", "\n", "att_faces_dir = './att_faces'\n", "\n", "i = 0\n", "for folder in os.listdir(att_faces_dir):\n", " subject_dir = os.path.join(att_faces_dir, folder)\n", " if os.path.isdir(subject_dir):\n", " for pgm in os.listdir(subject_dir):\n", " # Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 2.** Изобразите \"усредненный\" портрет субъекта по всей базе" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "**Задача 3.** Разделите выборку на 2 группы в пропорции 80/20 (должно получиться 320 и 80 изображений):\n", "\n", "* Галерея: часть набора изображений, для которого известен идентификатор субъекта\n", "* Проба: часть набора изображений, для которого необходимо будет определить идентификатор субъекта\n", "\n", "Используйте метод `np.random.choice()`. Сэплирование необходимо произвести без возрата!" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 4.** Идентификация \"в лоб\"\n", "\n", "Выберите меру расстояния и помощью метода `scipy.spatial.distance.cdist()` посчитайте расстояние между всеми парами изображений галерея-проба.\n", "\n", "Для каждлого изображения из пробы, определите какому субъекту принадлежит ближайшая картинка из галереи. Используйте метод `np.argmin()`. Оцените ошибку идентификаии. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from scipy.spatial import distance" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 4.** Метод главных компонент\n", "\n", "Примените метод главных компонент к набору данных из галереи (Сохраните массивы средних - они вам еще приходятся). \n", "\n", "Определите, сколько компонент достаточно для достижения того же (или лучшего) качаства идентификации." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 5.** Разложение лица по компонентам\n", "\n", "Мы уже знаем, что для любой матрицы можно расчитать сингулярное разложение:\n", "$$ A = U \\Sigma V^\\top .$$ (Кстати, проверьте, что `A = u.dot(Sigma).dot(v)`)\n", "\n", "Выполним \"разложение\" изображения по перым $k$ главным компонентам. Это значит, что надо расчитать матрицу\n", "$$ A' = U \\Sigma^{(k)} V^\\top ,$$\n", "где матрица $\\Sigma^{(k)}$ получилась как матрица $\\Sigma$, в которой все значения, кроме $k$ первых строк заменили на 0.\n", "\n", "Выберите лицо и разложите его на $k=10, 20, 50, 100$ компонент. Изобразите оригинальное изображение и результаты разложения." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Метод градиентного спуска" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Напомним суть метода градиентого спуска в контексте задачи линейной регрессии.\n", "\n", "Дано описание $n$ объектов по $m$ признакам. Обычно оно выражается в виде матрицы размера $n \\times m$: $X = [x^{(i)}_j]^{i=1\\dots n}_{j=1\\dots m} $. ($x^{(i)}_j$ означает $j$-ый признак $i$-го объекта) \n", "Дана зависимая переменная, которая тоже имеет отношение к этим объекам: $y$ - вектор длины $n$.\n", "\n", "Наша задача, выявить **линейную** зависимость между признаками в $X$ и значениями в $y$:\n", "$$\\hat{y} = X\\beta \\quad \\Leftrightarrow \\quad \\hat{y}^{(i)} = \\beta_0 + \\beta_1x^{(i)}_1 + \\dots$$\n", "\n", "И сделать это так, чтобы квадрат суммы ошибок наших оценок был минимален:\n", "$$ L(\\beta) = \\frac{1}{2n}(\\hat{y} - y)^{\\top}(\\hat{y} - y) = \\frac{1}{2n}(X\\beta - y)^{\\top}(X\\beta - y) \\rightarrow \\min$$ $$ \\Updownarrow $$ $$ L(\\beta_0,\\beta_1,\\dots) = \\frac{1}{2n}\\sum^{n}_{i=1}(\\hat{y}^{(i)} - y^{(i)})^2 = \\frac{1}{2n}\\sum^{n}_{i=1}(\\beta_0 + \\beta_1x^{(i)}_1 + \\dots - y^{(i)})^2 \\rightarrow \\min $$\n", "\n", "Значение в $X$ и $y$ нам даны. Нам неизвестны только значения коэффициентов $\\beta$. Соответственно, нужно найти такие значения $\\beta$, что функция $L(\\beta) \\rightarrow \\min.$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На семинаре мы выяснили, чему равен градиент функции потерь $L(\\beta_0, \\beta_1):$\n", "$$ \\frac{\\partial L}{\\partial \\beta_0} = \\frac{1}{n}\\sum^{n}_{i=1}(\\beta_0 + \\beta_1x^{(i)}_1 - y^{(i)})$$\n", "$$ \\frac{\\partial L}{\\partial \\beta_1} = \\frac{1}{n}\\sum^{n}_{i=1}(\\beta_0 + \\beta_1x^{(i)}_1 - y^{(i)})x_1^{(i)}$$\n", "\n", "Иногда проще это записать в виде матриц:\n", "$$ \\frac{\\partial L}{\\partial \\beta} = X^\\top(X\\beta - y)$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Метод градиентного спуска заключается в итеративном и **одновременном(!!!)** обновлении значений $\\beta$ в направлении, противоположному градиенту:\n", "$$ \\beta := \\beta - \\alpha\\frac{\\partial L}{\\partial \\beta}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 1:** Загрузите [данные](http://bit.ly/1gIQs6C) по характеристикам автомобилей Honda Accord. Названия столбцов говорят сами за себя.\n", "\n", "Составьте матрицу $X$, состоящую из единичного столбца и признака \"пробег\". \n", "Составьте вектор $y$ состоящий из стоимости автомобиля.\n", "\n", "Если для импорта вы используете `pandas`, то через .values из DataFrame можно получить numpy array." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 2:** Изобразите функционал квадратичной ошибки $L(\\beta_0, \\beta_1)$ в 3D и его линии уровня" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 3:** Напишите код, реализующий метод градиентного спуска. На вход метод должен принимать исходные данные, максимальное кол-во итераций и коэффициент скорости спуска." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задача 4:** Выведите полученные значения коэфициентов $\\beta$. Как они интерпретируются? Изобразите на одном графике $[y - \\text{\"пробег\"}]$ точки и полученную прямую." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Your code here" ] } ], "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.11" } }, "nbformat": 4, "nbformat_minor": 0 }