🔴 Сложный ⏱️ 55 минут

Построение графиков функций

📋 Содержание урока

Построение графиков функций 🧭

Ты обучил модель, вывел график функции потерь — и видишь ровную горизонтальную линию, которая после десятой эпохи будто прилипла к нулю. Вывод напрашивается сам собой: «всё, модель сошлась, дальше учить бессмысленно». Ты останавливаешь обучение. А потом коллега берёт те же самые данные, ставит на оси $y$ логарифмическую шкалу — и на графике видно, что loss продолжал уверенно падать ещё двести эпох, просто на линейной шкале падение с $0{,}01$ до $0{,}001$ визуально неотличимо от нуля. Ты только что выбросил в мусорку десятикратное улучшение качества — не потому что плохо знаешь ML, а потому что неправильно построил график.

Вот в чём фокус: график — это не украшение к формуле и не «домашка по алгебре». Это единственный способ, которым человеческий мозг умеет схватывать поведение функции целиком, а не по точкам. Формула $y = \dfrac{x^2}{x^2-1}$ ничего не говорит тебе на первый взгляд. А её график говорит всё сразу: две дырки, три отдельных куска кривой, горизонтальная полка на высоте $1$, провал вниз в середине. Секунда взгляда — и ты знаешь про функцию больше, чем после десяти минут разглядывания формулы.

Проблема в том, что «построить график» обычно понимают как «натыкать точек по таблице значений и соединить». Это работает ровно до первой функции с разрывом — там наивное соединение точек нарисует тебе несуществующую вертикальную линию (и, кстати, matplotlib нарисует её точно так же, если ты его не остановишь). Настоящее построение — это исследование: ты сначала выясняешь скелет функции (где она вообще живёт, симметрична ли, где пересекает оси, где положительна, куда убегает на бесконечности), а точки считаешь в самом конце, чтобы уточнить уже понятную форму.

В этом уроке мы соберём полную схему исследования — без производной, только теми инструментами, которые у тебя уже есть после уроков 76–89. Потом разберём конструктор преобразований: как из одного знакомого графика получать десятки новых сдвигами, растяжениями и отражениями. И закончим тем, с чего начали, — выбором масштаба осей, из-за которого одни и те же данные могут выглядеть как «обучение закончилось» и как «обучение идёт полным ходом».

🎯 Ты узнаешь:

  • Полную схему исследования функции из семи шагов — и в каком порядке её проходить, чтобы не переделывать работу
  • Как доказать монотонность функции честно, через разность значений, ещё до знакомства с производной
  • Как из графика $y = x^2$ или $y = \dfrac{1}{x}$ получить десятки новых графиков сдвигами, растяжениями, отражениями и модулем
  • Почему выбор масштаба осей (линейный, semi-log, log-log) меняет вывод, который ты сделаешь по графику
  • Как строить графики по точкам в matplotlib и какая одна строчка кода спасает от нарисованной «фальшивой асимптоты»

История: откуда это взялось?

Идея нарисовать зависимость одной величины от другой удивительно молода — по меркам математики. Первым к ней подобрался французский схоласт Николай Орем около 1350 года: в трактате «О конфигурации качеств» он предложил изображать изменение скорости или температуры отрезками разной длины, отложенными на общей линии, — и получил, по сути, столбчатую диаграмму, а в пределе — кривую. Орем даже доказал этим способом теорему о равномерно ускоренном движении: площадь под «графиком скорости» равна пройденному пути. Но продолжения не последовало: у Орема не было ни алгебры, ни координат.

Настоящий прорыв — 1637 год, приложение «Геометрия» к «Рассуждению о методе» Рене Декарта. Декарт решал вполне конкретную задачу: древние греки умели описывать кривые только словами («геометрическое место точек, равноудалённых от...»), и каждая новая кривая требовала нового изобретения. Декарт связал каждую точку плоскости с парой чисел — и кривая превратилась в уравнение, а уравнение — в кривую. Это была не «удобная нотация», а смена жанра: с этого момента геометрическую задачу можно было решать алгеброй, а алгебраическую — рисунком. Параллельно и независимо к тому же пришёл Пьер Ферма, но его работа осталась в рукописи и вышла только посмертно, поэтому координаты мы называем декартовыми.

Слово «функция» появилось у Лейбница в 1673 году, а привычный нам знак $f(x)$ ввёл Леонард Эйлер в 1734-м. Именно Эйлер в «Введении в анализ бесконечно малых» (1748) впервые системно нарисовал графики элементарных функций и стал разбирать их поведение — где растёт, где ломается, куда уходит. Дальше эстафету подхватила статистика: шотландец Уильям Плейфер в «Коммерческом и политическом атласе» (1786) впервые изобразил экономические данные линейным графиком и столбчатой диаграммой, а в 1801-м придумал круговую. Он же первым использовал логарифмическую шкалу для торговых балансов — ровно ту хитрость, которой мы посвятим отдельный раздел.

Мостик в сегодня — 1970-е. Статистик Джон Тьюки в книге «Exploratory Data Analysis» (1977) сформулировал принцип, ставший законом data science: сначала посмотри на данные глазами, потом считай метрики. Его коллега Фрэнк Анскомб в 1973-м опубликовал знаменитый «квартет Анскомба» — четыре набора точек с абсолютно одинаковыми средними, дисперсиями, корреляцией и линией регрессии, но с совершенно разными графиками: облако, парабола, прямая с одним выбросом и вертикальная колонна. Смысл жестокий: любая сводная цифра может врать, график — почти никогда. Именно поэтому первое, что делает нормальный ML-инженер с новым датасетом, — не запускает модель, а строит графики. И именно поэтому этот школьный урок — самый прикладной во всём курсе.


Схема исследования: скелет, потом мясо

Интуиция

Представь, что тебе нужно нарисовать по описанию незнакомое животное. Ты же не начнёшь с отдельных волосков — ты сначала выяснишь: сколько ног, есть ли хвост, симметрично ли оно, какого примерно размера. Скелет. И только когда скелет ясен, начнёшь уточнять детали.

С функцией ровно так же. Таблица значений — это волоски. Она бесполезна, пока ты не знаешь скелет: где функция вообще существует, симметрична ли она, где пересекает оси, где убегает в бесконечность. Более того, знание скелета сокращает работу в разы: если функция чётная, тебе достаточно исследовать её только при $x \geq 0$ и просто отразить картинку в зеркале. Половина работы испарилась на первом же шаге.

Давай разберёмся с порядком шагов. Он не случайный — каждый следующий опирается на предыдущий:

Определение (общая схема исследования функции без производной): чтобы построить график функции $y=f(x)$, последовательно находят:

  1. Область определения $D(f)$ — где функция вообще существует;
  2. Симметрию: чётность ($f(-x)=f(x)$), нечётность ($f(-x)=-f(x)$), периодичность ($f(x+T)=f(x)$);
  3. Нули функции и точки пересечения с осями;
  4. Промежутки знакопостоянства — где график выше оси $Ox$, где ниже;
  5. Промежутки монотонности и точки экстремума (доступными средствами: через разность значений, замену, известные неравенства);
  6. Асимптоты — вертикальные, горизонтальные, наклонные — и поведение на краях области определения;
  7. Контрольные точки — 3–5 значений, уточняющих форму.

Почему именно такой порядок? Потому что каждый шаг экономит следующий. Найдя $D(f)$, ты сразу знаешь, где искать вертикальные асимптоты (только в выколотых точках!). Найдя чётность, вдвое сокращаешь всю оставшуюся работу. Найдя нули, получаешь готовые границы для метода интервалов на шаге 4. Если делать шаги вразнобой, придётся возвращаться и переделывать.

Важная оговорка про шаг 5. Производную ты ещё не проходил — она ждёт тебя в уроке 133, а построение графиков с её помощью в уроке 144. Это не проблема: монотонность огромного класса функций устанавливается элементарно — через свойства известных «кирпичиков», через разность $f(x_2)-f(x_1)$ или через удачное преобразование формулы. Как раз этому мы и научимся.

Примеры с разбором

Пример 1 (простой): найди область определения и симметрию функции $y = \dfrac{x}{x^2-9}$

Решение:

Шаг 1. Дробь существует, когда знаменатель не ноль:

$$x^2 - 9 \neq 0 \implies x \neq \pm 3$$$$D(f) = (-\infty; -3) \cup (-3; 3) \cup (3; +\infty)$$

Шаг 2. Область определения симметрична относительно нуля (вместе с каждым $x$ в неё входит и $-x$) — значит, проверять чётность имеет смысл.

Шаг 3. Подставим $-x$:

$$f(-x) = \frac{-x}{(-x)^2-9} = \frac{-x}{x^2-9} = -f(x)$$

Ответ: $D(f) = (-\infty;-3)\cup(-3;3)\cup(3;+\infty)$, функция нечётная — график симметричен относительно начала координат.

📌 Практический выигрыш: достаточно построить кривую при $x > 0$ и повернуть её на $180°$ вокруг начала координат.


Пример 2 (средний): найди область определения и симметрию $y = \sqrt{4-x^2}$, опиши форму графика

