На этом занятии
рассмотрим основные математические функции при работе с тензорами пакета PyTorch.
Методы sum, mean, min и max
Итак, очень часто на
практике требуется вычислять сумму значений элементов тензоров, их среднее
значение, а также находить минимальные и максимальные значения. Для этих целей
в PyTorch существуют встроенные методы
тензоров, выполняющие эти действия, и сейчас мы посмотрим, как они работают.
Пусть имеется одномерный тензор:
a = torch.FloatTensor([ 1, 2, 3, 10, 20, 30])
Вычислим сумму, среднее
значение и найдем максимальное и минимальное значения:
a.sum() # tensor(66.)
a.mean() # tensor(11.)
a.max() # tensor(30.)
a.min() # tensor(1.)
Как видите, все
достаточно просто. Аналогичным образом все эти методы работают и с многомерными
массивами:
a = a.view(3, 2) # тензор формы 3x2
a.sum() # tensor(66.)
Но, если требуется
вычислить сумму только по какой-то одной оси, то ее можно явно указать
дополнительным параметром:
a.sum(dim=0) # array([24, 42])
a.sum(dim=1) # array([ 3, 13, 50])
a.mean(dim=0) # tensor([ 8., 14.])
Похожим образом работают
и остальные два метода:
получим:
torch.return_types.max(values=tensor([ 2., 10., 30.]), indices=tensor([1, 1, 1]))
То есть, здесь
возвращается последовательность из двух элементов. Чтобы выделить только
максимальные значения нужно дополнительно указать атрибут values:
a.max(dim=1).values # tensor([ 2., 10., 30.])
Либо воспользоваться
аналогичными методами, предназначенными для многомерных тензоров:
a.amax(dim=1) # tensor([ 2., 10., 30.])
a.amin(dim=0) # tensor([1., 2.])
Базовые математические функции
Все те же самые
операции и многие другие можно выполнять через функции пакета PyTorch,
а не через методы тензоров. Вот список основных из них:
Название
|
Описание
|
torch.abs(x)
|
вычисление модуля от элементов тензора x.
|
torch.amax(x)
|
нахождение
максимального значения в тензоре x
|
torch.amin(x)
|
нахождение
минимального значения в тензоре x
|
torch.argmax(x)
|
нахождение индекса максимального значения для x
|
torch.argmin(x)
|
нахождение индекса минимального значения для x
|
torch.round(x)
|
округление до ближайшего целого
|
torch.mean(x)
|
вычисление среднего значения
|
torch.log(x)
|
вычисление натурального логарифма
|
torch.log2(x)
|
вычисление логарифма по основанию 2
|
torch.log10(x)
|
вычисление логарифма по основанию 10
|
Предположим, имеется тензор:
a = torch.IntTensor([-1, 1, 5, -44, 32, 2])
Тогда для вычисления
модулей значений его элементов можно записать команду:
torch.abs(a) # array([ 1, 1, 5, 44, 32, 2])
На выходе получаем
новый массив с абсолютными величинами. Или, если необходимо изменить значения
текущего тензора, то можно вызвать метод:
a.abs_() # tensor([ 1, 1, 5, 44, 32, 2])
Остальные функции
работают по аналогии, например:
torch.amax(a) # tensor(32)
torch.log(a) # tensor([ nan, 0.0000, 1.6094, nan, 3.4657, 0.6931])
torch.round(a) # tensor([ -1, 1, 5, -44, 32, 2])
Функции, применяемые
поэлементно к тензору, как правило, имеют inplace
аналоги. Например:
a = a.float()
a.log_()
a = torch.FloatTensor([-1, 1, 5, -44, 32, 2])
a.round_()
И так со всеми
остальными функциями и методами.
Тригонометрические функции и методы
Следующий набор часто
используемых методов (и функций) связаны с различными тригонометрическими
функциями. Наиболее употребительные из них приведены в следующей таблице:
Название
|
Описание
|
torch.sin(x)
x.sin()
x.sin_()
|
поэлементное вычисление синуса от тензора x
|
torch.cos(x)
x.cos()
x.cos_()
|
поэлементное вычисление косинуса от тензора x
|
torch.tan(x)
x.tan()
x.tan_()
|
поэлементное вычисление тангенса от тензора x
|
torch.arccos(x)
|
вычисление арккосинуса
|
torch.arcsin(x)
|
вычисление арксинуса
|
torch.arctan(x)
|
вычисление арктангенса
|
Пусть для примера объявлен
следующий тензор:
a = torch.linspace(0, torch.pi, 10)
С ним возможны
следующие команды:
r = np.sin(a) # возвращает тензор синусов углов для каждого значения
a.cos() # возвращает тензор косинусов углов
a.tan_() # изменяет текущий тензор на тангенсы углов
И так со всеми
тригонометрическими методами и функциями.
Функции математической статистики
Последняя группа
общематематических функций, которую мы рассмотрим на этом занятии, отвечает за
вычисления статистических характеристик случайных величин. Основные
из них, следующие:
Название
|
Описание
|
torch.median(x)
x.median()
|
вычисление медианы тензора x
|
torch.var(x)
x.var()
|
вычисление дисперсии значений тензора x
|
torch.std(x)
x.std()
|
вычисление стандартного отклонения значений тензора x
|
torch.corrcoef(x)
x.corrcoef()
|
вычисление линейного коэффициента корреляции Пирсона
|
torch.cov(x)
x.cov()
|
вычисление ковариации
|
Рассмотрим работу этих
функций. Предположим, имеются следующие тензоры:
x = torch.FloatTensor([1, 4, 3, 7, 10, 8, 14, 21, 20, 23])
y = torch.FloatTensor([4, 1, 6, 9, 13, 11, 16, 19, 15, 22])
Эти числа будем
воспринимать как реализации случайных величин X и Y. Тогда, для вычисления
медианы СВ X, можно воспользоваться функцией:
torch.median(x) # tensor(8.)
Для расчета дисперсии и
СКО, например, методами:
x.var() # tensor(63.6556)
y.std() # tensor(6.7032)
Далее, чтобы рассчитать
коэффициент корреляции Пирсона, объединим массивы x и y в единый тензор:
XY = torch.vstack([x, y]) # каждый тензор в отдельной строке
Тензор XY
примет
вид:
tensor([[
1., 4., 3., 7., 10., 8., 14., 21., 20., 23.],
[ 4., 1.,
6., 9., 13., 11., 16., 19., 15., 22.]])
И выполним функцию:
Результатом будет тензор
2x2:
tensor([[1.0000, 0.9316],
[0.9316, 1.0000]])
Как ее следует
интерпретировать? В действительности, это автокорреляционная матрица вектора СВ
[X, Y]:
(В этой формуле
полагается, что СВX и Y
центрированы, то есть имеют нулевое математическое ожидание).
Если нужно вычислить не
нормированное МО, то есть, автоковариационную матрицу, то следует
воспользоваться функцией:
torch.cov(XY) # ковариационная матрица размерностью 2x2
Получим:
tensor([[63.6556,
49.8222],
[49.8222,
44.9333]])
Конечно, мы рассмотрели
далеко не все математические функции тензоров PyTorch.
На следующем занятии продолжим эту тему и поговорим об умножении векторов,
матриц и линейной алгебре.