---
# System prepended metadata

title: Курс по ИИ от универа

---

# Курс по ИИ от универа

## Программные средства машинного обучения
Стартап вопросы:
*  Вопрос о технологии: Способны ли вы создать продвинутую технологию, а не вносить мелкие дополнения в уже существующую?
*  Вопрос о времени: Подходящий ли сейчас момент начинать задуманный вами бизнес?
*  Вопрос о монополии: Вы начинаете с захвата большой доли на маленьком рынке?
*  Вопрос о людях: У вас достойная команда?
*  Вопрос о продажах: У вас есть возможность не только создать, но и продавать ваш продукт?
*  Вопрос о времени жизни: Сможете ли вы сохранить свои позиции на рынке через 10 лет? А через 20?
*  Вопрос об открытии: Нашли ли вы свой уникальный шанс, не замеченный остальными?



---
## Алгоритмы и структуры данных

---
## Машинное обучение
### Данные
Но встречается огромное количество проблем, связанных с обучением. Некоторые из них описаны ниже.

Модели с обучением очень **требовательны к данным**. Данные, на которых модель обучается и тестируется:

1) должны быть *разнообразны*, бесполезно обучать на одинаковых данных, даже если их много. Ничему новому модель не научится.

2) должны быть *непротиворечивы*, если вам учитель говорит один раз, что дважды два четыре, а другой раз, что пять, то чему вы сможете научиться? Также и модель. Когда данных много некоторые противоречия (ошибки) допустимы, модель с хорошей обобщающей способностью справится с этим, также, как и вы, если учитель девять раз вам повторял что дважды два четыре, а на десятый сказал, что пять, то, я надеюсь, вы не забудете таблицу умножения сразу же. Но таких противоречий должно быть немного.

3) должны быть *релевантны* задаче, действительно полностью описывать реальные моделируемые объекты. При измерениях неизбежны ошибки, если они маленькие не страшно, измеренные данные примерно описывают объект, но если большие – то беда, никак не узнать конкретное измеренное данное это ошибка или действительное описание объекта.

4) *тестовые данные должны отличаться от обучающих*, иначе тест бесполезен.


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

* А) **Обучение с учителем**. Здесь данные представляются в виде пар примеров входов в модель и *требуемых выходов* (такие выходы называют также «указания учителя») из нее для этих входов. Например, при распознавании изображений примерами входов являются сами изображение чего-то, а требуемыми выходами – название того, что на изображении изображено. Модель учится на этих парах, пытаясь подобрать свои параметры так, чтобы ее выходы совпали или были близки к требуемым. Это наиболее распространенный вид обучения. Поясню, что «учитель» — это не человек, а процесс, который смог собрать эти пары данных (это может быть и человек, и компьютер и др.). 
* Б) **Обучение без учителя** или самообучение. Бывает и так, что требуемые выходы модели неизвестны, но есть примеры входов. В этом случае модель может попытаться установить взаимосвязи между элементами входов, выделить каки-то общие черты. Для этого должен быть задан критерий такого выделения (явно или неявно). Например, есть набор звукозаписей с разным жанром музыки, но мы незнаем ни названий этих жанров, ни какой жанр у каждой из звукозаписей. Нужно распределить эти звукозаписи по «похожим» группам, надеясь, что это окажутся жанры. Действительно, звукозаписи одного жанра похожи друг на друга, а разных – отличаются, даже не зная названий вы легко отличите хэвиметалл от музыки для маленьких детей. Здесь вам никто не говорил, что вот эта звукозапись — это рок, а эта – классика. Вы поняли это только сравнивая между собой звукозаписи. Также и модель можно обучить выявлять схожие и различные черты данных. Это тоже популярный вид обучения, но более сложный, часто используется не сам по себе, а в дополнение к обучению с учителем.
* В) **Обучение с подкреплением**. Бывает, что «учитель» сам не знает, как именно должно быть, но понимает какие действия обучаемого хорошие и могут позволить достичь цели, а какие плохие. Вот пытаетесь вы на автомобиле доехать до булочной, а учитель не знает где она. Но зато он знает, что ехать по дороге – хорошо, сворачивать в забор – плохо. Он может штрафовать или награждать вас за действия. При такой информации тоже можно научиться и достигнуть цели, получая штрафы за съезд с дороги и поощрения за езду по ней, вы рано или поздно, проехав по многим дорогам, булочную найдете. Конечно, у вас нет так много времени и возможностей врезаться в забор, а у компьютера есть. Перебирая возможные варианты действий модель в компьютере будет получать штрафы или награды за действия и может научиться, какие же действия приводят к наибольшей суммарной награде. Обычно такую модель называют «агент», с систему наград и штрафов «внешней средой», которая симулирует какую-то настоящую среду. Такой вид обучения отличается и от обучения с учителем, поскольку здесь не говорится как именно должно быть, и от обучения без учителя, поскольку все-таки есть некоторая информация учителя в виде наград и штрафов от среды. Такой подход используют, например, для создания ботов для компьютерных игр.

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

