Все курсы > Вводный курс > Занятие 12
Ещё на первом занятии мы упомянули, что в уравнении может быть несколько независимых переменных.
$$y = w_1 \times x_1 + w_2 \times x_2 + w_0 $$
Такое уравнение нельзя изобразить на координатной плоскости (имеющей два измерения, x и y), потому что в нем три переменных, а значит три измерения. Нужен график, имеющий три плоскости.
С помощью этого графика мы можем представить зависимость обхвата шеи не только от роста, но и, например, от веса.

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

Если взять несколько точек и соответственно несколько векторов,

то получится набор чисел, называемых матрицей.

Из сказанного выше очевидно, что любой вектор — не что иное как матрица, в которой один столбец или одна строка.
Область математики, изучающая векторы и матрицы, называется линейной алгеброй.
На этом занятии мы рассмотрим два аспекта векторных и матричных вычислений. Во-первых, посмотрим на удобный способ умножения одного вектора на другой. Во-вторых, посмотрим как мы можем рассчитать угол между двумя векторами.
Умножение векторов
Вспомним, как мы делали прогноз с помощью нашей модели. Мы умножали вес (наклон) на значение независимой переменной и прибавляли ошибку (сдвиг). Когда у нас несколько независимых переменных и несколько весов, нам нужно их попарно перемножить и сложить произведения.
Если представить и веса, и значения независимых переменных с помощью векторов, то можно воспользоваться инструментом, который называется скалярным произведением векторов (dot product), чтобы получить прогнозное

Работа над ошибками. На видео представлена иная схема расположения векторов (см. скриншот ниже), а именно вектор-столбец весов мы умножаем на вектор-строку данных.

Результат вычислений от этого не меняется, однако исправленное положение векторов математически более точное.
Как мы узнаем на следующем курсе, перемножать можно не только векторы, но и матрицы. При этом при нахождении произведения двух матриц мы умножаем строки первой матрицы на столбцы второй. И здесь положение множителей будет иметь значение для вычисления конечного результата.
Поэтому и векторы, которые являются частным случаем матрицы с одной строкой или одним столбцом, правильнее расположить именно таким образом.
Добавлю, что если вы не вполне поняли, что это значит, ничего страшного, на следующем курсе мы во всем разберемся.
Скалярное произведение векторов на Питоне
На Питоне это реализовано с помощью библиотеки Numpy. До сих пор мы создавали массивы Numpy в, скажем так, служебных целях, чтобы использовать их, например, в моделях Scikit-learn.
Сегодня рассмотрим эти массивы сами по себе. По сути, массив Numpy (Numpy array), это и есть вектор или матрица. Давайте посмотрим, как создать такой массив, и как перемножить два вектора.
Вначале откроем ноутбук к этому занятию⧉
Вначале разберемся с основами работы с массивами.
1 2 3 4 5 6 7 8 |
import numpy as np # предположим мы записали наши данные # роста, веса и обхвата шеи одного человека в список data = [1.72, 54, 36.2] # убедимся, что это список с помощью функции type() type(data) |
1 |
list |
1 2 3 |
# преобразуем список в массив Numpy data_Numpy = np.array(data) data_Numpy |
1 |
array([ 1.72, 54. , 36.2 ]) |
1 2 3 4 |
# если у нас несколько наблюдений, то нужна матрица, т.е. # по сути, несколько векторов data_matrix = np.array([[1.72, 54, 36.2], [1.74, 58, 36.3], [1.68, 52, 32.9]]) data_matrix |
1 2 3 |
array([[ 1.72, 54. , 36.2 ], [ 1.74, 58. , 36.3 ], [ 1.68, 52. , 32.9 ]]) |
1 2 |
# мы можем посмотреть размерность матрицы (количество строк и столбцов) data_matrix.shape |
1 |
(3, 3) |
Теперь мы готовы умножить один вектор на другой.
1 2 3 4 5 6 7 |
# даны два вектора в виде массивов Numpy a = np.array([1.72, 54]) # вектор данных w = np.array([19.86, 0.05]) # вектор весов # перемножим их вручную 1.72 * 19.86 + 54 * 0.05 |
1 |
36.8592 |
1 2 |
# используем скалярное произведение векторов np.dot(a, w) |
1 |
36.8592 |
Именно благодаря скалярному произведению векторов компьютер так эффективно перемножает веса и данные и минимизирует функцию потерь.
Теперь посмотрим на угол между векторами.
Угол между векторами
Представление данных в форме вектора имеет ещё одно полезное свойство. Мы можем измерить близость двух векторов или угол между ними. Чем угол меньше, тем они ближе.

Посмотрим на формулу.
$$ \cos(\theta )={\mathbf {b} \cdot \mathbf {c} \over \|\mathbf {b} \|\|\mathbf {c} \|} $$
В этой формуле мы умножаем один вектор на другой и делим на произведение их длин. Результатом будет косинус угла θ между ними. Зная косинус, мы можем найти сам угол в градусах.
Косинусное сходство с помощью Питона
В первую очередь найдем косинус угла по формуле, приведенной выше.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# даны два вектора (данные двух человек) # нам нужно понять, насколько они схожи b = np.array([1.72, 54, 36.2]) c = np.array([1.56, 47, 30.0]) # вначале выполним операции в числителе формулы numerator = np.dot(b, c) # теперь займемся знаменателем и # (1) рассчитаем длины (по большому счету, это теорема Пифагора) bLen = np.linalg.norm(b) cLen = np.linalg.norm(c) # (2) перемножим их denominator = bLen * cLen # посмотрим, чему равен косинус угла между векторами cosine = numerator/denominator cosine |
1 |
0.9997468709497721 |
Теперь рассчитаем угол в градусах
1 2 3 4 5 6 |
# для этого вначале вычислим угол в радианах angle_radians = np.arccos(cosine) # затем в градусах angle_degrees = angle_radians * 360/2/np.pi angle_degrees |
1 |
1.2891925481394304 |
Как мы видим угол чрезвычайно мал, а значит векторы очень близки друг к другу.
Мы будем на практике применять косинусное сходство или близость векторов, например, при построении рекомендательных систем для сопутствующих товаров в интернет-магазине. Когда вы покупаете, например, холодильник, то микроволновую печь вам рекомендуют именно потому, что вектор ваших покупок очень близок к вектору покупок тех, кто купил микроволновку.
Подведем итог
На этом занятии мы узнали, что данные можно представить в виде вектора и матрицы. Это создает новые возможности для вычислений и преобразования данных.
В частности, мы посмотрели на то, как умножить один вектор на другой через скалярное произведение векторов, а также научились вычислять косинусное сходство между двумя векторами.
Вопросы для закрепления
Какие два вектора мы перемножаем для того, чтобы сделать прогноз?
Посмотреть правильный ответ
Ответ: вектор весов и вектор данных (ну и еще прибавляем ошибку).
Какое расстояние (сходство) помогает определить близость векторов?
Посмотреть правильный ответ
Ответ: косинусное расстояние
Дополнительные упражнения⧉ вы найдете в конце ноутбука.
Последний штрих
Прежде чем перейти к построению моделей остается последний штрих: научиться разделять данные, на которых мы будем обучать модель.