Решение:

Шаг 1. Подкоренное выражение неотрицательно:

$$4 - x^2 \geq 0 \implies x^2 \leq 4 \implies |x| \leq 2$$$$D(f) = [-2; 2]$$

Шаг 2. Проверим чётность. Отрезок $[-2;2]$ симметричен относительно нуля, значит проверка законна:

$$f(-x) = \sqrt{4-(-x)^2} = \sqrt{4-x^2} = f(x)$$

Функция чётная.

Шаг 3. Найдём форму. Обозначим $y = \sqrt{4-x^2}$ и возведём в квадрат (это законно, потому что $y \geq 0$ по определению арифметического корня):

$$y^2 = 4 - x^2 \implies x^2 + y^2 = 4$$

Это уравнение окружности радиуса $2$ с центром в начале координат. Но условие $y \geq 0$ оставляет только верхнюю половину.

Ответ: $D(f)=[-2;2]$, функция чётная, график — верхняя полуокружность радиуса $2$ с центром в $(0;0)$. Область значений $E(f)=[0;2]$.

Проверим наш ответ: $f(0)=\sqrt4=2$ — верхняя точка ✅, $f(2)=\sqrt{4-4}=0$ — правый край ✅, $f(-2)=0$ ✅.


Пример 3 (сложный): найди область определения $y = \dfrac{\sqrt{x+3}}{x-1}$ и определи симметрию

Решение:

Шаг 1. Здесь два ограничения сразу, и их нужно выполнить одновременно:

  • корень: $x + 3 \geq 0 \implies x \geq -3$
  • знаменатель: $x - 1 \neq 0 \implies x \neq 1$

Шаг 2. Пересечём условия:

$$D(f) = [-3; 1) \cup (1; +\infty)$$

Шаг 3. Проверим симметрию — и вот тут ловушка. Возьмём $x = 5$: оно входит в $D(f)$. А $-5$? Нет, потому что $-5 < -3$. Область определения не симметрична относительно нуля.

Значит, равенство $f(-x)=\pm f(x)$ нельзя проверить даже формально: у $f(-x)$ просто нет значения там, где есть $f(x)$.

Ответ: $D(f) = [-3;1)\cup(1;+\infty)$, функция ни чётная, ни нечётная.

📌 Запомни это правило: проверка чётности начинается не с подстановки $-x$, а с проверки симметрии области определения. Если она несимметрична — ответ готов сразу, считать ничего не нужно.

Почему это важно

Область определения — это не формальность из учебника, это первое место, где ломается код. Когда в пайплайне обработки признаков ты применяешь к колонке преобразование $\sqrt{x}$ или $\lg x$, а в колонке затаился один нулевой или отрицательный доход — ты получаешь NaN, который затем тихо расползается по всему датасету и убивает обучение через десять шагов после реальной причины. Проверка «а где эта функция вообще определена?» — это ровно то, что в проде называется валидацией входных данных.

Симметрия работает как бесплатный ускоритель. В математике чётность вдвое сокращает исследование. В обработке сигналов и в свёрточных сетях симметричные ядра (фильтры) позволяют вдвое сократить количество обучаемых параметров без потери качества. А инвариантности вроде «изображение кошки, отражённое зеркально, — всё ещё кошка» — это буквально утверждение о чётности функции по одной из осей, и именно на нём построена аугментация данных горизонтальным отражением.


Нули и знаки: где график пересекает ось и с какой стороны идёт

Интуиция

Представь, что ты идёшь по горной тропе, а ось $Ox$ — уровень моря. Нули функции — это места, где тропа пересекает береговую линию. А промежутки знакопостоянства — это ответ на вопрос «сейчас я на суше или под водой?». Как только ты знаешь все точки пересечения берега и понимаешь, что между ними знак поменяться не может (тропа непрерывна — чтобы попасть из «выше нуля» в «ниже нуля», надо пройти через ноль), — картина складывается почти автоматически.

Отсюда и весь метод интервалов: отметь на прямой все нули функции и все точки, где она разрывается (выколотые точки области определения), — эти точки разобьют прямую на куски. Внутри каждого куска знак постоянен, и чтобы его узнать, достаточно подставить одну любую точку из этого куска.

Определение: Нулём функции называется значение $x_0 \in D(f)$, при котором $f(x_0)=0$. Промежутком знакопостоянства называется промежуток области определения, на котором функция сохраняет знак (всюду положительна либо всюду отрицательна).

Для дробей есть удобное уточнение: дробь равна нулю тогда и только тогда, когда числитель равен нулю, а знаменатель — нет. А знак дроби — это произведение знаков числителя и знаменателя, поэтому дробно-рациональные функции разбираются тем же методом интервалов, что и многочлены.

И ещё один приём, который экономит массу времени, — кратность корня:

  • если множитель входит в нечётной степени ($(x-a)$, $(x-a)^3$), в точке $a$ знак меняется — график пересекает ось;
  • если в чётной степени ($(x-a)^2$, $(x-a)^4$), знак не меняется — график касается оси и отскакивает.

Примеры с разбором

Пример 1 (простой): найди нули и промежутки знакопостоянства $y = x^2 - 5x + 6$

Решение:

Шаг 1. Приравняем к нулю:

$$x^2 - 5x + 6 = 0$$

Шаг 2. Дискриминант: $D = 25 - 24 = 1$, корни $x = \dfrac{5 \pm 1}{2}$, то есть $x_1 = 2$, $x_2 = 3$.

Шаг 3. Разложим: $y = (x-2)(x-3)$. Оба множителя первой степени — значит, знак меняется в обеих точках.

Шаг 4. Проверим знак пробной точкой $x=0$: $(0-2)(0-3) = 6 > 0$.

Ответ: нули $x=2$ и $x=3$; $y > 0$ при $x \in (-\infty;2)\cup(3;+\infty)$, $y<0$ при $x\in(2;3)$.

Проверим наш ответ: $f(2{,}5) = 6{,}25 - 12{,}5 + 6 = -0{,}25 < 0$ ✅ — внутри промежутка функция действительно отрицательна.


Пример 2 (средний): исследуй знаки функции $y = (x-1)(x+2)^2(x-4)$

Решение:

Шаг 1. Нули: $x = 1$, $x = -2$, $x = 4$.

Шаг 2. Оценим кратности:

  • $(x-1)$ — первая степень, знак меняется;
  • $(x+2)^2$ — вторая степень (чётная), знак не меняется, график касается оси в точке $-2$;
  • $(x-4)$ — первая степень, знак меняется.

Шаг 3. Определим знак на самом правом промежутке. При очень больших $x$ все три множителя положительны, значит $y > 0$ на $(4;+\infty)$.

Шаг 4. Идём влево, переключая знак только на корнях нечётной кратности:

  • через $x=4$ — переключаем: на $(1;4)$ знак минус;
  • через $x=1$ — переключаем: на $(-2;1)$ знак плюс;
  • через $x=-2$ — не переключаем: на $(-\infty;-2)$ тоже плюс.

Проверим наш ответ пробными точками:

$$f(0) = (-1)\cdot 4 \cdot (-4) = 16 > 0 \ \checkmark \qquad f(2) = 1 \cdot 16 \cdot (-2) = -32 < 0 \ \checkmark$$$$f(-3) = (-4)\cdot 1 \cdot(-7) = 28 > 0 \ \checkmark$$

Ответ: $y>0$ на $(-\infty;-2)\cup(-2;1)\cup(4;+\infty)$, $y<0$ на $(1;4)$, нули $x=-2$ (касание), $x=1$, $x=4$.


Пример 3 (сложный): исследуй знаки $y = \dfrac{x^2-4}{x-1}$

Решение:

Шаг 1. Область определения: $x \neq 1$.

Шаг 2. Нули: числитель $x^2-4=0 \implies x=\pm 2$. Оба входят в $D(f)$ — годятся.

Шаг 3. Отметим на прямой и нули, и точку разрыва: $-2$, $1$, $2$. Точка $1$ не является нулём, но знак в ней тоже может перевернуться, потому что знаменатель меняет знак.

Шаг 4. Разложим: $y = \dfrac{(x-2)(x+2)}{x-1}$. Все три множителя первой степени — знак переключается в каждой из точек.

Шаг 5. Начнём справа: при больших $x$ все множители положительны, $y > 0$ на $(2;+\infty)$. Дальше переключаем на каждой точке:

  • $(1;2)$: минус
  • $(-2;1)$: плюс
  • $(-\infty;-2)$: минус

Проверим наш ответ:

$$f(0) = \frac{0-4}{0-1} = \frac{-4}{-1} = 4 > 0 \ \checkmark \qquad f(3)=\frac{9-4}{2}=2{,}5>0 \ \checkmark$$$$f(1{,}5) = \frac{2{,}25-4}{0{,}5} = \frac{-1{,}75}{0{,}5} = -3{,}5 < 0 \ \checkmark \qquad f(-3)=\frac{9-4}{-4}=-1{,}25<0 \ \checkmark$$