### Способы организации обучения
В зависимости от того, как часто поступают данные и как часто нужен результат, все перечисленные выше виды обучения могут выполняться несколькими способами: 
- Динамическое или **онлайн обучение**. Как только данное поступило, необходимо сразу же, так быстро как позволяет компьютер, выдавать результат для него и доучивать модель (т.е. изменять параметры ее) для этого данного. Для большинства моделей с этим видом обучения важен порядок поступления данных: те же самые данные для той же самой модели, но представленные в другом порядке, могут привести к другому результату. Как пример, пусть модель имеет какое-то состояние (параметр, внутренне число) s (изначально 0), каждый раз прибавляет к нему вход и на выходе возвращает произведение этого числа s и входа. Если входы были (1, 2, 3), то состояние будет s= (0 изначально, 1=0+1, 3=1+2) результат (0=0 * 1, 2=1 * 2, 9=3 * 3). Если входы были в другом порядке (3, 2, 1), то состояние s будет s= (0 изначально, 3=0+3, 5=3+2) и результат будет другой (0=0 * 3, 6=3 * 2, 5=5 * 1). Онлайн обучение хорошо тем, что оно быстрее, но обычно менее точное, и зависит от порядка поступления данных.
- Отложенное или **оффлайн обучение**. Здесь параметры модели изменяются только после того, как для всех данных будут рассчитаны выходы. Обычно здесь порядок поступления данных не важен. Пусть модель работает также, как в предыдущем примере, но состояние s не изменяется, пока все данные не будут рассчитаны, изначально s=0, так что все выходы будут равны 0, для любого порядка поступления входов, и только после того как все выходы будут рассчитаны, s изменится на 6=0+1+2+3.  Оффлайн обучение хорошо тем, что обычно не зависит от порядка поступления данных и более точное, но зато медленнее. 
- Компромиссный вариант между онлайн и оффлайн обучением это **пакетное обучение**. Данные разбиваются на маленькие группы (пакеты, или по-английски batch), и параметры модели изменяются только после расчета пакета целиком. Изменяя размер пакета, сколько в него входит данных, мы можем балансировать между онлайн (размер пакета = 1) и оффлайн (размер пакета = количеству всех данных) обучением. Сегодня, пожалуй, это самый распространенный вариант организации обучения. Кстати, раз он похож на онлайн обучение, то результат может зависеть от порядка поступления пакетов, чтобы как-то с этим бороться пакеты часто перемешивают случайно.
- Вариант, когда модель может сама выбирать порядок поступления данных, называют **активное обучение**. 

### Задачи машинного обучения
Множество задач можно решить с помощью машинного обучения, вот только некоторые из них:

1) **Классификация**. Имея набор примеров входов и список классов (названий, меток, номеров) нужно распределить примеры входов по этим классам. Например, отличить мальчиков от девочек по фотографии. Список классов состоит из двух названий «мальчик» или «девочка», примеры входов – фотографии. Список возможных классов известен заранее и не бесконечен. Модель, которая решает такую задачу называется классификатором. Классификация может быть двухклассовой или бинарной, когда классов всего два, или многоклассовой, когда классов больше (одноклассовая классификация бессмыслена). Часто вводят специальный класс «не класс» (шум), к которому относят все, что не смогли отнести к другим классам. Обычно решается с помощью моделей с обучением с учителем.

2) **Кластеризация**. Имея только примеры входов, разбить их на группы (кластеры) так, чтобы внутри кластеров примеры были чем-то похожи, а примеры из разных кластеров чем-то отличались между собой. Обычно решается с помощью моделей с обучением без учителя, пример с звукозаписями оттуда как раз о кластеризации. Часто число кластеров неизвестно заранее, и даже их названия неизвестны. Также вводят специальный кластер «не кластер» (шум), в который группируют все, что не попало в другие кластеры.

