Баг в инверсии матриц

В библиотеке для машинного обучения, которую сейчас пишу, кажется, косяк в расчете инверсии для матрицы. Очень странно. Может быть, буду искать баг, а может и забью. Может быть, как-нибудь потом поразбираюсь дальше… Может быть, какие-то особенности инверсии, которые я не знаю. Хотя странно очень — раньше не наблюдались проблемы… Как бы то ни было — начинаю разбирать F#. Для работы с матрицами, пожалуй, буду использовать не свою библиотеку (просто для верности и из нежелания искать баг в инверсии, если дело вообще в ней). В общем-то, свою цель библиотека частично выполнила — я разобрал основы работы с матрицами и написал несколько методов регрессии… По большому счету — на этом можно и остановиться в разработке этой библиотеки. Хотя… хз…

Парная регрессия — параболы второго, третьего и пр порядка

В библиотеку машинного обучения добавил еще одну регрессию — парную регрессию n-порядка. Класс ВОТ ТУТ. Формат использования такой же, как и у других регрессий. Вот пример:

Matrix mParabolaRegression = Matrix.GetMatrixFromTXT("data\\parabola_regression.txt", '\t');
            NOrderSimpleParabolaRegression nospr = new NOrderSimpleParabolaRegression();
            Matrix z = nospr.GetRegressionCoefficients(mParabolaRegression, 2);
            double yVal = nospr.GetYForVectorX(z, 84.0);

GetMatrixFromTXT — статический метод получения матрицы из файла. Указывается путь к файлу и разделитель столбцов.

Далее создается объект парной регрессии параболы n-порядка.

Далее получаем коэффициенты для формулы расчета зависимой переменной y: y = a + bx + cx^2

Используя коэффициенты рассчитываем y для заданного предиктора x:

double yVal = nospr.GetYForVectorX(z, 84.0);

То есть в примере ищем y для x = 84.

Множественная линейная регрессия на C#

Поскольку на прошлой неделе сделал реализацию работу с матрицами на c# — самое время ими воспользоваться. Собственно, пока что сделал только множественную линейную регрессию. Класс для работы с ней находится ВОТ ТУТ.

Для начала создаем объект множественной линейной регрессии: Читать далее Множественная линейная регрессия на C#

C#. Матрицы: Умножение на скаляр. Инвертирование, транспонирование, детерминант. Сложение, вычитание и умножение

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

Библиотека находится на github ВОТ ТУТ. Пока что всё в ней написано на c#. Может быть, еще добавится что-то функциональное — но никак не могу выбрать между F# и всем остальным… По уму-то — нужен F#, так как всё же это у меня .NET. Но вот F#, кажется, сейчас уже никому не нужен, поэтому не знаю, какой язык осваивать.

Итак, создаем матрицу. Конструктор принимает двухмерный массив double — собственно, саму матрицу:

double[,] a = new double[3, 3];
            sqvArr[0, 0] = -1;
            sqvArr[0, 1] = -2;
            sqvArr[0, 2] = 2;
            sqvArr[1, 0] = 2;
            sqvArr[1, 1] = 1;
            sqvArr[1, 2] = 1;
            sqvArr[2, 0] = 3;
            sqvArr[2, 1] = 4;
            sqvArr[2, 2] = 5;

            Matrix matrixA = new Matrix(a);

Читать далее C#. Матрицы: Умножение на скаляр. Инвертирование, транспонирование, детерминант. Сложение, вычитание и умножение

Простая линейная регрессия на C#

Как уже писал, занимаюсь освоением самых- самых основ machine learning. В курсах и литературе по ML обычно начинают с простой линейной регрессии. Предварительно обучив по массиву значений одной независимой переменной (X) и массиву значений зависимой от ней второй переменной (Y), можно для какого-либо x получить предположительное y. Например, по росту предположить вес.

Код написал на c#. Он находится на гитхабе — ВОТ ТУТ . Это библиотека, в которой на настоящий момент нет ничего, кроме класса простой линейной регрессии 🙂 Читать далее Простая линейная регрессия на C#

создал-таки блог для заметок по изучению программирования

Наконец-то создал блог для того, чтобы записывать какие-то свои мысли по изучению программирования — что освоил, что узнал, что написал. Писать сюда буду сугубо по настроению.

На текущий момент занимаюсь разработкой всего полтора года. За это время постоянно метался — от PHP в самом начале, к JAVA чуть позже и потом к C#. Сейчас что-то серверное пишу на C#, а джава мне нужна, чтобы учиться что-то писать под ведроид.

В планах заниматься F# и/или Groovy и/или Python. В планах Machine Learning. Учитывая то, что математика давно забыта (начал повторять школьный курс, полупрогуленный в старших классах, а другой математики и не было) — это будет непростой и долгий путь 🙂 Но попробовать можно. Из реализованного на JAVA — байесовский наивный классификатор для работы с текстами (там же и стеммер, работа с униграммами и биграммами, стоп слова и пр) и простая линейная регрессия. В общем в этом отношении я в самом-самом начале. Сейчас начал читать книжечку «Statistics in a nutshell». Чуть-чуть позже попутно буду читать «Мат анализ с человеческим лицом». Смотрю всяко-разно на youtube, на khan academy и что-то хаотично почитываю.

По самому программированию без всяких машинных обучений — есть кучи пробелов в знаниях. Например, паттерны — очень мало их применяю и очень неумело. Никак не расправлюсь с книгой «Алгоритмы и структуры данных JAVA». Да и очень много всего начато и не закончено… Надеюсь, за 2017 год, который только только начался, успею заполнить эти пробелы.

Больше всего сейчас интересует machine learning, (в первую очередь в связке с Natural Language Processing) и мобильная разработка. Весь этот год, чтобы не метаться, хотелось бы и дальше ограничиваться только Android и не лезть в IOS. Вряд ли продержусь весь год и таки начну разбирать IOS (что в общем, наверное, будет большой ошибкой).