Данная статья посвящена основе основ нейронауки — линейной алгебре. Если вы когда-либо планируйте изучать искусственные нейронные сети (и не только), то вам неоДанная статья посвящена основе основ нейронауки — линейной алгебре. Если вы когда-либо планируйте изучать искусственные нейронные сети (и не только), то вам нео

Линейная алгебра для нейросетей: векторы на практике

2026/03/12 13:14
17м. чтение
Для обратной связи или замечаний по поводу данного контента, свяжитесь с нами по адресу crypto.news@mexc.com
4992751a2b6914c731e179d49ce0c376.png

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

Материал рассчитан на новичка. Если вы знаете школьную математику, то сможете освоить и мой курс. В будущем я напишу статью о линейном представлении нейросетей, где мы адаптируем полученное знание под прикладные задачи, напишем некоторые слои на Python и построим настоящую модель!

Также недавно я написал большую статью о работе трансформера, где детально на примере NumPy-модели разбирается весь механизм работы от внимания до параллельного обучения и стабилизации. Если считаете, что готовы, то она ждет вас! Статья написана циклично от поверхностного разбора до реализации кода. Вы сами можете выбрать тот режим глубины, который нужен для ваших целей.

И все же опросы показали, что большинство читателей интересуют самые основы. Что и сподвигло меня написать этот курс. Я использовал наиболее понятный язык, красочные изображения и игровые примеры, ведь главное — это интуитивное понимание, а не бездумный расчет.

В этой статье:

  • Понятие вектора;

  • Векторизация данных;

  • Умножение на скаляр;

  • Сложение векторов;

  • Норма вектора;

  • Скалярное умножение;

  • Векторное умножение;

  • Практика с кодом;

  • Домашняя работа.

Приятно чтения!

Почему линейная алгебра?

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

Изображение Nvidia
Изображение Nvidia

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

Подробнее мы коснемся этого в следующих статьях, когда изучим основы ЛА.

Базовая единица линейной алгебры

Вектор — это математический объект, характеризующийся величиной и направлением и представленный в виде последовательности значений. Например:

a (2, 3, 4, 0, 8, ..., 7)

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

На самом деле у вектора нет четкого представления, так как это абстракция — воображаемый объект, созданный по неким критериям без четкой привязки к реальности. Мы сами решаем какой смысл вкладывать в его математику (описание, законы, операции). А поскольку мы занимаемся нейронными сетями, то постепенно придем к собственному пониманию вектора и линейной алгебры в целом, адаптировав ее законы под свои нужды. Скоро вы сами в этом убедитесь.

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

2bae420d2733fe783ed1e478d5a1875b.png

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

Теперь разберемся с содержимым вектора: что могут означать его компоненты в контексте науки о данных?

Математически они представляют из себя координаты в системе. Если речь идет о данных, то каждая координата в отдельной записи описывает некую характеристику/особенность (feature). То есть, в этом случае, наш вектор становится уже объектом, пребывающем в пространстве признаков:

Вектор

Наличие защиты

Максимальная температура

Мощность

...

Цена

0

0

85

4000

...

1800

1

1

250

3200

...

7850

2

1

95

4000

...

2300

3

0

95

6000

...

5500

...

...

...

...

...

...

n

1

105

2500

...

2340

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

Вокабуляр

0

1

2

3

...

n

Ананас

.24

.74

.15

.03

...

.90

Апельсин

.44

.87

.65

.32

...

.11

Арбуз

.12

.17

.33

.69

...

.31

...

...

...

...

...

...

...

Яблоко

.45

.38

.21

.80

...

.95

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

Давайте векторизуем храбрых героев в гипотетической игре:

b31c258932c5cb0fecddbb6b82e6a8cb.png

В данном примере:

  • Каждый вектор — это единая и неделимая сущность, представляющая конкретного персонажа (словно экземпляр класса в ООП);

  • Каждая компонента вектора — это конкретное значение характеристик в общем пространстве признаков, связанных друг с другом;

  • Единое пространство позволяет вычислить сложные взаимоотношения, как между отдельными характеристиками, так и между героями.

Иными словами, объекты, описанные в одной системе, не просто взаимосвязаны, но и могут действовать по общим правилам и взаимодействовать друг с другом. Обучив такую систему, мы могли бы создать идеальный баланс сил, понятную интерпретацию характеристик и заранее спрогнозировать поведение нестандартных элементов, например живых игроков!

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


Понять, что такое вектор не так уж и легко. Однако надеюсь, что теперь смысл его существования немного прояснился.

Операции с векторами

Далее практическая математика: описание операций с векторами и скалярами.

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

Умножение на скаляр:

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

96dd9ebf450a56e5a2bc2325e1e6cf53.pngПример TES
1904605a51d2255c71a15dbf804222d7.png

Для примера, мы можем использовать умножение на Скаляр, как буст характеристик героев. Пусть "Зелье могущества" улучшает все характеристики на 20%, а "Зелье божественной силы" увеличивает вдвое. Отсутствие отдыха может постепенно штрафовать статы, делая героев более слабыми.

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

Практика

Решите примеры:

a (10, 20, 12, 700) * 1.1 = (11, 22, 13.2, 770)
a (10, 20, 12, 700) * 0.5 = (5, 10, 6, 350)
a (5, 7) * 2 = (10, 14)
a (10, 20, 12, 700) * 0 = (0)
a (10, 20, 12, 700) * 1 = (10, 20, 12, 700)

Сложение векторов:

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

d613cd788145d35012a9c2309ea28389.png

Это также одна из основных операций. В машинном обучении ее можно встретить при сдвиге весов (bias), как обучаемый параметр.

Пример TES

Мы можем причислять вектора не только героям, но и различным модификаторам, например заклинаниям, ядам или зельям.

1935e3328d8dce07c46b40bf0979051b.png

Пусть вектор "Зелья силы" изменит конкретно данную характеристику, "Зелье война" будет накладывать комплексный бафф, а "Яд паралича" оказывать разное отрицательное воздействие на все характеристики.

Практика

Решите примеры:

a (180, 240, 360, 0) + b (-40, -450, 5, 800) = c (140, -210, 365, 800)
a (11, 0, 97, 5) + b (-33, 22, -75, -27) = c (-22, -22, 22, -22)
a (0, 1, 0, 1, 0, 1) + b (-1, -3, -3, -5, -5, -7) = c (-1, -2, -3, -4, -5, -6)
a (48, 660, 31, 11) + b (-6, 6, 2, 2) = c (42, 666, 33, 13)
a (0, -4, 3, 11, -88, -58) + b (1, 6, 0, -6, 96, 71) = c (1, 2, 3, 5, 8, 13)

a (0, 1, 2, 3, 4) + b (7, 5, 0, 4, 8) * 3 = c (21, 16, 2, 15, 28)
a (0, 1, 2, 3, 4) + b (0, 1, 3, 4) * 5 = неопределенность
a (4, 6, 8, 9) * 7 + b (8, 2, 6, 3) * 9 = c (100, 60, 110, 90)

a (0, 4, 0, 1) * 7 + b (4, 19, 16, 35) * 0 + c (10, -18, 10, 3) = d (10, 10, 10, 10)
( a (1, 4, 2, 1) * 4 + b (4, 19, 16, 35) ) * 3 = c (24, 105, 72, 117)
( a (1, 2, 3, 2) * 3 + b (11, 7, 3, 2) * 2 ) * 2 = c (50, 40, 30, 20)

Норма:

Это числовая характеристика вектора, которая обобщает понятие модуля. Простейший случай — Евклидова норма, характеризующая длину вектора, то есть расстояние от начала координат до заданной точки.

||x||2 = sqrt(x1**2 + x2**2 + ... + xn**2)

fa2135dfcea90794b024bd2d077f1e7a.png

Есть и другие нормы, например Манхэттенское расстояние, которое иначе характеризует величину вектора и определяется как сумма модулей его компонент:

||x||1 = E |xi| (i=1, n) = |x1| + |x2| + ... + |xn|

Бесконечная норма равна модулю самой большой компоненты:

||x|| = max(x)

Пример TES

Норма позволит выяснить общий уровень развития персонажа.

45ce061dcf28caee2551424d5cce9574.png

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

Практика

Вычислите евклидову норму для следующих векторов:

|| a (4, 3) || = 5
|| b (5, 12) || = 13
|| c (4, 7, 0, 4) || = 9

Вычислите манхэттенское расстояние:

|| a (1, 88, 3, 9) || = 101
|| b (5, -7, 15, 13) || = 40
|| c (79, -9, 21, -1) || = 110

Узнайте бесконечную норму векторов:

|| a (11, 88, 75, 900) || = 900
|| b (51, -47, -56, 49) || = 56
|| c (7, 0, 9, 11, -10, 11) || = 11

Скалярное произведение векторов:

Это умножение векторов, результатом которого является скаляр. На практике оно показывает взаимную направленность векторов. Результат произведения равен 0, если вектора перпендикулярны и достигает максимума при их коллинеарности.

01ce74c96a8b687637b3ea826992a529.png

Если нормировать скалярное произведение, то можно более точно определить направление векторов.

p_norm = a * b / (|a| * |b|):

  • Ортогональны при p_norm = 0;

  • Острый угол при p_norm (0, 1);

  • Сонаправлены при p_norm = 1;

  • Тупой угол при p_norm (0, -1);

  • Противоположны при p_norm = -1.

Пример TES

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

d9ca9b3e9800098348b3cf8c3916f802.png

Нормирование помогает заключить результат в рамки. Чем ближе норма к 1, тем более похожи характеристики героев. Соответственно, чем ближе произведение к нулю, тем более они различаются, вплоть до ортогональности — полного отсутствия пересечений.

Скрытый текст

Решите примеры:

a (7, 1, 12, 0, -3, -5) * b (0, 1, 4, 2, 6, 3) = 16
a (200, 0, 0, 0) * b (0, 123, 70000, 4096) = 0
a (22, 34, 8, 17) * b (-1, 23, 2000) = неопределенность

Что вы можете сказать навскидку о сонаправленности следующих векторов, не прибегая к их скалярному умножению?

1) a (35, 12, 4) b (23, 17, 1)
2) a (1, 0, 0) b (0, 1, 16)
3) a (3, 3, 3) b (-2, -2, -2)
4) a (3, 3, 3) b (-2, 0, -2)

Вычислите нормированное скалярное произведение векторов:

a = (3, 9, 3, 0, 8, 2, 0, 4, 2)
b = (7, 2, 3, 7, 4, 6, 0, 2, 6)
c = (5, 8, 1, 7, 2, 9, 0, 2, 3)

a * b / (||a|| * ||b||) = 0.5748
a * c / (||a|| * ||c||) = 0.6555
b * c / (||b|| * ||c||) = 0.8525

Векторное произведение векторов:

В трехмерном пространстве результатом такого произведения является вектор ортогональный плоскости множителей, направление которого можно определить по правилу правой руки. Его длина будет равна произведению умножаемого вектора на перпендикуляр, опущенный от второго вектора. Или, в геометрическом смысле, произведению длин векторов на синус угла.

53b045520f111efa83e44bdb8b79b23b.png

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

3d5c2c738ac6e0bb278ef90521fc861b.png

Это экзотическое умножение, которое часто используют в физике, например для определения силы Лоренца. Сила Лоренца, магнитная индукция и движение частицы — это векторные величины, которые достигают своего пика, если ортогональны друг другу.

Пример TES

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

Тогда умножение их векторов, будет тем больше, чем более различны их направления и достигнет своего пика при ортогональности героев (отсутствия пересечения). Сам вектор в таком случае, скорее всего, будет иметь отрицательные компоненты, что трудно интерпретировать. Однако, его норма покажет нам суммарную силу группы, привязанную к конкретным векторам (в отличии от скалярного умножения, привязанного лишь к направлению).

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

Практика

Ну и куда же без программирования... Давайте отработает все изученные операции в Python.

Мы не будем изучать специфические модули для линейной алгебры, а используем один из основных модулей языка — Numpy. Также в конце вас ждет домашнее задание и ссылка на мой учебный репозиторий, где собран весь нужный код, который можно использовать как шпаргалку.

Импортируем модуль:

import numpy as np from numpy.linalg import norm

Создаем списки векторов, с которыми будем работать:

# Списки сущностей: names = { 0: "Элерон'Таз", 1: "Чилит-в-Глубинах", 2: "Ротгарн Стопа", 3: "Ульфгард Золотая Струя", 4: "Мурка", 5: "Красная машина", 6: "Носит-под-Гузник", 7: "Куремар", } vec_list = np.array([ [3, 9, 3, 0, 8, 2, 0, 4, 2], # Элерон'Таз [2, 7, 4, 9, 8, 3, 0, 5, 4], # Чилит-в-Глубинах [9, 3, 2, 0, 1, 8, 0, 5, 9], # Ротгарн Стопа [7, 2, 3, 7, 4, 6, 0, 2, 6], # Ульфгард Золотая Струя [5, 8, 1, 7, 2, 9, 0, 2, 3], # Мурка [25, 10, 10, 0, 20, 30, 0, 0, 15], # Красная машина [3, 3, 3, 3, 3, 3, 3, 3, 3], # Носит-под-Гузник [1, 3, 9, 5, 1, 1, 0, 9, 1], # Куремар ]) mods = [ 2.0, # Зелье божественной силы 1.2, # Зелье могущества 0.5, # Сонливость ] potions = np.array([ [3, 0, 0, 0, 0, 0, 0, 0, 0], # Зелье силы [2, 1, 0, 0, 0, 1, 0, 1, 1], # Зелье война [-2, -1, 0, 0, 0, 0, 4, 0, -1], # Яд паралича [0, 0, 3, 0, 0, 0, 0, 0, -1], # Зелье ученого [1, 1, -1, 0, 0, 3, 0, 0, 1], # Скама [0, 0, -2, -1, -1, 0, 0, 0, 1], # Яд безумия [-2, 0, 0, 3, 1, 0, 0, -2, 0], # Зелье красноречия ]) diseases = np.array([ [-2, -2, -2, 0, -1, -3, 0, 1, 0], # Простуда [1, 0, -1, -1, -1, 3, 9, 0, 0], # Каменная хворь [-3, -1, 0, 1, -5, 0, 0, 3, 0], # Чума ])

# Таблица героев: print(f'{'Имя:':<25} {'Очки навыков:':<15} {'Мощь:':<10}') for i in range(len(vec_list)): points = norm(vec_list[i], ord=1) power = round(norm(vec_list[i], ord=2), 2) print(f'{names[i]:<25} {points:<15} {power:<10}')


Далее будут показаны примеры основных операций.

Умножение на скаляр:

result = vec_list[0] * mods[1] print(f"{vec_list[0]} * 1.3 = {result}")

[3 9 3 0 8 2 0 4 2] * 1.3 = [ 3.6 10.8 3.6 0. 9.6 2.4 0. 4.8 2.4]

Сложение векторов:

result = vec_list[0] + potions[0] print(f"{vec_list[0]} + {potions[0]} = {result}")

[3 9 3 0 8 2 0 4 2] + [3 0 0 0 0 0 0 0 0] = [6 9 3 0 8 2 0 4 2]

Норма вектора:

result = round(np.linalg.norm(vec_list[0], ord=2), 2) print(f"{vec_list[0]} + {potions[0]} = {result}")

[3 9 3 0 8 2 0 4 2] + [3 0 0 0 0 0 0 0 0] = 13.67

Скалярное произведение векторов:

p_norm1_0 = norm(vec_list[0], ord=2) p_norm1_1 = norm(vec_list[1], ord=2) result = vec_list[0] @ vec_list[1] / (p_norm1_0 * p_norm1_1) result = round(result, 2) print(f"{vec_list[0]} * {vec_list[1]} = {result}")

[3 9 3 0 8 2 0 4 2] * [2 7 4 9 8 3 0 5 4] = 0.81

Векторное произведение векторов:

a = vec_list[0][:3] b = vec_list[1][:3] result = np.cross(a, b) print(f"{a} * {b} = {result}")

[3 9 3] * [2 7 4] = [15 -6 3]

Это все основные операции.

Домашняя работа

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

Задание 1. Магический эксперимент.

bc50608a01edc5d369629d7965011539.png

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

# Вводные: kuremar = vec_list[7].copy() sleepiness = mods[2] print(kuremar)

[1 3 9 5 1 1 0 9 1]

Задание 2. Вызов на бой.

8128263545359384c384b695c3e31d4d.png

Носит-под-Гузник мечтает одолеть Красную машину в бою. Помогите ему в этом.
Наложите нужные модификаторы (mods, potions, diseases) на воинов так, чтобы евклидова норма вектора аутсайдера стала выше чем у противника.
Можно применить лишь по одному модификатору из каждого списка на одного героя.

# Вводные: nappy = vec_list[6].copy() red_machine = vec_list[5].copy() print(nappy, red_machine)

[3 3 3 3 3 3 3 3 3] [25 10 10 0 20 30 0 0 15]

Задание 3. Тест на совместимость.

8b845a35da1fbd7194fab79188c8b4b0.png

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

# Вводные: murka = vec_list[4].copy() print(murka)

[5 8 1 7 2 9 0 2 3]

Задание 4. Арена.

360804b2db2c3adf8e23d1f4dc95b3b3.png

Настало время финальной битвы!

Герои прибыли на знаменитую арену и разбились на команды. Все, кроме Красной машины, которого оштрафовали за слишком высокий параметр дерзости (его вектор = [-1, -1, -1]). Перед тем как начнется битва, участникам предстоит сразиться с великаном, мощь которого равна 60. Те, кто одолеет испытание, пройдут в финальный раунд.

Разъяснение. Используя векторное умножение и евклидову норму, найдите все возможные пары героев и их суммарную мощь. Отсейте тех, кто не набрал 60 очков (x > 60). Выясните, количество уникальных пар, прошедших в финал, а также, какая команда станет победителем соревнования.

Подведите итоги, сделав информативную статистику:

  1. Основные итоги. Выведите топ уникальных пар, прошедших в финал в порядке убывания;

  2. Аутсайдеры. Отдельным списком выведите тех, кто не прошел в финал ни в одной из команд;

  3. Линый результат. Для каждого героя найдите сумму очков всех команд в которых он принимал участие. Выведите личный вклад героев (включая аутсайдеров) в порядке убывания.

Веди нас, Неревар!

# Вводные: vec_short_list = vec_list[:, :3].copy() vec_short_list[5] = [-1, -1, -1] threshold = norm([60, 0, 0], ord=2) print(f"Мощь великана: {threshold}\n") print(f"Таблица героев") print(f'{'Имя:':<25}{'Сила:':<15}{'Ловкость:':<15}{'Интеллект:':<15}') for i, row in enumerate(vec_short_list): print(f'{names[i]:<25}{row[0]:<15}{row[1]:<15}{row[2]:<15}')

Таблица героев:

Имя

Сила

Ловкость

Интеллект

Элерон'Таз

3

9

3

Чилит-в-Глубинах

2

7

4

Ротгарн Стопа

9

3

2

Ульфгард Золотая Струя

7

2

3

Мурка

5

8

1

Красная машина

-1

-1

-1

Носит-под-Гузник

3

3

3

Куремар

1

3

9

Послесловие

Весь код можно будет найти в учебном репозитории на GitHub.

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

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


Изображения подготовлены мною в программах Krita и GoogleSheets.

Учебный репозиторий: https://github.com/MaxKuzmenko/linear-algebra

Трансформер своими руками: https://habr.com/ru/articles/982268/

Источник

Возможности рынка
Логотип Mintlayer
Mintlayer Курс (ML)
$0.00696
$0.00696$0.00696
-0.57%
USD
График цены Mintlayer (ML) в реальном времени
Отказ от ответственности: Статьи, размещенные на этом веб-сайте, взяты из общедоступных источников и предоставляются исключительно в информационных целях. Они не обязательно отражают точку зрения MEXC. Все права принадлежат первоисточникам. Если вы считаете, что какой-либо контент нарушает права третьих лиц, пожалуйста, обратитесь по адресу crypto.news@mexc.com для его удаления. MEXC не дает никаких гарантий в отношении точности, полноты или своевременности контента и не несет ответственности за любые действия, предпринятые на основе предоставленной информации. Контент не является финансовой, юридической или иной профессиональной консультацией и не должен рассматриваться как рекомендация или одобрение со стороны MEXC.