Рубрики
Без рубрики

Основы ML в JavaScript

Недавно я изучал область машинного обучения; Честно говоря, мне пришлось … с меткой JavaScript, MachineLearning, DataScience, Node.

Недавно я изучал поле Машина Обучение ; Честно говоря, мне пришлось переучить почти все свои математические основы. Прошло много времени с тех пор, как колледж и 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”