{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python и красивые ножки - демонстрация тетрадок IPython и библиотек Python\n", "#### Автор материала: преподаватель Факультета Компьютерных Наук НИУ ВШЭ Кашницкий Юрий" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Раньше мы уже искали необычные модели Playboy с помощью библиотеки Python Scikit-learn. \n", "Теперь мы продемонстрируем некоторые возможности библиотек SymPy, SciPy и Matplotlib на живом примере из разряда занимательных школьных задач по математике. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Задача 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Стоит девушка с изящными, натренированными, а главное, оголенными ножками. Скучает. Перед тем как демонстрировать свой (n+1)-ый уровень владения техникой пикапа, хочется получше рассмотреть ножки девушки - а стоит ли овчинка выделки? Получше рассмотреть - это под наибольшим углом. Можно незаметно подходить к девушке (типа вдаль смотришь), но приседать нельзя - надо же как-то и приличия соблюдать. С какого расстояния ножки видны под наибольшим углом? Допустим, Ваш рост таков, что глаза находятся на высоте $m$ над поверхностью земли. Ноги девушки оголены до высоты $f$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Картинка и перефразированная задача из \"Кристоф Дрессер: Обольстить математикой. Числовые игры на все случаи жизни. Бином. Лаборатория знаний, 2015\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Решение" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Поясним проблему. Издалека плохо рассматривать ноги - они видны под слишком малым углом. Но и если подойти слишком близко, ноги тоже будут видны под малым углом. Где-то должно быть оптимальное расстояние. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Пусть $x$ - расстояние до девушки, $f$ - длина оголенной части ног девушки, $\\alpha$ - угол, под которым ноги видны (надо максимизировать)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Угол $\\alpha$ проще всего найти, вычитая из прямого угла углы $\\beta$ и $\\gamma$. Если школьная тригонометрия еще как-то жива в закоулках мозга, легко получим, что" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
$\\alpha$ = $\\frac{\\pi}{2} - arctg(\\frac{x}{m}) - arctg(\\frac{m-f}{x})$
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Задача сводится к максимизации $\\alpha$ по переменной $x$.\n", "Ну это тоже просто, скажем мы: зануляем производную - и вперед! " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для начала построим график функции $\\alpha(x)$. Для определенности возьмем значения переметров $m=1.7\\ м$ и $f=0.7\\ м$ (хотелось бы 1 м, но все же предполагается, что имеется некая юбка.)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "source": [ "# отключим лишние предупреждения Anaconda\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "%pylab inline\n", "import numpy as np\n", "from math import pi, atan" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nIYxArpX/AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def alpha(x, m, f):\n", " return pi/2 - atan(x/m) - atan((m-f)/x)\n", "\n", "x = np.arange(0,6,0.05)\n", "plot(x, [alpha(i, 1.7, 0.7) for i in x])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Итак, действительно, где-то в 1-1.5 м от девушки ее ноги видны под наибольшим углом. Ну... это уже сложно без палева. Давайте теперь найдем точное значение оптимального расстояния до девушки." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Аналитическое решение \"от руки\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Решение достаточно простое, всего-то надо вспомнить, что производная арктангенса
$arctg'(x) = \\frac{1}{1+x^2}$
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Зафиксируем $m=1.7\\ м$ и $f=0.7\\ м$. Тогда $\\alpha$ = $\\frac{\\pi}{2} - arctg(\\frac{x}{1.7}) - arctg(\\frac{1}{x})$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
$\\alpha'(x) = \\frac{1}{x^2} \\frac{1}{1 + \\{\\frac{1}{x}\\}^2} - \\frac{1}{1.7}\\frac{1}{1+\\{\\frac{x}{1.7}\\}^2}$
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "После несложных преобразований получается $\\alpha'(x) = \\frac{(x^2 + 1.7^2) - 1.7(x^2+1)}{(x^2+1)(x^2 + 1.7^2)}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И тогда максимум $\\alpha(x)$ достигается, когда\n", "
$(x^2 + 1.7^2) - 1.7(x^2+1) = 0$
\n", "
$x^2(1-1.7) - 1.7(1-1.7) = 0$
\n", "
$x^2=1.7, x = \\sqrt{1.7} \\approx 1.3\\ (м) $
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Аналитическое решение с SymPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SymPy - это библиотека символьных вычислений на языке Python. Мы рассмотрим, как с ее помощью вычислять производные (метод diff) и находить корни уравнений." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sympy as sym" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Заведем символьную переменную $x$ и функцию $\\alpha(x)$. Для этого $\\pi$ и $arctg$ тоже надо взять из SymPy." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = sym.Symbol('x')\n", "alpha = sym.pi/2 - sym.atan(x/1.7) - sym.atan(1/x)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-atan(1/x) - atan(0.588235294117647*x) + pi/2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alpha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посчитаем производную $\\alpha'(x)$. Методу diff надо указать функцию, переменную, по которой происходит дифференцирование, и порядок производной, в данном случае 1." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "alpha_deriv = sym.diff(alpha, x, 1)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.588235294117647/(0.346020761245675*x**2 + 1) + 1/(x**2*(1 + x**(-2)))" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "alpha_deriv" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как видно, к общему знаменателю SymPy просто так выражения не приводит. Для этого есть метод simplify." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-0.242214532871972*x**2 + 0.411764705882353)/((0.346020761245675*x**2 + 1)*(x**2 + 1))" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.simplify(alpha_deriv)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь найдем нули производной с помощью метода solve." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-1.30384048104053, 1.30384048104053]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sym.solve(alpha_deriv, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Опять получили ответ, что лучше всего рассматривать девушку $\\approx$ с 1.3 м." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Численное решение c SciPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### В библиотеке SciPy помимо всего полезного реализованы разные методы численной оптимизации. Побробное описание многих методов минимизации одномерных и многомерных функций даны в [документации](http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.optimize.minimize.html) метода scipy.optimize.minimize." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Метода maximize как такового нет, поэтому задача максимизации будет эмулироваться минимизацией функции, домноженной на (-1). Рассмотрим самый простой случай - минимация скалярной функции одной переменной. Реализованы методы оптимизации 'brent', 'bounded' и 'golden', но отличия почему-то толком [не документированы](http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.minimize_scalar.html#scipy.optimize.minimize_scalar)." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from scipy.optimize import minimize_scalar\n", "\n", "alpha = lambda x: -(pi/2 - atan(x/1.7) - atan(1/x))\n", "\n", "result = minimize_scalar(alpha, bounds=[0., 100.], method = 'bounded')" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " fun: -0.26225515887585626\n", " message: 'Solution found.'\n", " nfev: 18\n", " status: 0\n", " success: True\n", " x: 1.3038404104038319" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ответ прежний, как и ожидалось." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.3038404104038319" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result.x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь выберем девушку, на чьи ноги будем любоваться. Вернемся к знакомому набору данных girls.csv по моделям месяца по Playboy. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Задача 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найти среди моделей Playboy девушку с самым высоким ростом при \"нормальном\" индексе массы тела - от 18 до 18.5." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Решение" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "girls = pd.read_csv('data/girls.csv')" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "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", "
MonthYearBustWaistHipsHeightWeight
0December195391619116554
1March195486618916854
2July195591619116652
3December195591619116652
4July195691618615748
\n", "
" ], "text/plain": [ " Month Year Bust Waist Hips Height Weight\n", "0 December 1953 91 61 91 165 54\n", "1 March 1954 86 61 89 168 54\n", "2 July 1955 91 61 91 166 52\n", "3 December 1955 91 61 91 166 52\n", "4 July 1956 91 61 86 157 48" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "girls.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Создадим новый признак BMI - индекс массы тела, равный весу, деленному на рост в метрах в квадрате" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": true }, "outputs": [], "source": [ "girls['BMI'] = 100 ** 2 * girls['Weight'] / (girls['Height'] ** 2)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 19.834711\n", "1 19.132653\n", "2 18.870663\n", "3 18.870663\n", "4 19.473407\n", "Name: BMI, dtype: float64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "girls['BMI'].head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Построим гистограмму распределения BMI" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "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": [ "girls['BMI'].hist()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Википедия говорит, что нормальный индекс BMI - 18,5—24,99. Видим, что средний индекс у моделей Playboy примерно на нижней границе нормы. \n", "Отберем девушек с BMI от 18 до 18.5." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "selected_girls = girls[(girls['BMI'] >= 18) & \n", " (girls['BMI'] <= 18.5)]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "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", "
MonthYearBustWaistHipsHeightWeightBMI
430July19949161911805918.209877
\n", "
" ], "text/plain": [ " Month Year Bust Waist Hips Height Weight BMI\n", "430 July 1994 91 61 91 180 59 18.209877" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "selected_girls.sort(columns=['Height', 'Bust'], \n", " ascending=[False, False]).head(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Это Miss July 1994 Traci Adell. Дальше поисковик в помощь. Такой выбор вряд ли разочарует. Вот самое \"приличное\", что можно найти." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Мы посмотрели самые основы использования библиотек Python SymPy, SciPy и Pandas. Обилие примеров уже реального использования этих библиотек можно найти в репозиториях GitHub. Один из обзоров таких репозиториев тут. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ссылки\n", "- Материал этой тетрадки в [статье](https://habrahabr.ru/post/275963/) на Хабрахабре\n", "- [Статья](https://habrahabr.ru/post/251225/) \"Необычные модели Playboy, или про обнаружение выбросов в данных c помощью Scikit-learn\" на Хабрахабре\n", "- [Статья](https://habrahabr.ru/post/270449/) \"Некоторые репозитории в помощь изучающим и преподающим Python и машинное обучение\" на Хабрахабре\n", "- [Курс](https://github.com/Yorko/python_intro) Python, основных алгоритмов и структур данных в виде тетрадок IPython\n", "- [Статья](https://habrahabr.ru/company/mlclass/blog/252743/) \"Ваш персональный курс по Big Data\" на Хабрахабре" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 1 }