3) **Регрессия**. Имея набор примеров входов и соответствующих им выходов научиться выдавать выходы для других примеров входов с той же взаимосвязью входов и выходов. Отличается от классификации тем, что в классификации выход это класс (номер, название или другое его представление), т.е. дискретная величина, а в регрессии выход непрерывен (не дискретен). Классификация – частный случай регрессии, т.к. дискретную величину можно представить вариантом непрерывной. Пример: зная температуру на улице, определить температуру в доме. Многие другие задачи сводятся к регрессии.

4) **Прогнозирование**. Зная, как изменялась какая-то величина до определенного времени, узнать, как она будет изменяться после. Например, узнать температуру на улице на завтра, зная, как она изменялась раньше. Обычно сводится к задаче регрессии.

5) **Оптимизация**. Имея примеры данных и некоторую функцию, заданную на этих данных, найти такие данные, для которых функция принимает оптимальное (минимальное или максимальное) значение. Например, есть набор шариков разного размера и материала, зададим вес как функцию от размера и плотности материала шарика, нужно найти шарик с максимальным весом. Обучение — это, по сути, оптимизация функции ошибки модели. Поэтому, так или иначе, все (ну почти все) задачи сводятся к оптимизации некоторой функции. Оптимизация это или минимизация или максимизация. Здесь и всегда мы не будем различать мини- и максимизацию, потому что это одинаковые задачи. Если мы умеем минимизировать функцию, меняем у нее знак и теперь мы умеем ее максимизировать. Проверьте.

Другие задачи, число их велико, но они так или иначе сводятся к перечисленным выше: 
- **ранжирование**. Отличается от регрессии или классификации тем, что выходы надо получить сразу на множестве примеров, после чего отсортировать их по значениям выходов. Встречается, например, в поисковых системах типа Google. 
- **сокращение размерности**. Входы часто являются объектами большой размерности (вектора, матрицы, массивы), но все ли элементы входов одинаково важны? Зачастую можно отбросить или преобразовать входы так, что их размерность будет меньше, но при этом наиболее важные черты данных сохранятся и не будут потеряны. Как пример, нарисовать стомерный массив трудно, но можно найти такую его двумерную проекцию, чтобы было видно как можно лучше структуру данных в нем. Нарисовать двумерный массив гораздо проще.
- и другие….

### Функционалы ошибки и метрики
Как мы помним, обучение – это подбор параметров модели с целью уменьшения функции ошибки (по-английски loss). Сами функции ошибки разнообразны, зависят от задачи, которую вы решаете, модели, которую используете, данных, на которых проходит обучение. Самой простой и распространенной функцией ошибки L, пожалуй, является функция квадрата расстояния между вектором Y выхода модели и указаний учителя T (требуемого выхода) на обучающих данных X: \\(L=(Y(X)-T(X))^2\\). Если примеров данных несколько (для пакетного или оффлайн обучения), то берут среднее значение L между примерами. Любые другие расстояния, или, как их называют математики, *меры*, тоже могут использоваться в функциях ошибки (например модуль разности, а не квадрат, это так называемая L1 мера). Функция ошибки может быть и очень сложной, например, в обучении с подкреплением, она определяется симуляцией внешней среды. Одну и ту же модель можно использовать с разными функциями ошибки, получая разные результаты. Часто в функцию ошибки добавляют ограничения для модели, например, чтобы ее параметры были не очень велики. 

### Цена ошибки
Разные ошибки могут иметь разную цену, например если мы распознаем наличие мины через показание миноискателя, то для ошибки принять мину за постороннюю железку цена очень велика – жизнь сапера, а для ошибки принять постороннюю железку за мину цена гораздо меньше – несколько лишних минут поработать лопатой. Такие цены ошибок можно учесть заранее в функции ошибки, приписав веса членам, отвечающим за определенную ошибку. Конечно и результат будет другой.

