{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Семинар 4. Линейная алгебра." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В чем преимущество numpy?" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как измерить время выполнения?\n", " - пакет time в python\n", " - %timeit (IPython magic function for timing)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "A_quick_arr = np.random.normal(size = (100000,))\n", "B_quick_arr = np.random.normal(size = (100000,))\n", "\n", "A_slow_list, B_slow_list = list(A_quick_arr), list(B_quick_arr)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 loops, best of 3: 41.5 ms per loop\n" ] } ], "source": [ "def my_sum(a, b):\n", " ans = 0\n", " for i in range(100000): \n", " ans += a[i] * b[i]\n", " return ans\n", "\n", "%timeit my_sum(A_quick_arr, B_quick_arr)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 loops, best of 3: 25.3 ms per loop\n" ] } ], "source": [ "%timeit sum([A_slow_list[i] * B_slow_list[i] for i in range(100000)])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000 loops, best of 3: 150 µs per loop\n" ] } ], "source": [ "%timeit np.sum(A_quick_arr * B_quick_arr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Что было в прошлый раз (и будет сегодня)? Линейная алгебра!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](https://imgs.xkcd.com/comics/forgot_algebra.png)\n", "\n", "### Вектора и матрицы. \n", "\n", "#### Вектора\n", "$x = (x^1, ..., x^d)$ — вектор\n", "\n", "Векторное пространство $V$ — это множество:\n", " - состоящее из векторов \n", " - с определенными операциями сложения и умножения на число \n", " - замкнуто относительно этих операций\n", " - и выполнены 8 аксиом (см. лекцию)\n", " \n", "Например: евклидово пространство (вектор — набор вещественных чисел)\n", "\n", "Какое отношение имеет к анализу данных? Описывает объект!\n", "\n", "Например: задача кредитного скоринга. \n", "Объект — человек. \n", "Признаки:\n", " - пол (1 — мужской, 0 - женский)\n", " - зарплата \n", " - семейный статус (1 — женат, 0 - холост)\n", " - возраст\n", " - ...\n", "\n", "Получаем вектор:\n", "\n", "$x = (1, 100500, 1, 41, ...)$\n", "\n", "А как описать много объектов?\n", "\n", "#### Матрицы\n", "\n", "Хотим знать информацию про многих людей (матрица объекты-признаки):\n", "\n", "$ X = \\begin{pmatrix}\n", "1& 100500& 1& 41& ... \\\\ \n", "0& 0& 0& 18& ... \\\\\n", "...& ...& ...& ...& ... \\\\\n", "\\end{pmatrix}$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Линейная независимость\n", "\n", "Один из векторов можно выразить через другие с помощью линейной комбинаций.\n", "\n", "Размерность векторного пространства — максимальное количество линейно независимых векторов в нем.\n", "\n", "Как понять что вектора линейно независимы? — Например, вычислить ранг (максимальное число линейно независимых строк/столбцов).\n", "\n", "**Как искать ранг?** [зайдем на википедию]\n", "\n", "1. Метод элементарных преобразований. Ранг матрицы равен числу ненулевых строк в матрице после приведения её к ступенчатой форме при помощи элементарных преобразований над строками матрицы. \n", "2. Метод окаймляющих миноров. Пусть в матрице A найден ненулевой минор k-го порядка M. Рассмотрим все миноры (k+1)-го порядка, включающие в себя (окаймляющие) минор M; если все они равны нулю, то ранг матрицы равен k. В противном случае среди окаймляющих миноров найдется ненулевой, и вся процедура повторяется.\n", "\n", "Выберем первый пункт.\n", "\n", "Как привести матрицу к ступенчатому виду?\n", "\n", "Элементарными преобразованиями матрицы называются следующие ее преобразования:\n", "\n", "1. Перестановка двух столбцов (строк) матрицы.\n", "2. Умножение всех элементов одного столбца (строки) матрицы на одно и то же число, отличное от нуля.\n", "3. Прибавление к элементам одного столбца (строки) соответствующих элементов другого столбца (строки), умноженных на одно и то же число.\n", "\n", "Алгоритм решения:\n", "1. В первом столбце выбрать элемент, отличный от нуля (ведущий элемент). Строку с ведущим элементом (ведущая строка), если она не первая, переставить на место первой строки (преобразование 1 типа). Если в первом столбце нет ведущего (все элементы равны нулю), то исключаем этот столбец, и продолжаем поиск ведущего элемента в оставшейся части матрицы. 2. Преобразования заканчиваются, если исключены все столбцы или в оставшейся части матрицы все элементы нулевые.\n", "Разделить все элементы ведущей строки на ведущий элемент (преобразование 2 типа). Если ведущая строка последняя, то на этом преобразования следует закончить.\n", "3. К каждой строке, расположенной ниже ведущей, прибавить ведущую строку, умноженную соответственно на такое число, чтобы элементы, стоящие под ведущим оказались равными нулю (преобразование 3 типа).\n", "4. Исключив из рассмотрения строку и столбец, на пересечении которых стоит ведущий элемент, перейти к пункту 1, в котором все описанные действия применяются к оставшейся части матрицы.\n", "\n", "Задание: найти ранг матрицы A\n", "\n", "$A = \\begin{pmatrix}\n", "3 & 1& -1 & -2 & 8 \\\\ \n", "7 & 1 & -2 & -1 & 12 \\\\\n", "11 & 1 & -3 & 0 & 16 \\\\\n", "2 & 2 & -1 & -5 & 12\n", "\\end{pmatrix}$\n", "\n", "[будет на проверочной =)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Системы линейных уравнений\n", "\n", "Вектор-строка: $w = (w_1, ..., w_d) \\in \\mathbb{R}^{1 \\times d}$\n", "\n", "Вектор-столбец: $w = \\begin{pmatrix}\n", "w_1 \\\\ \n", "... \\\\\n", "w_d\n", "\\end{pmatrix} \\in \\mathbb{R}^{d \\times 1}$\n", "\n", "$Xw = y$ (линейная модель)\n", "\n", "Количество решений:\n", " - бесконечно\n", " - одно\n", " - ни одного\n", " \n", "Как понять?\n", " - если ранги X и X|y совпадают, то 1\n", " - если ранг X|y больше ранга X, то нисколько (система несовместа) \n", " - если rg(X) < d — то бесконечно.\n", "\n", "Как решать? Метод Гаусса.\n", "\n", "Два прохода:\n", "\n", "1. **Прямой.** На первом этапе осуществляется так называемый прямой ход, когда путём элементарных преобразований над строками систему приводят к ступенчатой или треугольной форме, либо устанавливают, что система несовместна. А именно, среди элементов первого столбца матрицы выбирают ненулевой, перемещают его на крайнее верхнее положение перестановкой строк и вычитают получившуюся после перестановки первую строку из остальных строк, домножив её на величину, равную отношению первого элемента каждой из этих строк к первому элементу первой строки, обнуляя тем самым столбец под ним. После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают пока не останется матрица нулевого размера. Если на какой-то из итераций среди элементов первого столбца не нашёлся ненулевой, то переходят к следующему столбцу и проделывают аналогичную операцию. \n", "2. **Обратный.** На втором этапе осуществляется так называемый обратный ход, суть которого заключается в том, чтобы выразить все получившиеся базисные переменные через небазисные и построить фундаментальную систему решений, либо, если все переменные являются базисными, то выразить в численном виде единственное решение системы линейных уравнений. Эта процедура начинается с последнего уравнения, из которого выражают соответствующую базисную переменную (а она там всего одна) и подставляют в предыдущие уравнения, и так далее, поднимаясь по «ступенькам» наверх. Каждой строчке соответствует ровно одна базисная переменная, поэтому на каждом шаге, кроме последнего (самого верхнего), ситуация в точности повторяет случай последней строки." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### На практике" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Загрузим данные для задачи кредитного скоринга:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Status of existing checking accountDuration in monthCredit historyPurposeCredit amountSavings account/bondsPresent employment sinceInstallment rate in percentage of disposable incomePersonal status and sexOther debtors / guarantors...PropertyAge in yearsOther installment plansHousingNumber of existing credits at this bankJobNumber of people being liable to provide maintenance forTelephoneforeign workerCredit
0A116A34A431169A65A754A93A101...A12167A143A1522A1731A192A2011
1A1248A32A435951A61A732A92A101...A12122A143A1521A1731A191A2012
2A1412A34A462096A61A742A93A101...A12149A143A1521A1722A191A2011
3A1142A32A427882A61A742A93A103...A12245A143A1531A1732A191A2011
4A1124A33A404870A61A733A93A101...A12453A143A1532A1732A191A2012
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " Status of existing checking account Duration in month Credit history \\\n", "0 A11 6 A34 \n", "1 A12 48 A32 \n", "2 A14 12 A34 \n", "3 A11 42 A32 \n", "4 A11 24 A33 \n", "\n", " Purpose Credit amount Savings account/bonds Present employment since \\\n", "0 A43 1169 A65 A75 \n", "1 A43 5951 A61 A73 \n", "2 A46 2096 A61 A74 \n", "3 A42 7882 A61 A74 \n", "4 A40 4870 A61 A73 \n", "\n", " Installment rate in percentage of disposable income \\\n", "0 4 \n", "1 2 \n", "2 2 \n", "3 2 \n", "4 3 \n", "\n", " Personal status and sex Other debtors / guarantors ... Property \\\n", "0 A93 A101 ... A121 \n", "1 A92 A101 ... A121 \n", "2 A93 A101 ... A121 \n", "3 A93 A103 ... A122 \n", "4 A93 A101 ... A124 \n", "\n", " Age in years Other installment plans Housing \\\n", "0 67 A143 A152 \n", "1 22 A143 A152 \n", "2 49 A143 A152 \n", "3 45 A143 A153 \n", "4 53 A143 A153 \n", "\n", " Number of existing credits at this bank Job \\\n", "0 2 A173 \n", "1 1 A173 \n", "2 1 A172 \n", "3 1 A173 \n", "4 2 A173 \n", "\n", " Number of people being liable to provide maintenance for Telephone \\\n", "0 1 A192 \n", "1 1 A191 \n", "2 2 A191 \n", "3 2 A191 \n", "4 2 A191 \n", "\n", " foreign worker Credit \n", "0 A201 1 \n", "1 A201 2 \n", "2 A201 1 \n", "3 A201 1 \n", "4 A201 2 \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = pd.read_csv('german.data.txt', sep='\\t')\n", "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Переведем строки в числа:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "cat_columns = data.select_dtypes(['object']).columns\n", "data[cat_columns] = data[cat_columns].apply(lambda x: x.astype('category'))\n", "data[cat_columns] = data[cat_columns].apply(lambda x: x.cat.codes)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Status of existing checking accountDuration in monthCredit historyPurposeCredit amountSavings account/bondsPresent employment sinceInstallment rate in percentage of disposable incomePersonal status and sexOther debtors / guarantors...PropertyAge in yearsOther installment plansHousingNumber of existing credits at this bankJobNumber of people being liable to provide maintenance forTelephoneforeign workerCredit
00644116944420...06721221101
114824595102210...02221121002
231247209603220...04921112001
304223788203222...14522122001
402430487002320...35322222002
\n", "

5 rows × 21 columns

\n", "
" ], "text/plain": [ " Status of existing checking account Duration in month Credit history \\\n", "0 0 6 4 \n", "1 1 48 2 \n", "2 3 12 4 \n", "3 0 42 2 \n", "4 0 24 3 \n", "\n", " Purpose Credit amount Savings account/bonds Present employment since \\\n", "0 4 1169 4 4 \n", "1 4 5951 0 2 \n", "2 7 2096 0 3 \n", "3 3 7882 0 3 \n", "4 0 4870 0 2 \n", "\n", " Installment rate in percentage of disposable income \\\n", "0 4 \n", "1 2 \n", "2 2 \n", "3 2 \n", "4 3 \n", "\n", " Personal status and sex Other debtors / guarantors ... Property \\\n", "0 2 0 ... 0 \n", "1 1 0 ... 0 \n", "2 2 0 ... 0 \n", "3 2 2 ... 1 \n", "4 2 0 ... 3 \n", "\n", " Age in years Other installment plans Housing \\\n", "0 67 2 1 \n", "1 22 2 1 \n", "2 49 2 1 \n", "3 45 2 2 \n", "4 53 2 2 \n", "\n", " Number of existing credits at this bank Job \\\n", "0 2 2 \n", "1 1 2 \n", "2 1 1 \n", "3 1 2 \n", "4 2 2 \n", "\n", " Number of people being liable to provide maintenance for Telephone \\\n", "0 1 1 \n", "1 1 0 \n", "2 2 0 \n", "3 2 0 \n", "4 2 0 \n", "\n", " foreign worker Credit \n", "0 0 1 \n", "1 0 2 \n", "2 0 1 \n", "3 0 1 \n", "4 0 2 \n", "\n", "[5 rows x 21 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И перейдем к numpy." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1000" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = data.shape[0]\n", "n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((1000, 21), (1000,))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.append(data.iloc[:, :-1].values.astype(float), np.ones((n, 1)), axis=1)\n", "y = data.iloc[:, -1].values.astype(float)\n", "\n", "X.shape, y.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем ранг матрицы объект-признак:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "21" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.matrix_rank(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(повезло: признаки не являются линейно зависимыми)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Попробуем понять есть ли в данных линейные зависимости: возьмем 21 случайную строку (чтобы матрица стала квадратной) и найдем ее ранг:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((21, 21), 20)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(42)\n", "rows = np.random.randint(1000,size=21)\n", "nm = X[rows,:]\n", "nm.shape, np.linalg.matrix_rank(nm)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Убедимся что в новой матрице нет одинаковых строк:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(21, 21)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([np.array(x) for x in set(tuple(x) for x in nm)]).shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Что следует из того что есть линейная зависимость? Попробуем решить систему линейных уравнений:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "ename": "LinAlgError", "evalue": "Singular matrix", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mLinAlgError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrows\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mrows\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python2.7/site-packages/numpy/linalg/linalg.pyc\u001b[0m in \u001b[0;36msolve\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0msignature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'DD->D'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misComplexType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'dd->d'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 383\u001b[0m \u001b[0mextobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_linalg_error_extobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 384\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgufunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 385\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 386\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_t\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python2.7/site-packages/numpy/linalg/linalg.pyc\u001b[0m in \u001b[0;36m_raise_linalgerror_singular\u001b[0;34m(err, flag)\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 89\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 90\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Singular matrix\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 91\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_nonposdef\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mLinAlgError\u001b[0m: Singular matrix" ] } ], "source": [ "x = np.linalg.solve(X[rows], y[rows])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Данная система не имеет решений =(" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Но не всегда так не везет!" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "((21, 21), 21)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(142)\n", "rows = np.random.randint(1000,size=21)\n", "nm = X[rows,:]\n", "nm.shape, np.linalg.matrix_rank(nm)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ -2.99216921e-02, 8.66409086e-03, -2.25136409e-01,\n", " 7.47890269e-02, -1.30339676e-05, -2.04741197e-01,\n", " 8.28007712e-02, 8.03605876e-02, -4.09370486e-01,\n", " -2.65860629e-01, 1.71389781e-02, -6.91278040e-02,\n", " -1.03222035e-02, 2.06218175e-01, 1.99075635e-01,\n", " 5.07476369e-01, 1.96957240e-02, 1.20145042e+00,\n", " 1.79877359e-01, 4.88324529e-01, -5.48225946e-01])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.linalg.solve(X[rows], y[rows])\n", "x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Лирическое отступление: какой из признаков имеет наибольший вес?" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'Number of people being liable to provide maintenance for'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.columns[np.argmax(x)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Но как-то скучно решать системы, где количество строк равно количеству столбцов (получается, нужно выкинуть оочень много данных). Об этом — в следующий раз!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Операции в векторных пространствах\n", "\n", "Норма — обобщенное понятие длины вектора\n", "\n", "**Евклидова**: $L_2$\n", "\n", "$\\left\\lVert x \\right\\rVert_2 = \\sqrt{\\sum_{i=1}^n |x_i|^2}$ \n", "\n", "**Манхеттенская**: $L_1$\n", "\n", "$\\left\\lVert x \\right\\rVert_1 = \\sum_{i=1}^n |x_i|$ \n", "\n", "**Минковского**: $L_p$\n", "\n", "$\\left\\lVert x \\right\\rVert_p = (\\sum_{i=1}^n |x_i|^p)^{1/p}$\n", "\n", "$L_{\\infty}$:\n", "\n", "$\\left\\lVert x \\right\\rVert_{\\infty} = max_i |x_i|$" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1000.01181277\n", "31.6231647064\n", "1.00267597135\n" ] } ], "source": [ "a = np.ones(n) + 1e-3 * np.random.randn(n)\n", "print(np.linalg.norm(a, 1))\n", "print(np.linalg.norm(a, 2))\n", "print(np.linalg.norm(a, np.inf))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Единичный шар — это множество точек таких что $\\left\\lVert x \\right\\rVert \\le 1$. Для $L_2$ это круг, для остальных \"шар\" может выглядеть неожиданно:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "%pylab inline\n", "import matplotlib.pyplot as plt\n", "\n", "def plot_disk(p):\n", " fig = plt.figure()\n", " M = 40000\n", " a = np.random.randn(M, 2)\n", " b = []\n", " for i in xrange(M):\n", " if np.linalg.norm(a[i, :], p) <= 1:\n", " b.append(a[i, :])\n", " b = np.array(b)\n", " plt.fill(b[:, 0], b[:, 1])\n", " plt.axis('equal')\n", " plt.grid()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_disk(1)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nUgSEECKE/X98jmZTXB+osAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_disk(2)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_disk(np.inf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](https://s-media-cache-ak0.pinimg.com/originals/56/56/4a/56564a12aadb20184126b0e4e9edc165.jpg)" ] } ], "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.10" } }, "nbformat": 4, "nbformat_minor": 0 }