Ищем прок от применения матриц

 

В последних билдах MT5 появилась поддержка "Матриц" и "Векторов". Обещается ускорение работ за счет этих методов.

Я в алгоритмах на матрицах совсем не смыслю, но очень хочется ускорить свой код.

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

1. Задача по классификации чисел.

У нас есть таблица с числами - выборка (жирным - индекс столбцов), есть таблица с приделами, попадая в которые цифра относится к какому либо классу. Нужно применить правила из таблицы с приделами так, что бы получилась таблица с результатами классификации - смотрите ниже.


Таблица №1 с числами - выборка.

Таблица №2 с приделами.


Таблица №3 с результатами классификации выборки.


2. Задача по вычислению процента принадлежности чисел из таблицы с результатами классификации к числу (целевой), присвоенному каждой строке. Для простоты будет два числа (0 и 1) ниже в таблице показаны вместе столбцы таблицы с результатами классификации и числом (целевой) - таблица с выборкой. В результате вычислений мы должны получить процент каждой (0 и 1) целевой для каждого класса каждого столбца в отдельности.


Таблица №4 с выборкой.


Таблица №5 с результатами вычислений процента принадлежности классов к целевой.


3 Задача по расчету процента заполнения классом каждого столбца выборки.

Даны данные в таблице 4, но теперь нужно посчитать, какой процент занимает каждый класс внутри столбца во всей выборке, т.е. относительно числа информативных строк таблицы - у нас 10 строк в примере. На выходе ожидается таблица с  результатами вычислений процента откликов классов ко всей таблице (выборке). .


Таблица №6 с  результатами вычислений процента откликов классов ко всей таблице (выборке).


Вот такие 3 задачи, в реальности таблицы с изначальными данными очень большие.

Сейчас эти задачи я решаю проходом по каждой ячейки массива таблицы, что очень затратно, может есть способ ускорить процесс вычислений за счет применения матриц/векторов?

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

Добавил файлы с таблицами, кто хочет посчитать...

Файлы:
Matrix.zip  9 kb
 
Таблицы и матрицы это разные вещи. Таблица - это список из векторов одной длины. Сравните с R, где есть data.frame и matrix. Таблицы в mql5 вроде даже не анонсированы пока.
 
Aleksey Nikolayev #:
Таблицы и матрицы это разные вещи. Таблица - это список из векторов одной длины. Сравните с R, где есть data.frame и matrix. Таблицы в mql5 вроде даже не анонсированы пока.

Таблица - наверное список из векторов, но при этом там разные типы чисел, а в матрице одинаковые - не вижу другой разницы - подскажите, пожалуйста.

Даже в справке написано "Матрица — двумерный массив чисел типа double, float или complex.".

 
Aleksey Vyazmikin #:

Таблица - наверное список из векторов, но при этом там разные типы чисел, а в матрице одинаковые - не вижу другой разницы - подскажите, пожалуйста.

Даже в справке написано "Матрица — двумерный массив чисел типа double, float или complex.".

Первая ваша задача решалась бы в R через as.factor() для data.frame, но не для matrix. Или вы используете R совсем не понимая его сути?

Хранение данных в таблицах - это стандарт в МО. Матрицы - это прежде всего формулы и алгоритмы линейной алгебры.

 
Aleksey Nikolayev #:

Первая ваша задача решалась бы в R через as.factor() для data.frame, но не для matrix. Или вы используете R совсем не понимая его сути?

Хранение данных в таблицах - это стандарт в МО. Матрицы - это прежде всего формулы и алгоритмы линейной алгебры.

Я R использую только в режиме пользователя чужих наработок - а по сути только один скрипт.

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

Допустим сравнение выполнить через вычитание одной матрицы из другой... есть ли в этом смысл в плане скорости - в этом вопрос.

 
Aleksey Vyazmikin #:

1) Я R использую только в режиме пользователя чужих наработок - а по сути только один скрипт.

2) Что касается массив\матрица - то принципиальной разницы нет

Очевидно, (2) вытекает из (1). Если хоть немного углубитесь в R, то различие станет очевидным.

В R векторные вычисления для столбцов таблиц имеют смысл, поскольку они намного быстрее цикла. В mql5 разницы не будет, поэтому вряд ли таблицы когда-нибудь в нём появятся. Хотя, с другой стороны, если заявлено нативное МО, то они должны быть.

 
Aleksey Vyazmikin #:

Допустим сравнение выполнить через вычитание одной матрицы из другой... есть ли в этом смысл в плане скорости - в этом вопрос.

Если в mql5, то сильно сомневаюсь в выигрыше перед обычным двойным циклом. Скорее наоборот - вычитание будет всегда совершаться за полный цикл, а поэлементное сравнение будет прерываться при первом неравном элементе.

 

Ниже перечислены все методы матриц и векторов в алфавитном порядке.

Функция

Действие

Категория

Activation

Вычисляет значения функции активации и записывает в переданный вектор/матрицу.

Машинное обучение

ArgMax

Возвращает индекс максимального значения

Статистика

ArgMin

Возвращает индекс минимального значения

Статистика

ArgSort

Возвращает отсортированный индекс