Ответ: $y>0$ на $(-2;1)\cup(2;+\infty)$, $y<0$ на $(-\infty;-2)\cup(1;2)$, нули $x=\pm2$, разрыв при $x=1$.

Почему это важно

Знак функции — это, буквально, решение классификатора. Линейная модель или SVM выдают «сырое» число $s(x) = w^\top x + b$, а предсказанный класс — это знак этого числа. Нули функции здесь — не абстракция, а разделяющая граница (decision boundary): множество точек, где модель сомневается ровно поровну. Когда в статьях по ML рисуют картинки с цветными областями и границей между ними — это в чистом виде промежутки знакопостоянства, только на плоскости вместо прямой.

Тот же метод интервалов работает и в анализе остатков (residuals) регрессии: если остатки $y_{\text{факт}} - y_{\text{предсказ}}$ систематически положительны на одном диапазоне и отрицательны на другом — модель промахивается не случайно, а структурно, и это видно именно по промежуткам знакопостоянства на графике остатков. Тьюки не зря настаивал: строй график остатков всегда, метрика $R^2$ этого не покажет.


Монотонность без производной: три честных способа

Интуиция

Монотонность — это ответ на вопрос «функция вообще идёт вверх или вниз?». Представь спидометр и одометр в машине: чем дольше едешь, тем больше пробег — пробег возрастает. Чем больше нажимаешь на тормоз, тем меньше скорость — скорость убывает. Ключевое слово — всегда: если хоть в одном месте порядок нарушился, монотонности на этом промежутке нет.

Определение: функция $f$ возрастает на промежутке $I$, если для любых $x_1, x_2 \in I$ из $x_1 < x_2$ следует $f(x_1) < f(x_2)$. Функция убывает на $I$, если из $x_1 < x_2$ следует $f(x_1) > f(x_2)$.

Производной у нас пока нет, но есть три рабочих инструмента.

Способ 1 — метод разности. Берём два произвольных $x_1 < x_2$ из промежутка и смотрим на знак разности $f(x_2)-f(x_1)$. Плюс всегда — возрастает, минус всегда — убывает. Это самый честный способ: он ничего не предполагает.

Способ 2 — кирпичики и цепочки. Ты уже знаешь поведение базовых функций: $y=kx+b$ (возрастает при $k>0$), $y=x^2$ (убывает на $(-\infty;0]$, возрастает на $[0;+\infty)$), $y=\sqrt{x}$ (возрастает), $y=\frac1x$ (убывает на каждом из промежутков), $y=a^x$ (возрастает при $a>1$). Из них монотонность собирается по правилам:

  • сумма двух возрастающих — возрастает;
  • умножение на положительное число монотонность сохраняет, на отрицательное — переворачивает;
  • «возрастающая от возрастающей» — возрастает; «возрастающая от убывающей» — убывает; «убывающая от убывающей» — возрастает (два минуса дают плюс, как в умножении);
  • для положительной функции переход к $\dfrac{1}{f}$ монотонность переворачивает.

Способ 3 — удачное преобразование формулы. Часто дробь можно переписать так, что переменная останется в одном месте, и весь вопрос сведётся к кирпичикам. Например, $\dfrac{2x+3}{x+1} = 2 + \dfrac{1}{x+1}$ — и монотонность сразу очевидна из вида $\dfrac1t$.

⚠️ Важнейшая оговорка: функция $y=\dfrac1x$ убывает на каждом из промежутков $(-\infty;0)$ и $(0;+\infty)$ по отдельности, но не убывает на их объединении. Проверь сам: $x_1=-1 < x_2 = 1$, но $f(-1)=-1 < f(1)=1$ — порядок не перевернулся. Записывать «убывает на $(-\infty;0)\cup(0;+\infty)$» — грубая ошибка.

Примеры с разбором

Пример 1 (простой): докажи, что $y = 3x - 7$ возрастает на $\mathbb{R}$

Решение:

Шаг 1. Возьмём произвольные $x_1 < x_2$.

Шаг 2. Найдём разность значений:

$$f(x_2) - f(x_1) = (3x_2 - 7) - (3x_1 - 7) = 3(x_2 - x_1)$$

Шаг 3. Так как $x_2 > x_1$, скобка $x_2 - x_1 > 0$, и вся разность положительна.

Ответ: функция возрастает на всей числовой прямой.


Пример 2 (средний): докажи, что $y = \dfrac{1}{x-2}$ убывает на $(2;+\infty)$

Решение:

Шаг 1. Возьмём $2 < x_1 < x_2$ и найдём разность:

$$f(x_2)-f(x_1) = \frac{1}{x_2-2} - \frac{1}{x_1-2}$$

Шаг 2. Приведём к общему знаменателю:

$$f(x_2)-f(x_1) = \frac{(x_1-2)-(x_2-2)}{(x_2-2)(x_1-2)} = \frac{x_1-x_2}{(x_2-2)(x_1-2)}$$

Шаг 3. Разберём знак по частям:

  • числитель $x_1 - x_2 < 0$, так как $x_1 < x_2$;
  • оба множителя знаменателя положительны, потому что $x_1 > 2$ и $x_2 > 2$.

Шаг 4. Отрицательное делим на положительное — получаем отрицательное. Значит, $f(x_2) < f(x_1)$.

Ответ: функция убывает на $(2;+\infty)$. Аналогично она убывает и на $(-\infty;2)$, но это другой промежуток убывания.

Проверим наш ответ: $f(3)=1$, $f(4)=0{,}5$, $f(12)=0{,}1$ — значения падают ✅


Пример 3 (сложный): исследуй монотонность $y = x + \dfrac{4}{x}$ на $(0;+\infty)$ и найди наименьшее значение

Эта функция — рабочая лошадка задач на оптимизацию: она описывает, например, суммарные издержки, где одно слагаемое растёт с ростом объёма, а другое падает.

Решение:

Шаг 1. Возьмём $0 < x_1 < x_2$ и вычислим разность:

$$f(x_2)-f(x_1) = (x_2 - x_1) + \left(\frac{4}{x_2}-\frac{4}{x_1}\right)$$

Шаг 2. Преобразуем вторую скобку:

$$\frac{4}{x_2}-\frac{4}{x_1} = \frac{4(x_1-x_2)}{x_1x_2} = -\frac{4(x_2-x_1)}{x_1x_2}$$

Шаг 3. Вынесем общий множитель $(x_2-x_1)$:

$$f(x_2)-f(x_1) = (x_2-x_1)\left(1 - \frac{4}{x_1x_2}\right) = (x_2-x_1)\cdot\frac{x_1x_2-4}{x_1x_2}$$

Шаг 4. Разберём знак. Множитель $(x_2-x_1)$ положителен всегда, знаменатель $x_1x_2$ положителен (оба числа больше нуля). Значит, знак разности определяет только выражение $x_1x_2 - 4$:

  • если $0 < x_1 < x_2 \leq 2$, то $x_1x_2 < 4$ — разность отрицательна, функция убывает;
  • если $2 \leq x_1 < x_2$, то $x_1x_2 > 4$ — разность положительна, функция возрастает.

Шаг 5. Функция убывает до $x=2$ и возрастает после — значит, в точке $x=2$ наименьшее значение:

$$f(2) = 2 + \frac{4}{2} = 4$$

Ответ: убывает на $(0;2]$, возрастает на $[2;+\infty)$, $y_{\min} = f(2) = 4$.

Проверим наш ответ: $f(1)=1+4=5$, $f(2)=4$, $f(4)=4+1=5$, $f(8)=8+0{,}5=8{,}5$ ✅ — минимум действительно в двойке, и функция симметрична относительно неё в логарифмическом смысле.

Почему это важно

Монотонность — центральное свойство в машинном обучении, просто оно там прячется под другими именами. Функции активации: сигмоида, гиперболический тангенс, ReLU — все монотонно неубывающие, и это не случайность. Монотонность гарантирует, что «увеличение сигнала на входе не может уменьшить сигнал на выходе», а значит направление градиента остаётся осмысленным. Немонотонные активации существуют (Swish, Mish), но они специально спроектированы и это отдельная история.

Дальше — метрики. AUC-ROC инвариантен к любому монотонному преобразованию предсказаний: если ты пропустишь все скоры модели через возрастающую функцию, ранжирование не изменится, а значит и AUC не изменится ни на йоту. Отсюда практический вывод, который экономит часы отладки: калибровка вероятностей (Platt scaling, isotonic regression) может радикально улучшить log-loss, но AUC не сдвинет вообще.

И наконец, бизнес-ограничения: в кредитном скоринге регулятор может требовать монотонности модели по признаку — «при прочих равных, больший доход не может понижать шанс одобрения». Под это есть специальные monotone_constraints в XGBoost и LightGBM. Определение, которое ты только что прочитал в рамке, — это буквально то, что там проверяется.


Асимптоты и края области определения: куда убегает график

Интуиция

Асимптота — это прямая, к которой график прижимается всё ближе, но никогда не сливается с ней (уроку 89 посвящён этому целиком, здесь мы вспоминаем и встраиваем в общую схему). Представь корабль, уходящий за горизонт: он приближается к линии горизонта бесконечно, но никогда её не достигает. Асимптоты — это скелет графика на бесконечности, они задают рамку, внутри которой всё происходит.