### Метрики
Вообще, сложилась такая ситуация, что для подавляющего большинства моделей, за редким исключением, мы оптимизируем вовсе не то, что хотели. Скажем для задач классификации, функция ошибки обычно это средний квадрат расстояния между векторами выхода и указаний учителя. Но цель-то уменьшить число неправильно классифицированных примеров. В идеале, когда ошибка 0, то и число неправильно классифицированных примеров тоже 0, но в остальном эти функции – средний квадрат расстояния и число ошибок – разные. Дело в том, что к функции ошибки, которая будет использоваться для оптимизации параметров, предъявляют жесткие требования, например, чтобы она была дифференцируема. Число ошибок — это не дифференцируемая функция, а квадрат расстояния – дифференцируемая. 

Назовем то, что мы хотели бы оптимизировать **метрикой** (по-английски metrics). Для одной задачи можно посчитать множество разных метрик. Именно метрики описывают качество решения задачи, а функция ошибки — это косвенное средство достижения заданных метрик. Но бывает и так, что можно обойтись без отдельной функции ошибки, используя только метрику, это возможно для методов оптимизации, которые не требуют дифференцированности функций.

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

* была мина и модель приняла ее за мину, это верное распознавание, обозначим как TP.
* не было мины и модель так и ответила, это тоже верное распознавание, обозначим как TN.
* была мина, но модель сказала, что это не мина, это ошибка, обозначим как FP.
* не было мины, но модель сказала, что была, это тоже ошибка, обозначим как FN.
![](https://i.imgur.com/49pYuEp.png)

Матрица несет в себе всю информацию о качестве модели, в идеале элементы вне главной диагонали (ошибки) равны нулю. Но матрица сложна для понимания человеком, поэтому на основе этой матрицы считают множество других метрик:
![](https://i.imgur.com/DqHbpFa.png)
Часто в модели можно легко изменять какой-то гиперпараметр, в результате чего будут меняться ответы и метрики (обычно это порог для отнесения к классу), удобно строить кривую ROC (Receiving operation curve) у которой по одной оси отложено FPR, а по другой TPR при изменении этого параметра. Площадь под этой кривой, AUC (Area Under Curve), тоже является метрикой. Можно придумать и другие метрики. Для многоклассовой классификации похожие усредненные метрики могут быть использованы. Также, как и в функцию ошибки в метрики можно вводить веса (цену) отдельным типам ошибок.  
![](https://i.imgur.com/V5fHSV6.png)

### Модели
Придумано большое количество моделей машинного обучения, простых и сложных, точных и не очень, легко вычисляемых и требующих огромных вычислительных мощностей. Оставшаяся часть курса будет посвящена некоторым моделям. Поиск лучшей модели — это сложный эксперимент, перебирают разные модели, разные варианты моделей, а все это требует времени и средств. И никто, никто, не скажет вам как правильно, потому что однозначного правильного ответа вовсе нет. Нельзя заранее сказать какая модель будет лучше или хуже, бывает так, что простая модель окажется лучше сложной или наоборот. В первую очередь это зависит от данных, на которых она обучается. Надо пробовать разные варианты, читать и исследовать решения похожих задач, смотреть, а как их решали ранее, что можно улучшить. Не думайте, что пройдя курс, вы вдруг сможете решить любую задачу, так не бывает. Мы подобрали простые примеры, которые уже многократно успешно решались, но есть хорошая пословица «Дьявол кроется в деталях». Поменяй условия и модель перестанет работать, например, обучили модель распознавать автомобили, но раз, другое освещение, дождь, туман, и все, модель больше не работает. Обучили модель на обучающих и тестовых данных «идеально», но данные оказались не релевантны реальности, не описывают ее, и «идеальная» модель, на которую вы затратили кучу сил и времени, стала бесполезной. Обучение моделей это тяжелый труд, часто требуется интуиция и удача, но у тех кто пойдет по этому пути, кто не будет пасовать перед трудностями (ааааа, у меня ничего не работает!) и проводить много исследований, читать литературу – все получится.

К нашему счастью, множество моделей уже разработано, реализовано в программных библиотеках, и бывает так, что достаточно нажать пару кнопочек, вызвать несколько функций, и все работает. Мало просто решить задачу, нужно понимать, как вы ее решили. Мы не просим вас запоминать сложные математические формулы и понятия, это придет потом, в институте, но понимать суть происходящего, принципы работы моделей – необходимо.

Кратко перечислим модели, с которыми мы познакомимся в этом курсе, а подробнее поговорим про них позже, не пугайтесь иногда странных названий этих моделей, и помните, что это математические модели.

* деревья решений и случайный лес;
* наивная байесовская классификация;
* линейная регрессия и метод наименьших квадратов;
* логистическая регрессия;
* метод опорных векторов;
* ансамблевые методы: бустинг, беггинг, конкретно xgboost, catboost;
* метод к-средних Kmeans;
* метод к ближайших соседей KNN;
* метод главных компонент PCA;
* методы обучения метрик;
* нейронные сети (основы).


### Лекция 1. ЛИНЕЙНАЯ РЕГРЕССИЯ

**Часть 1. Модель линейной регрессии**
Модели машинного обучения устанавливают некоторую зависимость выходов от входов, т.е. задают правила, как посчитать выход, зная вход и параметры модели. В зависимости от того, каковы эти правила, различают и разные модели.

Одни из самых простых правил - **линейные**.

Линейные модели задают зависимости вида: 

(y - выход, x- вход, a(вес,множитель,на графике она же степень наклона) и b(смещение,свободный член, на графике на сколько высоко\низко находится прямая) - параметры)

y=a*x+b

Здесь вход x умножается на параметр a и к этому прибавляется параметр b.

Вход и выход могут быть векторами. Пусть х и y - вектора, в этом случае зависимость похожа, но теперь A это матрица параметров, а b - вектор и производится *матричное* умножение. Как вы помните, при матричном умножении необходимо соблюдать размерность, количество столбцов в матрице А равно количеству элементов в векторе х, а количество строк в матрице А равно количеству элементов в векторе у и равно количеству элементов в векторе b.

𝑦→=𝐴∗𝑥→+𝑏→

x→−вектор размерности 𝑁
𝑦→−вектор размерности 𝑀
𝑏→−вектор размерности 𝑀
𝐴−матрица размерности 𝑀∗𝑁


Линейные зависимости очень просты, их легко считать, линейные модели легко обучать, но - всегда есть НО - они хороши только для простых данных с почти линейными зависимостями, а такое бывает очень редко. Все же линейная модель это первое, что стоит попробовать при решении задачи, часто они используются как начальный вариант с другими моделями. Модели, которые не являются линейными, называются **нелинейными**, с ними познакомимся в другой раз.

Следует указывать также, по какой переменной модель линейна, может быть так, что она линейна по входу, но не по параметрам, а может наоборот. Линейная регрессия линейна и по входу и по параметрам.


**Что такое линейная регрессия?**
Линейная регрессия помогает понять линейную связь между зависимыми и независимыми переменными. Это алгоритм обучения с учителем, который помогает установить линейную связь между двумя переменными. Один из них является предиктором (независимой переменной), а другой - ответом (зависимой переменной). Линейная регрессия направлена на понимание того, как зависимая переменная изменяется по отношению к независимой переменной. Если есть только одна независимая переменная, то это называется простой линейной регрессией, а если существует более одной независимой переменной, то это называется множественной линейной регрессией.

Но что же такое обычная регрессия?
**Регрессия** - зависимость среднего значения одной случайной величины от некотрой другой (или от нескольких случайных величин)


В этой статье мы рассмотрим линейную регрессию. Это означает, что семейство функций, из которых мы выбираем, представляет собой линейную комбинацию наперед заданных базисных функций fi
![](https://i.imgur.com/3sjz9To.png)


**Цель регрессии** — найти коэффициенты этой линейной комбинации, и тем самым определить регрессионную функцию f (которую также называют моделью). .

Регрессия с нами уже давно: впервые метод опубликовал Лежандр в 1805 году, хотя Гаусс пришел к нему раньше и успешно использовал для предсказания орбиты «кометы» (на самом деле карликовой планеты) Цереры. Существует множество вариантов и обобщений линейной регрессии: LAD, метод наименьших квадратов, Ridge регрессия, Lasso регрессия, ElasticNet и многие другие.

**Когда вам нужна регрессия?**
Регрессия полезна для прогнозирования ответа на новые условия. Можно угадать потребление электроэнергии в жилом доме из данных температуры, времени суток и количества жильцов.

**Где она вообще нужна?**
Регрессия используется во многих отраслях: экономика, компьютерные и социальные науки, прочее. Её важность растёт с доступностью больших данных.

Примеры использования:
* движения тел по инерции
* экономический расчёт, ценообразование
* тепловое удлинение рельс 

**Пример кода реализации:**
```
from sklearn.linear_model import LinearRegression
model = LinearRegression() - берём нашу модель
model.fit(x,y) - обучаем, где X - обучаемый набор, а y - желаемый результат
model.coef_ - смотрим на коэфициент (в формуле как раз и а), например: это значит,что на каждый наш потраченный доллар,мы получили 3 доллара
model.score(X,y) - коэф. точности в интервале от 0 до 1
model.predict([[200000000]]) - предсказывает зарабаток,если вложили 200млн$
```

Дополнительно:
**Математическим языком**
Есть три сходных между собой понятия, три сестры: интерполяция, аппроксимация и регрессия.
У них общая цель: из семейства функций выбрать ту, которая обладает определенным свойством.

**Интерполяция** — способ выбрать из семейства функций ту, которая проходит через заданные точки. Часто функцию затем используют для вычисления в промежуточных точках. Например, мы вручную задаем цвет нескольким точкам и хотим чтобы цвета остальных точек образовали плавные переходы между заданными. Или задаем ключевые кадры анимации и хотим плавные переходы между ними. Классические примеры: интерполяция полиномами Лагранжа, сплайн-интерполяция, многомерная интерполяция (билинейная, трилинейная, методом ближайшего соседа и т.д). Есть также родственное понятие экстраполяции — предсказание поведения функции вне интервала. Например, предсказание курса доллара на основании предыдущих колебаний — экстраполяция.

**Аппроксимация** — способ выбрать из семейства «простых» функций приближение для «сложной» функции на отрезке, при этом ошибка не должна превышать определенного предела. Аппроксимацию используют, когда нужно получить функцию, похожую на данную, но более удобную для вычислений и манипуляций (дифференцирования, интегрирования и т.п). При оптимизации критических участков кода часто используют аппроксимацию: если значение функции вычисляется много раз в секунду и не нужна абсолютная точность, то можно обойтись более простым аппроксимантом с меньшей «ценой» вычисления. Классические примеры включают ряд Тейлора на отрезке, аппроксимацию ортогональными многочленами, аппроксимацию Паде, аппроксимацию синуса Бхаскара и т.п.

**Регрессия** — способ выбрать из семейства функций ту, которая минимизирует функцию потерь. Последняя характеризует насколько сильно пробная функция отклоняется от значений в заданных точках. Если точки получены в эксперименте, они неизбежно содержат ошибку измерений, шум, поэтому разумнее требовать, чтобы функция передавала общую тенденцию, а не точно проходила через все точки. В каком-то смысле регрессия — это «интерполирующая аппроксимация»: мы хотим провести кривую как можно ближе к точкам и при этом сохранить ее максимально простой чтобы уловить общую тенденцию. За баланс между этими противоречивыми желаниями как-раз отвечает функция потерь (в английской литературе «loss function» или «cost function»).

---

**Часть 2. Ошибка методом наименьших квадратов (МНК)**
> [name=Aleksey Strakhov] а нужно ли это? пофиксить позже
**Часть 2. Ошибка методом наименьших квадратов (МНК)****Обучение линейной регрессии. Итерационный метод наименьших квадратов.**
Мы задали модель, теперь ее нужно обучить. Обучить - значит подобрать параметры так, чтобы ошибка была как можно меньше. Нужно задать и посчитать ошибку.

Много способов придумано для расчета ошибки, пожалуй самый распространенный из них это **метод наименьших квадратов** (МНК). 

В методе наименьших квадратов ищут такие параметры, которые дали бы наименьшее значение суммы квадратов расстояний выходов модели от заданных (указаний учителя) на заданных входах. Такая длинная и непонятная фраза, давайте посмотрим на одномерном примере.

Задано **P** примеров данных (синие точки): вход **х** и желаемый выход (указания учителя) **t**.

![img](https://i.imgur.com/00eXZks.png)

Если мы выбрали какие-то параметры **a** и **b**, то для любого входа **x** можем посчитать выход модели **y**. Как вы можете догадаться это будет прямая линия (зеленая).

В идеальном случае выход **y** для заданного входа **х** должен совпасть с указанием учителя **t** для этого же входа. А если не совпадает, то модель ошибается. Мы можем посчитать насколько именно ошибается модель (красная пунктирная линия). Ошибка это разница между тем что получилось и тем что должно было получиться на выходе e(x)=y(x)-t(x). Для каждого входа **х** эта ошибка своя, попытаемся уменьшить ее для одного входа - может увеличиться для другого. Надо сделать так, чтобы для всех входов сразу общая, суммарная, ошибка была как можно меньше. Но обратите внимание, что такая ошибка имеет знак. Если мы просто сложим ошибки разного знака (+5 и -5 например) то суммарная будет 0, но модель не угадает выходы: на одном она ошиблась в одну сторону (+5), на другом - в другую (-5). Поэтому нужно использовать не саму ошибку, а ее абсолютное значение, модуль. Модуль не очень приятная функция, она не дифференцируемая в нуле, лучше вместо модуля использовать квадрат модуля! А вот тут все прекрасно, квадрат модуля дифференцируемая функция, считается не так уж сложно и неотрицательна. Причем равняется нулю, только если аргумент равен нулю. 

Итак, будем использовать функцию ошибки: сумма по всем примерам **P** квадратов разности действительного выхода **y** и желаемого выхода **t** на входных примерах **x**. 


![img](https://i.imgur.com/hS5Pf4p.png)


Ради математической красоты можно поделить это на 2 и на P, но мы не будем, нас волнует не конкретное значение функции ошибки, а где находится ее минимум, а умножением и делением на константы мы положение минимума не меняем.

Мы явно не написали, но функция ошибки зависит от параметров модели. Почему? Потому что от них зависит выход **y**. Изменяя параметры модели можем найти такие, для которых ошибка будет наименьшей. Отсюда и название метода наименьших квадратов - функция ошибки это сумма квадратов чего-то там, и мы ищем наименьшее ее значение.

**Часть 3. Обучение линейной регрессии с помощью МНК**
Градиентный спуск.
Осталось найти параметры, для которых функция ошибки минимальна. Много разных методов есть для этого. 

И такой метод есть - это **градиентный спуск**, нет, лучше, **ГРАДИЕНТНЫЙ СПУСК**. Большие буквы заслужены, этот метод является основой основ машинного обучения, ему мы обязаны современными чудесными приложениями. Чтобы понять суть метода нужно вспомнить, что такое **производная**. 

Представьте, что вы стоите на горе с закрытыми глазами. Вам надо спуститься вниз. Вы не видите где этот низ расположен, но чувствуете, куда поверхность опускается, и можете понять, идти ли вам направо или налево, чтобы спускаться. Ах, вот если бы для функции, не видя ее графика, можно было понять, она увеличивается или уменьшается в конкретной точке. Но как раз это и показывает производная функции. Если производная больше нуля - функция возрастает, если меньше нуля - убывает, а если ноль - то не изменяется с ростом аргумента. Нам нужен минимум функции ошибки, значит двигаться надо в сторону ее убывания. Вы, стоя на горе, можете сделать маленький шаг в направлении низа, и мы можем немножко изменить параметр модели в том направлении, куда функция ошибки убывает. А потом еще раз, и еще раз, и еще. Дойдем до низа, производная станет равна нулю. Если перескочим (ну вот такие длинные шаги), сразу почувствуем что направление изменилось и низ с другой стороны, а производная изменит знак. 

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

Итак, в методе градиентного спуска мы считаем вектор градиента и изменяем вектор параметров в направлении антиградиента (т.е. "минус" градиента). Так делаем несколько раз *итеративно* (в цикле).
Пусть **t** - номер текущей итерации, **w(t)** - параметр модели, на этой итерации , **E(t)** - функция ошибки на этой итерации, зависящая от всех параметров, входов, и указаний учителя, тогда на следующей итерации **t+1** параметр в методе градиентного спуска задается как:

![img](https://i.imgur.com/YWmZhgt.png)


то есть новое значение параметра равно текущему значения *минус* производная функция ошибки по этому параметру умноженная на коэффициент **s**. Минус потому, что нужно в сторону уменьшения функции ошибки двигаться. Коэффициент **s** (вместе с величиной производной) определяет длину шага, как сильно мы изменяем параметр. Его задают вручную, но есть и методы для автоматического подбора шага. Для краткости называют его "шаг" обучения (learning rate).

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

**Часть 4. Реализация и пример использования линейной регрессии**

**Часть 5. Реализация итерационного способа обучения**

**Часть 6. Реализация не итерационного способа обучения в библиотеке sklearn**










--- 