Манипуляции

Average

Вычисляет средневзвешенное значение значений матрицы/вектора

Статистика

Cholesky

Вычисляет разложение Холецкого

Преобразования

Clip

Ограничивает элементы матрицы/вектора заданным диапазоном допустимых значений

Манипуляции

Col

Возвращает вектор-столбец. Записывает вектор в указанный столбец

Манипуляции

Cols

Возвращает количество столбцов в матрице

Характеристики

Compare

Сравнивает элементы двух матриц/векторов с заданной точностью

Манипуляции

CompareByDigits

Сравнивает элементы двух матриц/векторов на совпадение с точностью значащих цифр

Манипуляции

Cond

Вычисляет условное число матрицы

Характеристики

Convolve

Возвращает дискретную линейную свертку двух векторов

Произведения

Copy

Возвращает копию заданной матрицы/вектора

Манипуляции

CorrCoef

Вычисляет коэффициент корреляции Пирсона (линейный коэффициент корреляции)

Произведения

Correlate

Вычисляет кросс-корреляцию двух векторов

Произведения

Cov

Вычисляет ковариационную матрицу

Произведения

CumProd

Возвращает кумулятивное произведение элементов матрицы/вектора, включая элементы вдоль заданной оси

Статистика

CumSum

Возвращает кумулятивную сумму элементов матрицы/вектора, включая элементы вдоль заданной оси

Статистика

Derivative

Вычисляет значения производной активационной функции и записывает в переданный вектор/матрицу

Машинное обучение

Det

Вычисляет детерминант квадратной невырожденной матрицы

Характеристики

Diag

Извлекает диагональ или строит диагональную матрицу

Манипуляции

Dot

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

Произведения

Eig

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

Преобразования

EigVals

Вычисляет собственные значения общей матрицы

Преобразования

Eye

Возвращает матрицу с единицами на диагонали и нулями в других местах

Инициализация

Fill

Заполняет существующую матрицу или вектор заданным значением

Инициализация

Flat

Позволяет обращаться к элементу матрицы через один индекс вместо двух

Манипуляции

Full

Создает и возвращает новую матрицу, заполненную заданным значением

Инициализация

Hsplit

Горизонтальное разделение матрицы на несколько подматриц. То же самое, что Split с axis=0

Манипуляции

Identity

Создает единичную матрицу указанного размера

Инициализация

Init

Инициализация матрицы или вектора

Инициализация

Inner

Внутреннее произведение двух матриц

Произведения

Inv

Вычисляет (мультипликативную) обратную квадратной невырожденной матрицы методом Жордана-Гаусса

Решения

Kron

Возвращает произведение Кронекера двух матриц, матрицы и вектора, вектора и матрицы или двух векторов

Произведения

Loss

Вычисляет значения функции потерь и записывает в переданный вектор/матрицу

Машинное обучение

LstSq

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

Решения

LU

LU-факторизация матрицы как произведения нижней треугольной матрицы и верхней треугольной матрицы

Преобразования

LUP

Факторизация LUP с частичной перестановкой, которая относится к разложению LU только с перестановкой строк: PA=LU

Преобразования

MatMul

Матричное произведение двух матриц

Произведения

Max

Возвращает максимальное значение в матрице/векторе

Статистика

Mean

Вычисляет среднее арифметическое значений элементов

Статистика

Median

Вычисляет медиану элементов матрицы/вектора

Статистика

Min

Возвращает минимальное значение в матрице/векторе

Статистика

Norm

Возвращает норму матрицы или вектора

Характеристики

Ones

Создает и возвращает новую матрицу, заполненную единицами

Инициализация

Outer

Вычисляет внешнее произведение двух матриц или двух векторов

Произведения

Percentile

Возвращает указанный процентиль значений элементов матрицы/вектора или элементов вдоль указанной оси

Статистика

PInv

Вычисляет псевдообратную матрицу методом Мура-Пенроуза

Решения

Power

Возводит квадратную матрицу в целочисленную степень

Произведения

Prod

Возвращает произведение элементов матрицы/вектора, которое также может быть выполнено для заданной оси

Статистика

Ptp

Возвращает диапазон значений матрицы/вектора или заданной оси матрицы

Статистика

QR

Вычисляет qr-факторизацию матрицы

Преобразования

Quantile

Возвращает указанный квантиль значений элементов матрицы/вектора или элементов вдоль указанной оси

Статистика

Rank

Возвращает ранг матрицы с помощью метода Гаусса

Характеристики

RegressionMetric

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

Статистика

Reshape

Изменение формы матрицы без изменения ее данных

Манипуляции

Resize

Возвращает новую матрицу с измененной формой и размером

Манипуляции

Row

Возвращает вектор-строку. Записывает вектор в указанную строку

Манипуляции

Rows

Возвращает количество строк в матрице

Характеристики

Size

Возвращает размер вектора

 

SLogDet

Вычисляет знак и логарифм определителя матрицы

Характеристики

Solve

Решает линейное матричное уравнение или систему линейных алгебраических уравнений

Решения

Sort

Сортировка по месту

Манипуляции

Spectrum

Вычисляет спектр матрицы как набор ее собственных значений из произведения AT*A

