Python і красиві ніжки — як би я знайомив сина з математикою і програмуванням

Раніше ми вже шукали незвичайні моделі Playboy з допомогою бібліотеки Python Scikit-learn. Тепер ми продемонструємо деякі можливості бібліотек SymPy, SciPy, Matplotlib і Pandas на живому прикладі з розряду цікавих шкільних завдань з математики. Мета — полегшити поріг входження при вивченні бібліотек Python для аналізу даних.





Завдання 1

Стоїть дівчина з витонченими, натренованими, а головне, оголеними ніжками. Сумує. Перед тим, як демонструвати свій (n+1)-ий рівень володіння технікою пікапа, хочеться трохи краще розглянути ніжки дівчини — а чи варта шкурка вичинки? Краще розглянути це під найбільшим кутом. Можна непомітно підходити до дівчини (типу вдалину дивишся), але присідати можна — треба ж якось і дотримуватися пристойності. З якої відстані ніжки видно під найбільшим кутом? Припустимо, Ваш зріст такий, що очі знаходяться на висоті m над поверхнею землі. Ноги дівчини оголені до висоти f.

Рішення



Картинка і перефразоване завдання з «Крістоф Комод: Звабити математикою. Числові ігри на всі випадки життя. Біном. Лабораторія знань, 2015»

Пояснимо проблему. Здалеку погано розглядати ноги — вони видні під дуже малим кутом. Але якщо підійти надто близько, ноги теж будуть видні під малим кутом. Десь має бути оптимальна відстань.

Нехай x — відстань до дівчини, f — довжина оголеної частини ніг дівчини, alpha — кут, під яким ноги видно (треба максимізувати).

Кут alpha найпростіше знайти, віднімаючи з прямого кута кути beta і gamma. Якщо шкільна тригонометрії ще жива в закутках мозку, легко отримаємо, що:



Завдання зводиться до максимізації alpha(x) за змінної x.
Ну це теж просто, скажемо ми: зануляем похідну — і вперед!

Для початку побудуємо графік функції alpha(x). Для визначеності візьмемо значення пераметрів m=1.7 м і f=0.7 м (хотілося б 1 м, але все ж передбачається, що є якась спідниця.)

Тепер код. Використовується збірка Anaconda і зошити IPython. Код відтворюємо, лежить в репозиторії GitHub.

# відключимо зайві попередження Anaconda
import warnings
warnings.filterwarnings('ignore')
# магічна команда IPython, щоб картинки прямо в зошиті малювалися
%pylab inline 
import numpy as np
from math import pi, atan

def alpha(x, m, f):
return pi/2 - atan(x/m) - atan((m-f)/x)
# задаємо ікси з деяким дрібним кроком
x = np.arange(0, 6, 0.05)
plot(x, [alpha(i, 1.7, 0.7) for i in x])



Про! Припущення підтвердилося: десь 1-1.5 м від дівчини її ноги видно під найбільшим кутом. Ну… це вже складно без палева. Давайте тепер знайдемо точне значення оптимального відстані до дівчини.

Аналітичне рішення «від руки»
Аналітичне рішення дуже просте, достатньо пам'ятати похідну арктангенса. На Хабре LaTeX не підтримується, так що ця частина у відповідній зошиті IPython.
Результат виходить такий:



Аналітичне рішення з SymPy
SymPy — це бібліотека символьних обчислень на мові Python. Ми розглянемо, як з її допомогою обчислювати похідні (метод diff) і знаходити корені рівнянь (метод solve).

import sympy as sym

Заведемо символьну змінну x і функцію alpha(x). Для символьних обчислень число Пі і тангенс теж треба взяти з SymPy.

x = sym.Symbol('x')
alpha = sym.pi/2 - sym.atan(x/1.7) - sym.atan(1/x)

alpha # -atan(1/x) - atan(0.588235294117647*x) + pi/2

Обчислимо похідну alpha'(x). Методом diff треба вказати функцію, змінну, по якій відбувається диференціювання, і порядок похідної, в даному випадку 1.

alpha_deriv = sym.diff(alpha, x, 1)

alpha_deriv # -0.59/(0.35*x**2 + 1) + 1/(x**2*(1 + x**(-2)))

Можна переконатися, що це те ж саме, що виходило, якщо взяти в руки олівець і папір.

Як видно, до спільного знаменника SymPy просто так вираження не призводить. Для цього є метод simplify.

sym.simplify(alpha_deriv) # (-0.24*x**2 + 0.41)/((0.35*x**2 + 1)*(x**2 + 1))

Тепер знайдемо нулі похідної за допомогою методу solve.

sym.solve(alpha_deriv, x) # [-1.30384048104053, 1.30384048104053]

Знову отримали, що найкраще розглядати дівчину приблизно із 1.3 м. Цікаво, фотографи теж такі обчислення проводять?

Чисельне розв'язання c SciPy

Картинка з курсу Andrew Ng по машинному навчання

В бібліотеці SciPy крім всього корисного реалізовані різні методи чисельної оптимізації. Детальний опис багатьох методів мінімізації одновимірних і багатовимірних функцій дано в документации методу scipy.optimize.minimize.

Методу maximize як такого немає, тому завдання максимізації буде емулюватися мінімізацією функції, домноженной на (-1). Розглянемо найпростіший випадок — минимация скалярної функції однієї змінної. Реалізовані методи оптимізації 'brent', 'bounded' і 'golden', але відмінності чому-то толком не документовані.

from scipy.optimize import minimize_scalar
alpha = lambda x: -(pi/2 - atan(x/1.7) - atan(1/x))
result = minimize_scalar(alpha, bounds=[0., 100.], method = 'bounded')

Відповідь колишній, як і очікувалося.

result.x # 1.3038404104038319

Тепер виберемо дівчину, на чиї ноги будемо милуватися. Повернемося до знайомого набору даних girls.csv за моделями місяця в Playboy. Виберемо найвищу з недистрофичных дівчат. Заодно покажемо дещо з бібліотеки Pandas.

Завдання 2

Знайти серед моделей Playboy дівчину з найвищим зростанням при «нормальному» індексі маси тіла — від 18 до 18.5.

Рішення

import pandas as pd
girls = pd.read_csv('girls.csv') # об'єкт Pandas.DataFrame
girls.head() # 5 подивитися перших записів



Створимо новий ознака BMI — індекс маси тіла, рівний вазі, поділеному на зростання в метрах в квадраті.

girls['BMI'] = 100 ** 2 * girls['Weight'] / (girls['Height'] ** 2)

Побудуємо гістограму розподілу BMI.

girls['BMI'].hist()




Вікіпедія каже, що нормальний індекс BMI — 18,5—24,99. Бачимо, що середній індекс моделей Playboy приблизно на нижній межі норми.
Відберемо дівчат з ІМТ від 18 до 18.5.

selected_girls = girls[(girls['BMI'] >= 18) & 
(girls['BMI'] <= 18.5)]

selected_girls.sort(columns=['Height', 'Bust'], 
ascending=[False, False]).head(1)
# Month Year Bust Waist Hips Height Weight BMI
#430 July 1994 91 61 91 180 59 18.209877


Це Miss July 1994 за версією Playboy Traci Adell. Далі пошуковик в допомогу. Такий вибір навряд чи розчарує.

Отже, ми подивилися самі основи використання бібліотек Python SymPy, SciPy і Pandas. Велика кількість прикладів вже реального використання цих бібліотек можна знайти в репозиторіях GitHub. Один з таких оглядів репозиторіїв тут.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.