Недавно я изучал поле Машина Обучение ; Честно говоря, мне пришлось переучить почти все свои математические основы. Прошло много времени с тех пор, как колледж и ML основаны на большом количестве линейной алгебры. В этом блоге я планирую курировать основы наряду с моей реализацией их в JavaScript. Я знаю Python’s Numpy Библиотека – это отраслевой стандарт, но мне всегда было любопытно, как будут переведены основные операции в JavaScript. Полное раскрытие, я просто изучаю это сам, поэтому, если на этом пути есть какие -либо ошибки, помогите мне!
Темы включают:
- Основы линейной алгебры
- Матрица Операции
- Типы матриц
- Сложные математические выражения
Я также собрал приложение Nodejs, которое содержит рабочую версию всех примеров в этом блоге: ML Основы 1
Начнем ~!
Основы линейной алгебры
Линейная алгебра – это подмножество алгебры, которая занимается скалярами, векторами и матрицами. В простых терминах, вот что они есть:
Матрица
Мне нравится думать о матрице как о массиве или массиве массивов в программировании. Где m количество рядов и n количество столбцов A Матрица [M] [n] . Если бы мы кодировали, это выглядело бы примерно так:
const matrix = [ [0, 1], [2, 3], [3, 4] ];
Вектор
Вектор – это просто тип матрицы и, в частности, имеет только один столбец. Поэтому это выглядело бы примерно так:
const vector = [ [0], [1], [2], ];
Скаляр
Вероятно, самый простой математический объект во всей линейной алгебре – скаляр. Это всего лишь число, которое часто используется в качестве множителя.
const scalar = 2;
Большинство матриц и векторов могут быть выражены с массивами в JavaScript или любом языке. Но как насчет матриц, которые являются 3D или 4D или XD? Как правило, большинство линейных курсов алгебры утверждают, что матрица может иметь x Размеры, где x это число больше 0. Здесь мы начинаем использовать идею тензоров в программировании, где векторы по существу ранжированы, чтобы соответствовать различным измерениям. На самом деле, у JavaScript есть структура, называемая Tensorflow.js Это определяет и запускает вычисления с использованием тензоров. Я буду больше погружаться в это в будущем блоге. На данный момент давайте вернемся к основам.
Матрица Операции
Когда вы думаете о операциях матрицы, обычно мой разум прыгает на петли. Но использование петель для итерации матрицы может начать становиться очень уродливым очень быстро. Вот когда я обнаружил особенности Math.js Библиотека, которая предоставляет JS и Node.js проекты с мощными, оптимизированными вычислениями. Это означает, что вместо определения матрицы как массива массивов вы можете просто определить Матрица И это будет выглядеть примерно так с Math.js:
const matrix = math.matrix([[0,1], [2,3], [4,5]])
Некоторые полезные методы включают размер () и valueof () :
math.size(matrix) //returns dimensions of matrix //[3,2] matrix.valueOf() //returns string representation of the matrix //[[0,1], [2,3], [4,5]]
Давайте рассмотрим примеры четырех основных операций матрицы, таких как добавление, вычитание, умножение и разделение:
Матрица добавление
matA = math.matrix([[0, 1], [2, 3], [4, -5]]); matB = math.matrix([[1, -1], [-2, 4], [-7, 4]]); const matAdd = math.add(matA, matB); console.log(matAdd.valueOf()); //[ [ 1, 0 ], [ 0, 7 ], [ -3, -1 ] ]
Вычитание матрицы
matA = math.matrix([[0, 1], [2, 3], [4, -5]]); matB = math.matrix([[1, -1], [-2, 4], [-7, 4]]); const matSub = math.subtract(matA, matB); console.log(matSub.valueOf()); //[ [ -1, 2 ], [ 4, -1 ], [ 11, -9 ] ]
Умножение матрицы
Это когда все начинает становиться интересными. Прежде чем я перейду к примерам кодирования, важно понять эти два свойства умножения матрицы: коммутативное и ассоциативное.
Коммутативный
Умножение матрицы не является коммутативным, что просто означает x b x A. Давайте протестируем это и проверим с встроенными MathJS Равное компаратор:
matA = math.matrix([[0, 1], [2, 3]]); matB = math.matrix([[2, 4], [6, 2]]); const matAxB = math.multiply(matA, matB); const matBxA = math.multiply(matB, matA); console.log(math.equal(matAxB.valueOf(), matBxA.valueOf())); // false
Ассоциативный
Умножение матрицы является ассоциативным, что просто переводится на x (b x c) == (A x b) x C. Давайте также проверим это:
const matA = math.matrix([[0, 1], [2, 3], [4, 5]]); const matB = math.matrix([[2, 4], [6, 2]]); const matC = math.matrix([[5, 2], [2, -2]]); const matAxB_C = math.multiply(math.multiply(matA, matB), matC); const matA_BxC = math.multiply(matA, math.multiply(matB, matC)); console.log(math.equal(matAxB_C.valueOf(), matA_BxC.valueOf())); // true
Очень важно также отметить, что в случае с Math.js продукт матрицы – это не просто новая матрица, содержащая продукт отдельных матриц – элемент -продукт (или продукт Hardamard). На самом деле, продукт, который мы видим, является матричной работой продукта.
Примером элементного продукта является умение матрично-раскалы
matA = math.matrix([[0, 1], [2, 3], [4, -5]]); const scalar = 3; const matAx3 = math.multiply(matA, scalar); console.log(matAx3.valueOf()); //[ [ 0, 3 ], [ 6, 9 ], [ 12, -15 ] ]
Конечно, поскольку вектор-это просто матрица, также можно выполнить умножение матрицы-вектора:
matA = math.matrix([[0, 1], [2, 3], [4, 5]]); matB = math.matrix([[2], [1]]); const matAxvB = math.multiply(matA, matB); console.log(matAxvB.valueOf()); //[ [ 1 ], [ 7 ], [ 13 ] ]
Матричное подразделение
Матричное подразделение также возможно реализовать в JavaScript. Обратите внимание, что в математически нет «матричного деления», как это определено как таковое: -1 Однако, чтобы спасти нас от размышлений о подразделениях и конверсах, мы можем реализовать matdix.divide () в JS:
matA = math.matrix([[0, 2], [2, 4], [4, 6]]); matB = math.matrix([[2, 1], [2, 2]]); const matAB = math.divide(matA, matB); console.log(matAB.valueOf()); // [ [ -2, 2 ], [ -2, 3 ], [ -2, 4 ] ]
В конце концов, общение с матрицами в Math.js больше не так сложно! Но вы должны знать размеры каждой матрицы в вашей операции, потому что не каждая матрица работает «работает» на другой матрице!
Типы матриц
В линейной алгебре есть несколько типов матриц, которые также важно для понимания.
Единичная матрица
Матрица Identity (i) с измерением I * J определяется как I-димерная матрица, где i. Они особенные и широко используются, потому что они коммутативны; это означает x i x A. Вот пример матрицы личности:
const matrix = [ [1, 0, 0], [0, 1, 0], [0, 0, 1], ];
В Math.js вы можете использовать Глаз (i) Метод быстрого генерирования идентификационной матрицы с измерением I:
const matI_3 = math.eye(3); console.log(matA.valueOf()); // [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
Транспонированная матрица
В транспонированной матрице размеры перевернуты. Просто заявил, что ряды становятся столбцами, а столбцы становятся рядами, вот пример того, как взять вектор и транспонировать его. Транспонированная матрица называется вектором строки:
const matV = math.matrix([[0], [1], [2]]); const matV_T = math.transpose(matV); console.log(matV_T.valueOf()); // [ [ 0, 1, 2 ] ]
Обратная матрица
Конечно, важно обсудить обратную матрицу. Что интересно в этом, так это то, что матрицы могут иметь обратную A -1 Но не все матрицы (особенно единственные или вырожденные) имеют одну. Формула, чтобы найти обратную матрицу: a (a -1 ) = (A -1 ) а. Но Math.js дает нам обратную работу бесплатно как math.inv () Проверьте это:
matA = math.matrix([[0, 1], [2, 3]]); const matA_1 = math.inv(matA); console.log(matA_1.valueOf()); // [ [ -1.5, 0.5 ], [ 1, -0 ] ]
Сложные математические выражения
В какой -то момент использование встроенного в math.js предлагаемый способ больше не масштабируется. Давайте будем честными, ML очень быстро усложняется. Особенно, когда вы пытаетесь выполнить операции с несколькими функциями и использовать многомерную линейную регрессию с градиентным спусканием, также функция с несколькими входами. Возьмите следующую функцию Theta в качестве примера:
theta = theta - ALPHA / m * ((X * theta - y)^T * X)^T
Если вы попытаетесь представить это из коробки в JavaScript, вы получите подобный беспорядок:
theta = math.subtract(
theta,
math.multiply(
(ALPHA / m),
math.transpose(
math.multiply(
math.transpose(
math.subtract(
math.multiply(
X,
theta
),
y
)
),
X
)
)
)
);
Какой беспорядок правильно? К счастью, есть краткий и читаемый способ оценить его, используя eval Функция:
theta = math.eval(`theta - ALPHA / m * ((X * theta - y)' * X)'`, {
theta,
ALPHA,
m,
X,
y,
});
В шоке, что все это возможно с JavaScript? Ты не одинок! Независимо от языка кодирования, который вы используете сегодня, вы, несомненно, найдете мощную математическую библиотеку, такую как MathJS, чтобы обеспечить матрицу операции и другие сложные операции, чтобы вы начали с основателями ML! Я надеюсь, что это было полезно.
Если вы хотите поэкспериментировать с библиотекой Math.js самостоятельно, выполните проверку репозитория GitHub со всеми этими примерами, скомпилированными в приложении Nodejs: https://github.com/mrinasugosh/ml-fundamentals-1
=== = Следуйте за мной в социальных сетях ( @mrinasugosh ) ==== Dev.to: @mrinasugosh GitHub: @mrinasugosh Twitter: @mrinasugosh LinkedIn: @mrinasugosh
Оригинал: “https://dev.to/mrinasugosh/ml-fundamentals-in-javascript-5fm5”