Характеристики

Split

Разделение матрицы на несколько подматриц

Манипуляции

Std

Возвращает стандартное отклонение значений элементов матрицы/вектора или элементов вдоль заданной оси

Статистика

Sum

Возвращает сумму элементов матрицы/вектора, которая также может быть выполнена для заданной оси (осей)

Статистика

SVD

Сингулярное разложение значений

Преобразования

SwapCols

Меняет местами столбцы в матрице

Манипуляции

SwapRows

Меняет местами строки в матрице

Манипуляции

Trace

Возвращает сумму по диагоналям матрицы

Характеристики

Transpose

Транспонирует (меняет оси местами) и возвращает измененную матрицу

Манипуляции

Tri

Строит матрицу с единицами на заданной и ниже диагоналях и нулями в других местах

Инициализация

TriL

Возвращает копию матрицы с обнуленными элементами над k-й диагональю. Нижнетреугольная матрица

Манипуляции

TriU

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

Манипуляции

Var

Вычисляет дисперсию значений элементов матрицы/вектора

Статистика

Vsplit

Вертикальное разделение матрицы на несколько подматриц. То же самое, что Split с axis=1

Манипуляции

Zeros

Создает и возвращает новую матрицу, заполненную нулями

Инициализация

 

Документация по MQL5: Методы матриц и векторов / Машинное обучение / Activation
Документация по MQL5: Методы матриц и векторов / Машинное обучение / Activation
  • www.mql5.com
Activation - Машинное обучение - Методы матриц и векторов - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Aleksey Vyazmikin:

В последних билдах MT5 появилась поддержка "Матриц" и "Векторов". Обещается ускорение работ за счет этих методов.

Я в алгоритмах на матрицах совсем не смыслю, но очень хочется ускорить свой код.

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

1. Задача по классификации чисел.

У нас есть таблица с числами - выборка (жирным - индекс столбцов), есть таблица с приделами, попадая в которые цифра относится к какому либо классу. Нужно применить правила из таблицы с приделами так, что бы получилась таблица с результатами классификации - смотрите ниже.


Таблица №1 с числами - выборка.

Таблица №2 с приделами.


Таблица №3 с результатами классификации выборки.


2. Задача по вычислению процента принадлежности чисел из таблицы с результатами классификации к числу (целевой), присвоенному каждой строке. Для простоты будет два числа (0 и 1) ниже в таблице показаны вместе столбцы таблицы с результатами классификации и числом (целевой) - таблица с выборкой. В результате вычислений мы должны получить процент каждой (0 и 1) целевой для каждого класса каждого столбца в отдельности.


Таблица №4 с выборкой.


Таблица №5 с результатами вычислений процента принадлежности классов к целевой.


3 Задача по расчету процента заполнения классом каждого столбца выборки.

Даны данные в таблице 4, но теперь нужно посчитать, какой процент занимает каждый класс внутри столбца во всей выборке, т.е. относительно числа информативных строк таблицы - у нас 10 строк в примере. На выходе ожидается таблица с  результатами вычислений процента откликов классов ко всей таблице (выборке). .


Таблица №6 с  результатами вычислений процента откликов классов ко всей таблице (выборке).


Вот такие 3 задачи, в реальности таблицы с изначальными данными очень большие.

Сейчас эти задачи я решаю проходом по каждой ячейки массива таблицы, что очень затратно, может есть способ ускорить процесс вычислений за счет применения матриц/векторов?

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

Добавил файлы с таблицами, кто хочет посчитать...

конечно на лицо проблемы с формулировками и постановкой задач :-)

в п.1 можно применить матрицы и вектора (если именно в этом самоцель), если классификацию представить как некую функцию (матричную, полином) от x. Итоговый класс = целая часть. 

но если данные и диапазоны заранее отсортированы, то секс с матрицами ненужен. И так всё очень быстро O(1) - начальный класс 1, бежим по массиву значений, если значение выше порога, берём следующий класс и увеличиваем порог

 
Aleksey Nikolayev #:

Очевидно, (2) вытекает из (1). Если хоть немного углубитесь в R, то различие станет очевидным.

В R векторные вычисления для столбцов таблиц имеют смысл, поскольку они намного быстрее цикла. В mql5 разницы не будет, поэтому вряд ли таблицы когда-нибудь в нём появятся. Хотя, с другой стороны, если заявлено нативное МО, то они должны быть.

Так и тут заявлялось, что матрицы и вектора будут быстрей, чем перебор массивов - отсюда и интерес к этой теме.


Aleksey Nikolayev #:

Если в mql5, то сильно сомневаюсь в выигрыше перед обычным двойным циклом. Скорее наоборот - вычитание будет всегда совершаться за полный цикл, а поэлементное сравнение будет прерываться при первом неравном элементе.

Тема для того, что бы проверить, но нужно понять, как алгоритмически это сделать.

 
MetaQuotes #:

Ниже перечислены все методы матриц и векторов в алфавитном порядке.

Да, спасибо, в справке это уже есть, но пусть будет!

Но, вдруг, может, есть вопросы по алгоритмам для решения задачь?

Причина обращения: