Матрица – это таблица из n × m (например, 3 × 3) чисел, заключенная в квадратные скобки. Мы можем складывать и вычитать матрицы одного размера, умножать одну матрицу на другую, если их измерения совместимы, и умножать всю матрицу на константу. Вектор - это матрица с одной строкой или столбцом. Основная идея заключается в том, что это двумерная сетка чисел.
В чем же отличие между матрицей и тензором? Последний часто рассматривается как обобщенная матрица, то есть это может быть одномерная матрица (вектор), трехмерная матрица (что-то вроде куба чисел), даже ноль-мерная матрица (одно число) или более высокая размерная структура, которую трудно визуализировать. Размерность тензора называется его рангом.
В приведенном ниже примере матрица инициализируется как набор рядов NumPy:
from numpy import array
A = array([[1, 2, 3], [4, 5, 6]])
print(A)
Отобразится матрица следующим образом:
[[1 2 3]
[4 5 6]]
Как и в случае с тензорами, мы можем выполнять поэлементные арифметические операции с матрицами.
from numpy import array
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
C = A + B
print(C)
Сложение сгенерирует такую матрицу C:
[[[ 2 4 6]
[ 8 10 12]
[14 16 18]]
[[22 24 26]
[28 30 32]
[34 36 38]]
[[42 44 46]
[48 50 52]
[54 56 58]]]
from numpy import array
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
D = A - B
print(D)
Вычитание – такую матрицу D:
[[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]
[0 0 0]]]
Поэлементное умножение одной матрицы на другую такой же размерности приводит к созданию новой матрицы такой же размерности. Такой частный случай перемножения с одноразмерными матрицами / тензорами называют произведением Адамара.
from numpy import array
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
E = A * B
print(E)
Такой код сгенерирует матрицу E, котора выглядит следующим образом:
[[[ 1 4 9]
[ 16 25 36]
[ 49 64 81]]
[[121 144 169]
[196 225 256]
[289 324 361]]
[[441 484 529]
[576 625 676]
[729 784 841]]]
Если же дана матриц A с q измерений и матрица B с r измерений, их произведение будет новой матрицей с q + r размерностями. Например:
from numpy import array
from numpy import tensordot
A = array([1, 2, 3])
B = array([3, 4])
F = tensordot(A, B, axes = 0)
print(F)
Результатом будет такая матрица F:
[[ 3 4]
[ 6 8]
[ 9 12]]
from numpy import array
A = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
B = array([
[[1,2,3], [4,5,6], [7,8,9]],
[[11,12,13], [14,15,16], [17,18,19]],
[[21,22,23], [24,25,26], [27,28,29]],
])
G = A / B
print(G)
Такое поэлементное деление одноразмерных матриц сгенерирует матрицу F:
[[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]
[[ 1. 1. 1.]
[ 1. 1. 1.]
[ 1. 1. 1.]]]
Матрицы используются в Машинном обучении (ML) повсеместно, но не только в обобщенном виде. Матрица ошибок (Confusion Matrix) дает нам целостное представление о том, насколько хорошо работает наша классификационная модель и какие ошибки она допускает:
О том, что означает каждая ячейка матрицы ошибок и как она работает, читайте в отдельной статье.
Фото: @ngbates
© Лена Капаца. Все права защищены.