Быстрая шпаргалка для дробно-рациональных функций:

  • Вертикальная асимптота $x=a$ — там, где знаменатель обращается в ноль, а числитель — нет. Если ноль есть и у числителя, и у знаменателя, дробь надо сначала сократить: там может оказаться не асимптота, а просто дырка.
  • Горизонтальная асимптота $y=b$ — если при $x\to\pm\infty$ функция стремится к конечному числу $b$. У дроби многочленов: если степень числителя меньше степени знаменателя, то $y=0$; если степени равны, то $y$ равен отношению старших коэффициентов.
  • Наклонная асимптота $y=kx+b$ — если степень числителя ровно на единицу больше степени знаменателя. Находится делением уголком: выделяем целую часть, остаток стремится к нулю.

Определение: прямая называется асимптотой графика функции, если расстояние от точки графика до этой прямой стремится к нулю при неограниченном удалении точки от начала координат.

Примеры с разбором

Пример 1 (простой): найди асимптоты $y = \dfrac{2x+1}{x-3}$

Решение:

Шаг 1. Знаменатель обнуляется при $x=3$; числитель там равен $2\cdot3+1=7 \neq 0$. Значит, вертикальная асимптота $x=3$.

Шаг 2. Степени числителя и знаменателя равны (обе первые). Горизонтальная асимптота — отношение старших коэффициентов:

$$y = \frac{2}{1} = 2$$

Проверим наш ответ: $f(1000) = \dfrac{2001}{997} \approx 2{,}007$ — близко к двойке ✅

Ответ: $x=3$ (вертикальная), $y=2$ (горизонтальная).


Пример 2 (средний): найди асимптоты $y = \dfrac{x^2+1}{x}$

Решение:

Шаг 1. Разделим почленно — это самый быстрый способ выделить целую часть:

$$y = \frac{x^2}{x} + \frac{1}{x} = x + \frac{1}{x}$$

Шаг 2. Вертикальная асимптота: знаменатель ноль при $x=0$, числитель $x^2+1=1\neq0$. Значит, $x=0$.

Шаг 3. При $x\to\pm\infty$ слагаемое $\dfrac1x$ стремится к нулю, и функция всё точнее приближается к прямой $y=x$. Это наклонная асимптота.

Ответ: $x=0$ (вертикальная), $y=x$ (наклонная).

Проверим наш ответ: $f(100)=100{,}01$ — отличается от $y=x$ на сотую ✅. Горизонтальной асимптоты нет: функция уходит в бесконечность.


Пример 3 (сложный, с ловушкой): найди асимптоты $y = \dfrac{x^2-3x+2}{x-1}$

Решение:

Шаг 1. Первый порыв — «знаменатель ноль при $x=1$, значит там вертикальная асимптота». Не спеши. Проверим числитель в этой точке:

$$1 - 3 + 2 = 0$$

Числитель тоже ноль! Значит, дробь сокращается, и «асимптота» может оказаться миражом.

Шаг 2. Разложим числитель. Корни уравнения $x^2-3x+2=0$: $D=9-8=1$, $x=\dfrac{3\pm1}{2}$, то есть $1$ и $2$. Значит:

$$x^2-3x+2 = (x-1)(x-2)$$

Шаг 3. Сократим (помня, что $x \neq 1$ по области определения):

$$y = \frac{(x-1)(x-2)}{x-1} = x-2, \quad x \neq 1$$

Шаг 4. График — это прямая $y=x-2$ с выколотой точкой при $x=1$. Значение, которого не хватает: $1-2=-1$, то есть дырка в точке $(1;-1)$.

Ответ: асимптот нет вообще. График — прямая $y=x-2$ с выколотой точкой $(1;-1)$.

📌 Это классическая ловушка, на которой «горит» и человек, и код. Дырка (устранимый разрыв) и вертикальная асимптота (бесконечный разрыв) — принципиально разные вещи, хотя формально в обоих случаях знаменатель равен нулю. Отличить их можно только сокращением.

Почему это важно

Асимптота — это математическое имя для «потолка» и «пола» в реальных зависимостях. Кривая обучения модели почти всегда имеет горизонтальную асимптоту на уровне неустранимой ошибки (Bayes error): сколько данных ни добавляй, ниже шума в самой разметке не опустишься. Умение прочитать этот уровень с графика — это ответ на вопрос «стоит ли размечать ещё сто тысяч примеров или мы уже упёрлись в потолок?».

То же самое с насыщением функций активации: сигмоида имеет горизонтальные асимптоты $y=0$ и $y=1$, и именно из-за них возникает проблема затухающего градиента — на «полках» функция почти не меняется, сигнал обучения не проходит. Вертикальные асимптоты — это места численного взрыва: деление на почти-ноль в knn с обратными расстояниями, в TF-IDF, в нормировках. Отсюда вездесущий $\varepsilon$ в знаменателях (x / (norm + 1e-8)) — это буквально способ убрать вертикальную асимптоту из формулы.


Конструктор преобразований: один график — десятки новых

Интуиция

Смотри, какая экономия: если ты знаешь график $y=x^2$, тебе не нужно исследовать заново функцию $y = -\tfrac12(x-3)^2+4$. Это тот же самый график, просто передвинутый, сплющенный и перевёрнутый. Как фотография: оригинал один, а фильтров можно навесить сколько угодно.

Правило, которое всё объясняет: изменения снаружи функции действуют на $y$ «как ожидаешь», изменения внутри аргумента действуют на $x$ «наоборот».

Полный набор инструментов:

  • $y = f(x) + a$ — сдвиг вверх на $a$ (при $a<0$ — вниз). Снаружи, как ожидаешь.
  • $y = f(x-a)$ — сдвиг вправо на $a$. Внутри, наоборот: минус — вправо.
  • $y = k\cdot f(x)$, $k>0$ — растяжение от оси $Ox$ в $k$ раз (при $k<1$ — сжатие).
  • $y = f(kx)$, $k>0$ — сжатие к оси $Oy$ в $k$ раз (при $k<1$ — растяжение). Опять наоборот.
  • $y = -f(x)$ — отражение относительно оси $Ox$ (переворот вверх ногами).
  • $y = f(-x)$ — отражение относительно оси $Oy$ (зеркало влево-вправо).
  • $y = |f(x)|$ — всё, что было ниже оси $Ox$, отражается вверх.
  • $y = f(|x|)$ — левая часть графика стирается, и вместо неё зеркально копируется правая.

Определение: график функции $y = k\cdot f\big(m(x-a)\big) + b$ получается из графика $y=f(x)$ последовательностью элементарных преобразований: сжатия/растяжения по осям с коэффициентами $m$ и $k$, отражений (если коэффициенты отрицательны) и параллельного переноса на вектор $(a;\,b)$.

⚠️ Ловушка порядка. Как построить $y = f(2x-4)$? Наивно кажется «сжать вдвое и сдвинуть на 4». Неверно. Сначала вынеси коэффициент за скобку:

$$f(2x-4) = f\big(2(x-2)\big)$$

Теперь видно: сжатие вдвое к оси $Oy$ плюс сдвиг вправо на 2, а не на 4. Всегда выноси множитель при $x$ за скобку до того, как определяешь сдвиг.

Примеры с разбором

Пример 1 (простой): построй график $y = (x-3)^2 + 2$ из графика $y=x^2$

Решение:

Шаг 1. Внутри аргумента $(x-3)$ — сдвиг вправо на $3$. Вершина уезжает из $(0;0)$ в $(3;0)$.

Шаг 2. Снаружи $+2$ — сдвиг вверх на $2$. Вершина переезжает в $(3;2)$.

Шаг 3. Форма и направление ветвей не менялись — та же парабола ветвями вверх.

Ответ: парабола с вершиной $(3;2)$, ветви вверх, ось симметрии $x=3$, $E(f)=[2;+\infty)$, нулей нет.

Проверим наш ответ: $f(3)=0+2=2$ ✅, $f(4)=1+2=3$, $f(2)=1+2=3$ — симметрично относительно $x=3$ ✅


Пример 2 (средний): построй график $y = -2\sqrt{x+1} - 3$

Решение:

Шаг 1. Стартуем с $y=\sqrt{x}$: ветка, начинающаяся в $(0;0)$ и медленно поднимающаяся вправо.

Шаг 2. $\sqrt{x+1}$ — внутри плюс, значит сдвиг влево на $1$. Начало ветки уезжает в $(-1;0)$.

Шаг 3. Умножение на $2$ — растяжение от оси $Ox$ вдвое: точка $(0;1)$ становится $(0;2)$.

Шаг 4. Минус перед всем — отражение относительно $Ox$: ветка теперь идёт вниз.

Шаг 5. $-3$ снаружи — сдвиг вниз на $3$. Начало ветки: $(-1;-3)$.

Ответ: $D(f)=[-1;+\infty)$, начало ветки в точке $(-1;-3)$, функция убывает, $E(f)=(-\infty;-3]$.

Проверим наш ответ: $f(-1) = -2\cdot0-3=-3$ ✅, $f(0)=-2\cdot1-3=-5$ ✅, $f(3)=-2\cdot2-3=-7$ ✅ — убывает.


Пример 3 (сложный): построй график $y = |x^2-4x+3|$

Решение:

Шаг 1. Сначала строим то, что под модулем: параболу $y = x^2-4x+3$.

Нули: $x^2-4x+3=0$, $D=16-12=4$, $x=\dfrac{4\pm2}{2}$, то есть $x_1=1$, $x_2=3$.

Шаг 2. Вершина: $x_в = \dfrac{1+3}{2}=2$ (среднее корней), $y_в = 4-8+3=-1$. Вершина $(2;-1)$, ветви вверх.

Шаг 3. Определим, где парабола ниже оси $Ox$: между корнями, то есть на $(1;3)$.

Шаг 4. Применяем модуль: часть графика на $(1;3)$ отражаем вверх. Вершина $(2;-1)$ превращается в $(2;1)$ — это становится локальным максимумом.

Шаг 5. Всё остальное (при $x<1$ и $x>3$) остаётся без изменений — там функция и так была неотрицательна.

Ответ: график — парабола с «горбом» посередине: убывает на $(-\infty;1]$, возрастает на $[1;2]$, убывает на $[2;3]$, возрастает на $[3;+\infty)$. Минимумы $y=0$ при $x=1$ и $x=3$, локальный максимум $y=1$ при $x=2$. $E(f)=[0;+\infty)$.

Проверим наш ответ: $f(0)=|3|=3$, $f(2)=|-1|=1$ ✅, $f(4)=|16-16+3|=3$ ✅

Почему это важно

Преобразования графиков — это и есть то, что делает нейросеть. Один нейрон вычисляет $\sigma(wx+b)$: множитель $w$ сжимает/растягивает аргумент, $b$ сдвигает его, а $\sigma$ — фиксированная нелинейность. То есть обучение слоя — это в буквальном смысле подбор параметров сдвига и растяжения для одной и той же кривой. Слой из $n$ нейронов — это $n$ по-разному сдвинутых и растянутых копий одного графика, которые потом складываются. Понимая конструктор преобразований, ты понимаешь, почему сеть с достаточным числом нейронов может приблизить почти любую форму.

То же и в препроцессинге данных: стандартизация $z = \dfrac{x-\mu}{\sigma}$ — это сдвиг на $\mu$ и сжатие в $\sigma$ раз, min-max нормализация — сдвиг плюс растяжение. Аугментация изображений отражением — это $f(-x)$. Batch normalization — сдвиг и масштабирование с обучаемыми параметрами. Весь этот словарь — четыре преобразования из списка выше.


Собираем всё вместе: два полных исследования

Теперь пройдём схему целиком, шаг за шагом. Это главный навык урока.

Полное исследование 1: $y = \dfrac{x^2}{x^2-1}$

Шаг 1. Область определения. $x^2-1 \neq 0 \implies x \neq \pm1$.

$$D(f) = (-\infty;-1)\cup(-1;1)\cup(1;+\infty)$$

Шаг 2. Симметрия. Область симметрична относительно нуля. Проверяем:

$$f(-x) = \frac{(-x)^2}{(-x)^2-1} = \frac{x^2}{x^2-1} = f(x)$$

Функция чётная — значит, дальше можно исследовать только $x \geq 0$ и отразить.

Шаг 3. Нули. Числитель $x^2=0 \implies x=0$. Знаменатель там равен $-1 \neq 0$ — годится. Единственный нуль $x=0$, он же точка пересечения с осью $Oy$: $f(0)=0$.

Шаг 4. Знаки. Числитель $x^2 \geq 0$ всегда. Значит, знак дроби определяет знаменатель:

  • $x^2-1>0$ при $|x|>1$ — функция положительна;
  • $x^2-1<0$ при $|x|<1$ — функция отрицательна (кроме точки $x=0$, где она равна нулю).

Шаг 5. Монотонность. Вот приём, который заменяет производную. Преобразуем формулу:

$$y = \frac{x^2}{x^2-1} = \frac{(x^2-1)+1}{x^2-1} = 1 + \frac{1}{x^2-1}$$

Теперь переменная встречается только в одном месте. Введём $t = x^2-1$ и посмотрим на цепочку при $x>0$: с ростом $x$ величина $t$ растёт. А $\dfrac1t$ на любом промежутке постоянного знака убывает с ростом $t$. Значит, при $x>0$ функция убывает — и на $(0;1)$, и на $(1;+\infty)$ по отдельности.

По чётности: на $(-1;0)$ и на $(-\infty;-1)$ функция возрастает.

Шаг 6. Асимптоты.

  • Вертикальные: $x=1$ и $x=-1$ (знаменатель ноль, числитель $1 \neq 0$).
  • Горизонтальная: степени числителя и знаменателя равны, отношение старших коэффициентов $\dfrac11=1$. Значит, $y=1$. Из записи $y = 1+\dfrac{1}{x^2-1}$ видно даже больше: на бесконечности функция подходит к единице сверху, потому что добавка положительна при $|x|>1$.

Шаг 7. Контрольные точки.

$$f(0)=0,\quad f(0{,}5)=\frac{0{,}25}{-0{,}75}=-\frac13,\quad f(2)=\frac43\approx1{,}33,\quad f(3)=\frac98=1{,}125$$

Итоговая картина: три отдельных куска. Средний кусок — «шапочка» с максимумом $0$ в начале координат, уходящая вниз к $-\infty$ у обеих стенок $x=\pm1$. Два боковых куска приходят из $+\infty$ у стенок и плавно ложатся на полку $y=1$ сверху. Область значений: $E(f) = (-\infty;0] \cup (1;+\infty)$.


Полное исследование 2: сигмоида $y = \dfrac{1}{1+e^{-x}}$

Та самая функция, что стоит на выходе логистической регрессии и превращает любое число в вероятность.

Шаг 1. Область определения. $e^{-x} > 0$ при любом $x$, значит знаменатель $1+e^{-x} > 1 > 0$ и в ноль не обращается никогда.

$$D(f) = \mathbb{R}$$

Шаг 2. Симметрия. Ни чётная, ни нечётная: $f(0)=\tfrac12 \neq 0$, а $f(1)\approx0{,}73$ и $f(-1)\approx0{,}27$ — не равны и не противоположны. Зато есть симметрия другого рода: $f(x) + f(-x) = 1$, то есть график центрально симметричен относительно точки $\left(0;\tfrac12\right)$. Периодичности нет.

Шаг 3. Нули. Числитель равен $1$ и никогда не ноль. Нулей нет — график не пересекает ось $Ox$. Пересечение с $Oy$: $f(0)=\dfrac{1}{1+1}=\dfrac12$.

Шаг 4. Знаки. Числитель $1>0$, знаменатель $>0$ — функция положительна всюду.

Шаг 5. Монотонность. Разбираем цепочку:

  • $-x$ убывает с ростом $x$;
  • $e^{-x}$ — возрастающая функция от убывающего аргумента, значит убывает;
  • $1+e^{-x}$ убывает и остаётся положительной;
  • $\dfrac{1}{1+e^{-x}}$ — обратная величина от убывающей положительной, значит возрастает.

Функция возрастает на всей числовой прямой, экстремумов нет.

Шаг 6. Асимптоты.

  • При $x\to+\infty$: $e^{-x}\to0$, значит $y \to \dfrac{1}{1+0}=1$. Горизонтальная асимптота $y=1$.
  • При $x\to-\infty$: $e^{-x}\to+\infty$, знаменатель растёт неограниченно, значит $y\to0$. Горизонтальная асимптота $y=0$.
  • Вертикальных нет: знаменатель никогда не ноль.

Шаг 7. Контрольные точки.

$$f(0)=0{,}5,\quad f(2)=\frac{1}{1+e^{-2}}\approx\frac{1}{1{,}135}\approx0{,}881,\quad f(4)\approx\frac{1}{1{,}018}\approx0{,}982$$$$f(-2)\approx0{,}119,\quad f(-4)\approx0{,}018$$

Итоговая картина: знаменитая S-образная кривая, зажатая между полками $y=0$ и $y=1$, монотонно возрастающая, проходящая через $\left(0;\tfrac12\right)$. $E(f)=(0;1)$ — значения строго внутри, ровно $0$ и ровно $1$ недостижимы (поэтому в коде логистической регрессии предсказания всегда обрезают, прежде чем брать логарифм).

Что видно из графика и не видно из формулы: при $|x|>4$ кривая практически ложится на полку — изменение $x$ с $4$ до $8$ меняет $y$ всего с $0{,}982$ до $0{,}9997$. Это и есть насыщение: в этой зоне сигнал обучения почти не проходит. Взгляд на график объясняет проблему затухающего градиента за пять секунд.


Масштаб осей: почему график может врать

Интуиция

Представь фотографию горной гряды, снятую с самолёта: на фоне восьмикилометрового Эвереста трёхсотметровый холм выглядит абсолютно плоским. Он не стал плоским — просто масштаб выбран так, что мелкие детали не видны. Ровно это происходит с графиком функции потерь: когда loss падает с $2{,}0$ до $0{,}01$ за первые десять эпох, а потом с $0{,}01$ до $0{,}001$ за следующие двести, на линейной оси второй участок — это неразличимая от нуля линия. При этом ошибка упала в десять раз.

Лекарство — логарифмическая шкала. Она откладывает по оси не само значение, а его порядок: расстояние между $0{,}001$ и $0{,}01$ такое же, как между $0{,}01$ и $0{,}1$ и как между $1$ и $10$. Каждое равное деление — умножение на десять, а не прибавление десяти.

Есть три сценария, и выбор между ними — половина искусства чтения графиков:

  • Линейные оси. Обычный случай, годится, когда значения не различаются на порядки.
  • Semi-log (логарифм только по $y$). Экспонента $y = C\cdot a^x$ превращается в прямую: $\lg y = \lg C + x\lg a$. Наклон прямой равен $\lg a$ — то есть по картинке можно прямо прочитать темп роста.
  • Log-log (логарифм по обеим осям). Степенной закон $y = C\cdot x^n$ превращается в прямую: $\lg y = \lg C + n \lg x$. Наклон прямой равен показателю степени $n$.

Это даёт мгновенную диагностику: если на semi-log данные легли на прямую — рост экспоненциальный; если на log-log — степенной. Именно так распознают scaling laws больших языковых моделей: loss в зависимости от числа параметров рисуют в log-log, и если получается прямая, значит зависимость степенная, а наклон прямой — это и есть тот самый показатель $\alpha$ из $L \propto N^{-\alpha}$.

Пример с разбором

Пример (сложный): кривая обучения $L(n) = 100\cdot n^{-0{,}5}$, где $n$ — размер обучающей выборки. Что покажет линейный график и что покажет log-log?

Решение:

Шаг 1. Посчитаем значения в нескольких точках:

$$L(1)=100,\quad L(100)=\frac{100}{10}=10,\quad L(10^4)=\frac{100}{100}=1,\quad L(10^6)=\frac{100}{1000}=0{,}1$$

Шаг 2. На линейных осях с диапазоном $y$ от $0$ до $100$ вся часть графика начиная с $n=10^4$ прижата ко дну: значения $1$ и $0{,}1$ отличаются от нуля на $1\%$ и $0{,}1\%$ высоты картинки. Визуально — прямая линия по оси $x$. Вывод «дальше расти некуда» ошибочен: между этими точками ещё десятикратное улучшение.

Шаг 3. Прологарифмируем зависимость:

$$\lg L = \lg 100 + (-0{,}5)\lg n = 2 - 0{,}5\lg n$$

Шаг 4. В координатах $(\lg n;\ \lg L)$ это уравнение прямой с угловым коэффициентом $-0{,}5$ и свободным членом $2$. Проверим по точкам: при $\lg n = 0$ получаем $\lg L = 2$ ✅ (это $n=1$, $L=100$); при $\lg n = 4$ получаем $\lg L = 2-2 = 0$ ✅ (это $n=10^4$, $L=1$).

Ответ: на линейных осях — обманчивая «полка»; на log-log — идеальная прямая с наклоном $-0{,}5$, по которой сразу читается показатель степенного закона и можно экстраполировать: чтобы уменьшить loss ещё вдвое, нужно увеличить $n$ в $4$ раза.

Почему это важно

Выбор шкалы — это не оформление, это часть анализа. Половина решений в ML принимается по картинке: «сходится или нет», «переобучаемся или нет», «стоит ли докупать данные». Три конкретные ситуации, где линейная шкала систематически врёт:

Первая — кривые обучения. Loss почти всегда падает по степенному или экспоненциальному закону, и линейная шкала обесценивает весь хвост. Отсюда правило: loss всегда смотри в логарифме по $y$.

Вторая — распределения признаков в EDA. Доходы, размеры городов, длины текстов, количество кликов — всё это распределения с тяжёлым хвостом. Гистограмма на линейной оси покажет один столбик у нуля и пустоту справа. Логарифмируешь ось — увидишь нормальную колоколообразную картинку и поймёшь, что нужен log-преобразованный признак.

Третья — сравнение экспоненциального роста. Ковид-графики 2020 года весь мир учился читать именно в semi-log: на линейной оси «взрыв» и «замедление» неразличимы, на логарифмической излом прямой виден мгновенно.

И вечное предостережение Тьюки: сначала картинка, потом метрика. Квартет Анскомба — четыре набора данных с одинаковыми средним, дисперсией, корреляцией и одинаковой линией регрессии, но с абсолютно разными графиками — существует ровно для того, чтобы напомнить: сводные числа скрывают форму, а форма и есть суть.


Строим график в коде: matplotlib по точкам

Схема исследования даёт понимание, код даёт картинку. Минимальный рецепт построения по точкам:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 400)      # 400 точек — достаточно для гладкой кривой
y = x**2 - 4*x + 3

plt.plot(x, y)
plt.axhline(0, color="gray", linewidth=0.8)   # ось Ox
plt.axvline(0, color="gray", linewidth=0.8)   # ось Oy
plt.grid(alpha=0.3)
plt.show()

Три вещи, которые здесь стоит понимать.

Первое: matplotlib не строит функцию — он соединяет точки отрезками. Плавность кривой — это иллюзия, созданная достаточным количеством точек. Возьми np.linspace(-5, 5, 7) вместо 400, и парабола превратится в ломаную. Правило: чем более «дёрганая» функция, тем больше точек нужно.

Второе: разрывы код не понимает. Если построить $y = 1/x$ на отрезке, содержащем ноль, matplotlib честно соединит последнюю огромную отрицательную точку с первой огромной положительной — и нарисует почти вертикальную линию, которая выглядит как асимптота, но асимптотой не является: это фальшивый кусок графика, которого в функции нет. Лечится вставкой np.nan в точке разрыва или построением двух отдельных кусков — ровно так, как в схеме исследования мы отдельно разбираем каждый промежуток области определения.

Третье: масштаб — это одна строка. plt.yscale("log") даёт semi-log, добавь ещё plt.xscale("log") — получишь log-log. Привычка переключать шкалу при взгляде на любую кривую обучения стоит примерно ноль усилий и регулярно спасает от неверных выводов.


Практика: 30 заданий

Базовые (задания 1-10)

Задание 1: Найди область определения функции $y = \dfrac{x+2}{x-5}$.


Задание 2: Найди область определения функции $y = \sqrt{2x-6}$.


Задание 3: Определи чётность функции $y = x^4 - 3x^2 + 1$.


Задание 4: Определи чётность функции $y = x^3 - x$.


Задание 5: Найди нули функции $y = x^2 - 7x + 12$.


Задание 6: Найди нули функции $y = \dfrac{x^2-9}{x+1}$.


Задание 7: Опиши, как получить график $y = (x+4)^2 - 5$ из графика $y = x^2$, и укажи координаты вершины.


Задание 8: Найди асимптоты графика $y = \dfrac{1}{x-2} + 3$.


Задание 9: Скорость обучения (learning rate) затухает по закону $\eta(t) = \dfrac{0{,}1}{1+0{,}01t}$, где $t$ — номер шага. Найди $\eta(0)$, $\eta(100)$ и горизонтальную асимптоту.


Задание 10: Ошибка модели на валидации приближённо описывается функцией $L(t) = \dfrac{5}{t} + 0{,}2$, где $t$ — номер эпохи. К какому значению стремится ошибка? На какой эпохе она станет равной $0{,}25$?


Средние (задания 11-20)

Задание 11: Найди область определения функции $y = \dfrac{\sqrt{x+5}}{x^2-4}$.


Задание 12: Определи чётность функции $y = \dfrac{x^3}{x^2-1}$.


Задание 13: Признак сезонности во временном ряде задан функцией $s(t) = \sin\dfrac{2\pi t}{7}$, где $t$ — номер дня. Найди наименьший положительный период и объясни его смысл.


Задание 14: Найди промежутки знакопостоянства функции $y = (x-1)(x+2)(x-4)$.


Задание 15: Докажи по определению, что функция $y = \dfrac{3}{x}$ убывает на промежутке $(0;+\infty)$.


Задание 16: Ошибка предсказания одного объекта по метрике MAE задана функцией $L(p) = |p - 2|$, где $p$ — предсказание модели, а истинное значение равно $2$. Опиши график, найди минимум и сравни с MSE $L(p) = (p-2)^2$.


Задание 17: Опиши последовательность преобразований, переводящих график $y = x^2$ в график $y = -\dfrac12(x-3)^2 + 4$. Найди вершину и нули.


Задание 18: Кривая обучения модели описывается формулой $L(n) = 2 + \dfrac{8}{\sqrt{n}}$, где $n$ — количество размеченных примеров. При каком $n$ ошибка станет равна $3$? Сколько примеров нужно, чтобы дойти до $2{,}5$? Чему равен «пол» ошибки?


Задание 19: Исследуй монотонность функции $y = x + \dfrac{4}{x}$ на промежутке $(0;+\infty)$ и найди её наименьшее значение.


Задание 20: Исследуй сигмоиду $\sigma(x) = \dfrac{1}{1+e^{-x}}$: область определения, нули, монотонность, асимптоты, $\sigma(0)$.


Продвинутые (задания 21-30)

Задание 21: Проведи полное исследование функции $y = \dfrac{4}{x^2+1}$ (в kernel-методах такая форма используется как весовая функция: чем дальше объект, тем меньше его вклад).


Задание 22: Проведи полное исследование функции $y = \dfrac{x}{x^2+1}$.


Задание 23: Построй график $y = |x^2 - 4|$: укажи нули, промежутки монотонности и экстремумы.


Задание 24: Сколько корней имеет уравнение $|x^2-4| = a$ в зависимости от параметра $a$?


Задание 25: Построй график $y = \dfrac{2x+3}{x+1}$: выдели целую часть, найди асимптоты, нули и опиши преобразования.


Задание 26: Ошибка модели подчиняется степенному закону $L(n) = 100 \cdot n^{-0{,}5}$. Найди $L(10^4)$ и объясни, почему в координатах $(\lg n;\ \lg L)$ график будет прямой. Чему равен её угловой коэффициент?


Задание 27: Число пользователей приложения растёт как $U(t) = 1000\cdot 2^{t}$, где $t$ — число месяцев. Вычисли $U(0)$, $U(12)$, $U(24)$. Объясни, почему на линейном графике первый год выглядит плоским, а на semi-log — нет.


Задание 28: Найди промежутки знакопостоянства функции $y = \dfrac{(x-1)^2(x+3)}{x-2}$.


Задание 29: Отладка кода. Найди ошибку и исправь её.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 1000)
y = 1 / x

plt.plot(x, y)
plt.ylim(-10, 10)
plt.show()
# На картинке между ветвями гиперболы появилась почти вертикальная линия,
# соединяющая низ левой ветви с верхом правой. Откуда она?

Задание 30: Сколько решений имеет уравнение $\dfrac{1}{x} = x - 2$? Реши его графически и точно.


Частые ошибки

Ошибка 1: проверять чётность, не глядя на область определения

Неправильно: взять функцию $y=\sqrt{x}$, подставить $-x$, получить $\sqrt{-x}$ и объявить: «ни чётная, ни нечётная, потому что не совпало».

Правильно: сначала смотрим на $D(f)=[0;+\infty)$. Эта область не симметрична относительно нуля, значит вопрос о чётности вообще не имеет смысла — ответ «ни чётная, ни нечётная» получен сразу, без единой подстановки. Тот же вывод для $y=\dfrac{\sqrt{x+3}}{x-1}$ из примера 3.

💡 Почему важно: подстановка $-x$ в функцию, у которой $-x$ вне области определения, — это операция над несуществующим значением. Формально это не просто «лишний шаг», а неверное рассуждение. Порядок всегда такой: симметрия области → только потом подстановка.


Ошибка 2: писать «убывает на $(-\infty;0)\cup(0;+\infty)$»

Неправильно: сказать про $y=\dfrac1x$, что она убывает на объединении двух промежутков.

Правильно: она убывает на каждом из промежутков $(-\infty;0)$ и $(0;+\infty)$ по отдельности. На объединении убывания нет: возьми $x_1=-1 < x_2=1$, тогда $f(x_1)=-1 < f(x_2)=1$ — значение выросло, а не упало.

💡 Почему важно: определение монотонности требует, чтобы неравенство выполнялось для любых двух точек промежутка. Точка разрыва разрывает и это свойство. В ответах на экзамене промежутки монотонности всегда перечисляют через запятую или со словом «и», а не знаком объединения.


Ошибка 3: объявлять вертикальную асимптоту всюду, где знаменатель равен нулю

Неправильно: для $y=\dfrac{x^2-3x+2}{x-1}$ заявить асимптоту $x=1$, потому что знаменатель там обнуляется.

Правильно: проверить числитель в этой же точке. У нас $1-3+2=0$ — числитель тоже ноль, дробь сокращается: $y=x-2$ при $x\neq1$. Никакой асимптоты нет, есть выколотая точка $(1;-1)$.

💡 Почему важно: это разница между устранимым разрывом (дырка, которую можно «залатать» одним значением) и бесконечным (стена, через которую график не проходит). В коде разница тоже принципиальная: в первом случае достаточно заполнить одно значение, во втором нужно менять формулу или обрезать диапазон.


Ошибка 4: путать направление сдвига внутри аргумента

Неправильно: решить, что $y=f(x-3)$ сдвигает график влево на 3 — «ведь там минус».

Правильно: $y=f(x-3)$ сдвигает вправо. Проверь на точке: у $y=x^2$ вершина в нуле, у $y=(x-3)^2$ значение $0$ достигается при $x=3$ — вершина уехала вправо. Правило: снаружи — как ожидаешь, внутри — наоборот.

💡 Почему важно: та же ловушка в кубе — в композиции $y=f(2x-4)$. Пока не вынесешь коэффициент за скобку, $f\big(2(x-2)\big)$, будешь уверен, что сдвиг на 4. На самом деле на 2. Ошибка вдвое, причём молчаливая — график получается похожим, но неверным.


Ошибка 5: путать $|f(x)|$ и $f(|x|)$

Неправильно: строить $y=|x^2-4|$ и $y=(|x|)^2-4$ одинаково.

Правильно: $y=|f(x)|$ — отражаем вверх всё, что было ниже оси $Ox$ (получаем горб посередине из задания 23). А $y=f(|x|)$ — стираем всю левую половину графика и заменяем зеркальной копией правой. Для $y=x^2-4$ вторая операция вообще ничего не меняет, потому что функция уже чётная.

💡 Почему важно: это два принципиально разных преобразования: одно действует на значения (по вертикали), другое — на аргументы (по горизонтали). На экзамене их различают в задачах с параметром, где от числа корней зависит весь ответ.


Ошибка 6: строить график по точкам, игнорируя разрывы

Неправильно: взять пять значений, соединить их линией и считать, что график построен. Или сделать то же в коде: plt.plot(x, 1/x) на отрезке, проходящем через ноль.

Правильно: сначала найти область определения и разбить её на промежутки непрерывности, потом строить каждый промежуток отдельно. Точки считать в последнюю очередь — для уточнения уже понятной формы.

💡 Почему важно: соединение точек через разрыв рисует несуществующую линию — и на бумаге, и в matplotlib. Мозг верит картинке сильнее, чем формуле, поэтому фальшивая линия приводит к настоящим неверным выводам (см. задание 29).


Ошибка 7: делать выводы по графику, не глядя на масштаб осей

Неправильно: увидеть на кривой обучения плоскую линию и остановить обучение.

Правильно: переключить ось $y$ в логарифм (plt.yscale("log")) и посмотреть ещё раз. Падение с $0{,}01$ до $0{,}001$ — это десятикратное улучшение, полностью невидимое на линейной шкале.

💡 Почему важно: это самая дорогая ошибка из списка, потому что она не математическая, а «человеческая»: формулы все верны, вычисления правильные, а вывод неверный. Правило: любую кривую, у которой значения различаются на порядки, смотри в логарифмическом масштабе.


Главное запомнить

Схема исследования из семи шагов: область определения → симметрия (чётность, нечётность, периодичность) → нули и пересечения с осями → промежутки знакопостоянства → монотонность → асимптоты → контрольные точки. Порядок не случайный: каждый шаг экономит следующий.

Проверка чётности начинается с области определения. Если $D(f)$ несимметрична относительно нуля — функция ни чётная, ни нечётная, и подставлять $-x$ не нужно.

Чётность делит работу пополам: исследовал при $x\geq0$ — отразил относительно $Oy$ (чётная) или повернул на $180°$ вокруг начала координат (нечётная).

Метод интервалов: отметь нули и точки разрыва, определи знак на одном промежутке, дальше переключай знак на корнях нечётной кратности и не переключай на корнях чётной.

Монотонность без производной доказывается тремя способами: методом разности $f(x_2)-f(x_1)$, цепочкой из известных кирпичиков или удачным преобразованием формулы (выделением целой части).

Убывание на каждом промежутке ≠ убывание на объединении. Разрыв рвёт монотонность — записывать промежутки объединением нельзя.

Асимптоту от дырки отличает сокращение дроби. Ноль знаменателя — только повод проверить числитель, а не готовый ответ.

Преобразования: снаружи — как ожидаешь, внутри — наоборот. $f(x)+a$ — вверх, $f(x-a)$ — вправо, $kf(x)$ — растяжение по вертикали, $f(kx)$ — сжатие по горизонтали. В $f(mx+c)$ коэффициент выносят за скобку до определения сдвига.

$|f(x)|$ отражает вверх нижнюю часть; $f(|x|)$ копирует правую часть налево. Это разные операции.

Масштаб осей — часть анализа, а не оформления. Прямая на semi-log = экспонента; прямая на log-log = степенной закон, и её наклон равен показателю степени.


Связь с другими темами курса

Что было раньше. Этот урок — точка сборки всего блока функций. Из урока 76 пришло само понятие функции и её графика, из 77–78 — область определения и область значений, из 79 — чётность, нечётность и монотонность, из 80–81 — квадратичная и степенная функции как готовые «кирпичики», из 82 — обратная функция (симметрия относительно $y=x$), из 83–88 — преобразования графиков и дробно-линейная функция, из 89 — асимптоты. Ничего принципиально нового здесь нет — есть система, которая склеивает всё это в один рабочий алгоритм.

Что дальше. Следующий урок 91 открывает тригонометрию с радианной меры угла, и там схема исследования сразу пригодится в новом качестве: у тригонометрических функций появляется периодичность — свойство, которое сокращает исследование не вдвое, как чётность, а бесконечно: достаточно построить один период и размножить его. Уроки 111–121 добавят показательную и логарифмическую функции, где ключевую роль играют горизонтальные и вертикальные асимптоты. А урок 133 введёт производную — и в уроке 144 та же схема получит мощный восьмой шаг: производная даст промежутки монотонности и точки экстремума автоматически, без изобретательности с разностями. Важно понимать: производная не отменяет эту схему, она встраивается в неё как более удобный инструмент для шага 5.

Где это применяется:

📊 В ML: кривые обучения (train/validation loss по эпохам), диагностика переобучения по расхождению двух кривых, функции активации и их насыщение на асимптотах, decision boundary как множество нулей решающей функции, монотонные ограничения в градиентном бустинге.

📈 В data science и EDA: первый взгляд на распределение признака, поиск выбросов и тяжёлых хвостов, выбор шкалы и логарифмических преобразований, графики остатков регрессии, квартет Анскомба как напоминание о пределах сводных метрик.

💻 В программировании: matplotlib, seaborn, plotly; корректная обработка разрывов и пропусков; профилирование производительности в log-log осях (сложность $O(n^2)$ на log-log — прямая с наклоном 2).

💰 В экономике и финансах: графики котировок в логарифмическом масштабе (там равные проценты — равные расстояния), кривые спроса, точки безубыточности как нули функции прибыли.

🔬 В науке и медицине: дозозависимые кривые (те же сигмоиды), кинетика реакций, эпидемические кривые в semi-log.


Интересные факты

💡 Первый график в истории появился на 300 лет раньше координат. Николай Орем около 1350 года рисовал «конфигурации качеств» — по сути графики скорости от времени — и даже доказал этим теорему о средней скорости. Но без алгебры и без чисел на осях идея не взлетела: понадобился Декарт с координатной плоскостью в 1637 году, чтобы график стал рабочим инструментом, а не иллюстрацией.

💡 Квартет Анскомба до сих пор не дал соврать ни одной статистике. Четыре набора по 11 точек, у которых совпадают среднее $x$, среднее $y$, дисперсии, коэффициент корреляции ($0{,}816$) и уравнение линии регрессии — но на графике это облако, парабола, идеальная прямая с одним выбросом и вертикальная колонна с единственной точкой в стороне. В 2017 году исследователи пошли дальше и построили «Datasaurus Dozen» — 13 наборов с одинаковой статистикой, один из которых образует силуэт динозавра.

💡 Логарифмическую шкалу изобрели для торговли, а не для науки. Уильям Плейфер применил её в конце XVIII века к британским торговым балансам, чтобы можно было сравнивать проценты роста, а не абсолютные суммы. Сегодня по этой же причине котировки акций на долгих горизонтах всегда смотрят в логарифме: рост со 100 до 200 долларов и с 1000 до 2000 долларов — одно и то же удвоение, и на логарифмической шкале они выглядят одинаково, а на линейной второе кажется в десять раз «важнее».

💡 Асимптоту можно пересекать. Школьная интуиция «график никогда не касается асимптоты» верна только для вертикальных. Горизонтальную асимптоту график может пересекать сколько угодно раз: у затухающих колебаний вида $y=\dfrac{\sin x}{x}$ асимптота $y=0$, и кривая пересекает её бесконечное число раз, каждый раз всё теснее к ней прижимаясь. Определение говорит о стремлении расстояния к нулю, а не о запрете пересечения.

💡 Matplotlib написан по образцу MATLAB — и назван в его честь. Джон Хантер создал библиотеку в 2003 году, работая нейробиологом: ему нужно было строить графики ЭКоГ-сигналов эпилептических пациентов, а лицензии MATLAB не хватало на всю лабораторию. Сегодня практически каждая картинка в статьях по ML нарисована его кодом.


Лайфхаки и полезные трюки

1. Начинай с чётности — она экономит половину работы

Первым делом после области определения подставь $-x$. Если функция оказалась чётной или нечётной, ты только что сократил всё оставшееся исследование вдвое: строишь при $x\geq0$ и отражаешь. Для дробей из многочленов есть мгновенный тест по степеням: чёт/чёт = чётная, нечёт/чёт = нечётная, нечёт/нечёт = чётная, смешанные степени = ни та ни другая.


2. Выделяй целую часть у любой дробно-рациональной функции

Как только видишь дробь, попробуй представить числитель через знаменатель. $\dfrac{2x+3}{x+1} = 2+\dfrac{1}{x+1}$, $\dfrac{x^2}{x^2-1} = 1 + \dfrac{1}{x^2-1}$, $\dfrac{x^2+1}{x} = x + \dfrac1x$. После этого асимптоты, монотонность и преобразования читаются с одного взгляда — переменная остаётся в одном месте, и всё сводится к знакомому $\dfrac1t$.


3. Знак определяй один раз — справа, дальше только переключай

При очень больших $x$ все скобки вида $(x-a)$ положительны, значит знак произведения совпадает со знаком старшего коэффициента. Определи знак на самом правом промежутке и иди влево, переключая знак на корнях нечётной кратности и не переключая на чётных. Это вдвое быстрее, чем подставлять пробную точку в каждый промежуток. Но одну проверочную подстановку в конце всё-таки сделай — она ловит потерянные знаки.


4. Держи в голове «библиотеку» из семи базовых графиков

$y=kx+b$, $y=x^2$, $y=x^3$, $y=\dfrac1x$, $y=\sqrt x$, $y=|x|$, $y=a^x$. Девять из десяти школьных и вузовских задач на построение — это один из этих семи графиков, к которому применили два-три преобразования. Не строй с нуля: узнай базу, потом навесь фильтры.


5. Проверяй ответ тремя точками — это ловит 90% ошибок

Построил график — подставь три числа: одно слева, одно между особыми точками, одно справа. Если хоть одна точка не лежит там, где нарисовано, ищи ошибку. Особенно полезно проверять точки по обе стороны от вершины или от асимптоты: симметрия должна сойтись.


6. Приводи к $\dfrac{1}{t}$ там, где хочешь понять монотонность без производной

Дробь, у которой переменная только в знаменателе, устроена просто: знаменатель растёт → дробь убывает (на промежутке постоянного знака). Именно так мы разобрали $\dfrac{4}{x^2+1}$ и $\dfrac{x^2}{x^2-1}$. Если удалось загнать переменную в знаменатель — монотонность получена бесплатно.


7. При работе с кодом сделай две привычки: np.nan на разрывах и yscale("log") на кривых обучения

Первая избавляет от фальшивых вертикальных линий, вторая — от фальшивых выводов «модель сошлась». Обе — одна строка кода. Третья полезная привычка: для «дёрганых» функций бери минимум 300–500 точек в linspace, иначе гладкая кривая превратится в ломаную и ты «увидишь» несуществующие изломы.


8. Строй график остатков всегда, а не только когда что-то пошло не так

Если после обучения регрессии построить остатки $y_{\text{факт}}-y_{\text{предсказ}}$ против предсказаний, то структура ошибки станет видна мгновенно: воронка означает гетероскедастичность, дуга — недостающую нелинейность, систематический перекос знака на диапазоне — пропущенный признак. Метрика $R^2$ ни об одном из этих трёх диагнозов не сообщит.


Схема, которую ты сейчас освоил, — это не «способ решить задачу №15 на экзамене». Это способ мышления, который переносится один в один: посмотри, где объект вообще существует, найди симметрии, найди точки перелома, пойми поведение на краях, и только потом уточняй детали. Ровно так разбирают незнакомый датасет, ровно так читают кривую обучения, ровно так отлаживают модель, которая ведёт себя странно.

И вот что приятно: производную ты ещё даже не проходил, а уже умеешь честно исследовать функции, которые в учебниках стоят в разделе «с применением производной». Когда в уроке 133 производная всё-таки появится, она не отменит ничего из сделанного — она просто автоматизирует пятый шаг схемы, тот самый, где мы вручную возились с разностями $f(x_2)-f(x_1)$. Скелет останется прежним.

А пока — открой matplotlib и построй любую функцию из этого урока сам. Сначала на бумаге по схеме, потом кодом. Совпало — значит, ты понял. Не совпало — значит, ты нашёл ошибку, свою или в коде, и это ещё полезнее. 🚀

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!