Расширение "Линейная алгебра"
Создание вектора в тексте статьи
Наиболее простой способ создания вектора в тексте статьи состоит в использовании функции massiv(s), где строка s содержит значения элементов вектора, разделённые пробелами.
Разметка
~x=massiv('1 2 3 4 5 6 7')@vvt(x)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Все или часть элементов вектора могут быть заданы в формате ключ:значение. Если задан ключ, то он становится индексом данного значения в векторе. Если ключ не задан, индексом становится очередное числовое значение.
Разметка
~x=massiv('a:1 e:2 3 f:4 5 b:6 7')@vvt(x)
Вывод
a |
e |
0 |
f |
1 |
b |
2 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Загрузка вектора из источника данных
Данные вектора могут быть извлечены из секции структурированного файла как Массивы Ключ/Значение или как элементы объектов данных Массивы структурированных записей. Примеры подобного рода манипуляций с данными рассматриваются в этой статье далее при рассмотрении примера использования функций данного расширения при решении задачи построения множественной линейной регрессии.
Функция vxs() - умножение вектора на скаляр
Функция vxs(v,s) осуществляет умножение вектора v на скаляр s.
Разметка
~x=massiv('1 2 3 4 5 6 7')~y=vxs(x,10)
@vvt(y)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
10 |
20 |
30 |
40 |
50 |
60 |
70 |
Функция vxv() - скалярное произведение векторов
Функция vxv(x,y) осуществляет скалярное умножение векторов x и y. Вектора могут иметь разную длину и разную индексацию. Базисом является левый вектор. Учитываются только те элементы вектора y, которые имеют индексы, совпадающие с индексами элементов вектора x.
Разметка
~x=massiv('1 2 3')~y=massiv('2 2 2')
@nt(1)
@st(1,'Вектор x',x)
@st(1,'Вектор y',y)
@kt()
Скалярное произведение векторов x и y равно =vxv(x,y)
Вывод
Вектор x | 1 |
2 |
3 |
Вектор y | 2 |
2 |
2 |
Скалярное произведение векторов x и y равно 12
Разметка
~x=massiv('a:1 b:2 c:3')~y=massiv('a:2 s:2 d:2 b:4')
:::Вектор x
@vvt(x)
:::Вектор y
@vvt(y)
Скалярное произведение векторов x и y равно =vxv(x,y)
Вывод
Вектор x
a |
b |
c |
1 |
2 |
3 |
Вектор y
a |
s |
d |
b |
2 |
2 |
2 |
4 |
Скалярное произведение векторов x и y равно 10
Из приведённого примера можно видеть, что при вычислении использованы только элементы с индексами, которые имеются в обоих векторах: a и b.
Функция smt() - создание матрицы из строки
Функция smt(s) создаёт матрицу из строки текста. Разделителем строк матрицы является символ ; (точка с запятой). Выделенные подстроки могут содержать разделённые пробелами значения элементов матрицы или данные в формате ключ:значение.
Разметка
~x=smt('1 2 3;4 5 6;7 8 9;10 11 12')@vmt(x)
Вывод
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
4 |
5 |
6 |
2 |
7 |
8 |
9 |
3 |
10 |
11 |
12 |
Построчное создание матрицы
Другая возможность создания матрицы в тексте статьи состоит в том, чтобы каждой строке матрицы присвоить одномерный массив - её строку. Это связано с тем, что матрица в системе представляется как массив одномерных массивов.
Разметка
~m('a')=massiv('1 2 3')~m('b')=massiv('4 5 6')
~m('c')=massiv('7 8 9')
@vmt(m)
Вывод
0 |
1 |
2 |
|
a | 1 |
2 |
3 |
b | 4 |
5 |
6 |
c | 7 |
8 |
9 |
Разметка
~m('a')=massiv('x1:1 x2:2 x3:3')~m('b')=massiv('x1:4 x2:5 x3:6')
~m('c')=massiv('x1:7 x2:8 x3:9')
@vmt(m)
Вывод
x1 |
x2 |
x3 |
|
a | 1 |
2 |
3 |
b | 4 |
5 |
6 |
c | 7 |
8 |
9 |
Загрузка векторов и матриц из источника данных
Данные векторов и матриц могут быть извлечены из секций структурированных файлов или отдельных текстовых файлов как Массивы Ключ/Значение или как элементы объектов данных Массивы структурированных записей. Примеры подобного рода манипуляций с данными рассматриваются в этой статье далее при рассмотрении примера использования функций данного расширения при решении задачи построения уравнения множественной линейной регрессии.
Функция vxm() - левое умножение вектора на матрицу
Функция vxm(v,m) осуществляет левое умножение вектора v на матрицу m. Результатный вектор имеет столько же элементов, сколько столбцов имеет матрица m. При вычислении скалярных произведений вектора v на соответствующие столбцы матрицы m учитываются только те элементы столбца матрицы, которые имеют индексы, совпадающие с индексами элементов вектора v.
В данном примере вектор и матрицу создадим прямо в тексте статьи.
Разметка
~v=massiv('1 2 1'):::Вектор v
@vvt(v)
~m=smt('10 20 30;40 50 60')
:::Матрица m
@vmt(m)
~x=vxm(v,m)
:::Результат
@vvt(x)
Вывод
Вектор v
0 |
1 |
2 |
1 |
2 |
1 |
Матрица m
0 |
1 |
2 |
|
0 |
10 |
20 |
30 |
1 |
40 |
50 |
60 |
Результат
0 |
1 |
2 |
90 |
120 |
150 |
По результату можно видеть, что элемент с индексом 2 вектора в вычислениях не участвует, поскольку ни в одном столбце матрицы m нет элемента с таким же индексом.
Функция mxv() - левое умножение матрицы на вектор
Функция mxv(m,v) осуществляет левое умножение матрицы m на вектор v. Результатный вектор имеет столько же элементов, сколько строк имеет матрица m. При вычислении скалярных произведений строк матрицы m на вектор v учитываются только те элементы строки, которые имеют индексы, совпадающие с индексами элементов вектора v. Индексами результатного вектора являются индексы соответствующих строк матрицы m.
В данном примере используем уже созданные в предыдущем примере матрицу и вектор. Их значения на текущий момент сохранились, поскольку строки статьи обрабатываются последовательно.
Разметка
:::Матрица m@vmt(m)
:::Вектор v
@vvt(v)
~x=mxv(m,v)
:::Результат
@vvt(x)
Вывод
Матрица m
0 |
1 |
2 |
|
0 |
10 |
20 |
30 |
1 |
40 |
50 |
60 |
Вектор v
0 |
1 |
2 |
1 |
2 |
1 |
Результат
0 |
1 |
80 |
200 |
По результату можно видеть, что в результирующем векторе всего два элемента (по количеству строк матрицы) и все элементы строк задействуются в вычислениях.
Функция mxs() - умножение матрицы на скаляр
Функция mxs(m,s) осуществляет умножение каждого элемента матрицы m на скаляр s.
Разметка
:::Матрица m@vmt(m)
~x=mxs(m,10)
:::Результат
@vmt(x)
Вывод
Матрица m
0 |
1 |
2 |
|
0 |
10 |
20 |
30 |
1 |
40 |
50 |
60 |
Результат
0 |
1 |
2 |
|
0 |
100 |
200 |
300 |
1 |
400 |
500 |
600 |
Функция mpm() - сложение матриц
Функция mpm(x,y) осуществляет покомпонентное сложение матриц x и y. Если какая-то строка матрицы x отсутствует в матрице y, то она переписывается в результатную матрицу без изменений. Если какая-то строка матрицы y отсутствует в матрице x, то она также переписывается в результатную матрицу без изменений. Если строки с одноимёнными индексами присутствуют в обоих матрицах, то элементы с одинаковыми индексами столбцов складываются. Если в строке матрицы x имеются элементы с индексами, отсутствующими в матрице y, то они копируются в результатную матрицу без изменений. Если в строке матрицы y имеются элементы с индексами, отсутствующими в матрице x, то они копируются в результатную матрицу без изменений. Таким образом, функция mpm осуществляет не только сложение элементов двух матриц, но и объединение разреженных матриц.
Пример с полностью заполненными матрицами одинаковой размерности.
Разметка
~x=smt("1 2 3;3 2 1"):::Матрица x
@vmt(x)
~y=smt("3 2 1;1 2 3")
:::Матрица y
@vmt(y)
~r=mpm(x,y)
:::Результат
@vmt(r)
Вывод
Матрица x
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
3 |
2 |
1 |
Матрица y
0 |
1 |
2 |
|
0 |
3 |
2 |
1 |
1 |
1 |
2 |
3 |
Результат
0 |
1 |
2 |
|
0 |
4 |
4 |
4 |
1 |
4 |
4 |
4 |
Пример с разреженными матрицами.
Разметка
~x=massiv('')~x('a')=massiv("a:1 b:2 c:3")
~x('b')=massiv("b:2 c:3 e:1")
~x('c')=massiv("e:2 a:3 b:1")
:::Матрица x
@vmt(x)
~y=massiv('')
~y('a')=massiv("a:5 b:4 e:3")
~y('b')=massiv("a:2 b:3 f:1")
~y('d')=massiv("d:2 b:3 c:1")
:::Матрица y
@vmt(y)
~r=mpm(x,y)
:::Результат
@vmt(r)
Вывод
Матрица x
a |
b |
c |
e |
|
a | 1 |
2 |
3 |
|
b | 2 |
3 |
1 |
|
c | 3 |
1 |
2 |
Матрица y
a |
b |
e |
f |
d |
c |
|
a | 5 |
4 |
3 |
|||
b | 2 |
3 |
1 |
|||
d | 3 |
2 |
1 |
Результат
a |
b |
c |
e |
f |
d |
|
a | 6 |
6 |
3 |
3 |
||
b | 2 |
5 |
3 |
1 |
1 |
|
c | 3 |
1 |
2 |
|||
d | 3 |
1 |
2 |
В приведённом примере сначала "стирается" содержимое матриц x (~x=massiv("")) и y (~y=massiv("")). Это необходимо, поскольку при построчном заполнении уже существующие строки сохраняются, а в предыдущих примерах статьи матрицы x и y уже чем-то заполнялись. В матрице x нет строки d, которая есть в y, а в матрице y нет строки c. Поэтому они просто переписываются в результатную матрицу без изменений. Элементы с индексами (a,a);(a,b);(b,b) имеются в обоих матрицах и потому они складываются. Элемент с индексом (a,с) имеется в матрице x, но отсутствует в матрице y. Поэтому он просто переносится в строку a результата. С другой стороны, элемент (a,e) присутствует в матрице y, но отсутствует в матрице x. Он также заносится в результат. То же касается и части элементов строки b обеих матриц.
Функция mmm() - вычитание матриц
Функция mmm(x,y) осуществляет покомпонентное вычитание из элементов матрицы x соответствующих элементом матрицы y. Если какая-то строка матрицы x отсутствует в матрице y, то она переписывается в результатную матрицу без изменений. Если какая-то строка матрицы y отсутствует в матрице x, то она также переписывается, но с обратными знаками элементов. Если строки с одноимёнными индексами присутствуют в обоих матрицах, то элементы с одинаковыми индексами столбцов вычитаются. Если в строке матрицы x имеются элементы с индексами, отсутствующими в матрице y, то они копируются в результатную матрицу без изменений. Если в строке матрицы y имеются элементы с индексами, отсутствующими в матрице x, то они копируются в результатную матрицу со знаком минус. Таким образом, функция mmm осуществляет не только вычитание элементов двух матриц, но и объединение разреженных матриц.
Пример с полностью заполненными матрицами одинаковой размерности.
Разметка
~x=smt("1 2 3;3 2 1"):::Матрица x
@vmt(x)
~y=smt("3 2 13;1 2 3")
:::Матрица y
@vmt(y)
~r=mmm(x,y)
:::Результат
@vmt(r)
Вывод
Матрица x
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
3 |
2 |
1 |
Матрица y
0 |
1 |
2 |
|
0 |
3 |
2 |
1 |
1 |
1 |
2 |
3 |
Результат
0 |
1 |
2 |
|
0 |
-2 |
0 |
2 |
1 |
2 |
0 |
-2 |
Пример с разреженными матрицами.
Разметка
~x=massiv('')~x('a')=massiv("a:1 b:2 c:3")
~x('b')=massiv("b:2 c:3 e:1")
~x('c')=massiv("e:2 a:3 b:1")
:::Матрица x
@vmt(x)
~y=massiv('')
~y('a')=massiv("a:5 b:4 e:3")
~y('b')=massiv("a:2 b:3 f:1")
~y('d')=massiv("d:2 b:3 c:1")
:::Матрица y
@vmt(y)
~r=mmm(x,y)
:::Результат
@vmt(r)
Вывод
Матрица x
a |
b |
c |
e |
|
a | 1 |
2 |
3 |
|
b | 2 |
3 |
1 |
|
c | 3 |
1 |
2 |
Матрица y
a |
b |
e |
f |
d |
c |
|
a | 5 |
4 |
3 |
|||
b | 2 |
3 |
1 |
|||
d | 3 |
2 |
1 |
Результат
a |
b |
c |
e |
f |
d |
|
a | -4 |
-2 |
3 |
-3 |
||
b | -2 |
-1 |
3 |
1 |
-1 |
|
c | 3 |
1 |
2 |
|||
d | -3 |
-1 |
-2 |
Функция tm(m) - транспонирование матрицы
Функция tm(m) осуществляет транспонирование матрицы m.
Разметка
~x=smt("1 2 3;4 5 6"):::Матрица x
@vmt(x)
~r=tm(x)
:::Результат
@vmt(r)
Вывод
Матрица x
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
4 |
5 |
6 |
Результат
0 |
1 |
|
0 |
1 |
4 |
1 |
2 |
5 |
2 |
3 |
6 |
В следующем примере транспонируется разреженная матрица y, построенная в предыдущем примере.
Разметка
:::Матрица y@vmt(y)
~r=tm(y)
:::Результат
@vmt(r)
Вывод
Матрица y
a |
b |
e |
f |
d |
c |
|
a | 5 |
4 |
3 |
|||
b | 2 |
3 |
1 |
|||
d | 3 |
2 |
1 |
Результат
a |
b |
d |
|
a | 5 |
2 |
|
b | 4 |
3 |
3 |
e | 3 |
||
f | 1 |
||
d | 2 |
||
c | 1 |
Функция mxm() - умножение матриц
Функция mxm(x,y) осуществляет умножение матриц общего вида. Формирование элементов результатной матрицы осуществляется по правилам выполнения скалярного произведения соответствующих строк левой матрицы на столбцы правой, используемым в рассмотренной ранее функции vxv.
Пример с полностью заполненными матрицами одинаковой размерности.
Разметка
~x=smt("1 2;2 1"):::Матрица x
@vmt(x)
~y=smt("2 1;1 2")
:::Матрица y
@vmt(y)
~r=mxm(x,y)
:::Результат
@vmt(r)
Вывод
Матрица x
0 |
1 |
|
0 |
1 |
2 |
1 |
2 |
1 |
Матрица y
0 |
1 |
|
0 |
2 |
1 |
1 |
1 |
2 |
Результат
0 |
1 |
|
0 |
4 |
5 |
1 |
5 |
4 |
Пример с индексированными матрицами.
Разметка
~x=massiv('')~x('a')=massiv("a:1 b:2 c:3")
~x('b')=massiv("b:2 c:1 a:3")
:::Матрица x
@vmt(x)
~y=massiv('')
~y('a')=massiv("a:5 b:4")
~y('b')=massiv("a:2 b:3")
~y('c')=massiv("a:3 b:1")
:::Матрица y
@vmt(y)
~r=mxm(x,y)
:::Результат
@vmt(r)
Вывод
Матрица x
a |
b |
c |
|
a | 1 |
2 |
3 |
b | 3 |
2 |
1 |
Матрица y
a |
b |
|
a | 5 |
4 |
b | 2 |
3 |
c | 3 |
1 |
Результат
a |
b |
|
a | 18 |
13 |
b | 22 |
19 |
Функция om() - обратная матрица
Функция om(x[,r]) осуществляет вычисление обратной матрицы общего вида. Если матрица является вырожденной, то функция возвращает пустой массив. Если указан второй ненулевой параметр, то функция om() выводит трассировку своих действий по преобразованию исходной матрицы в обратную. По умолчанию он равен нулю, то есть трассировка действий отключена.
Разметка
~m=smt("1 2 3;3 2 1;4 5 7"):::Матрица m
@vmt(m)
~r=om(m)
:::Результат
@vmt(r)
:::Проверка
~e=mxm(r,m)
@vmt(e)
Вывод
Матрица m
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
3 |
2 |
1 |
2 |
4 |
5 |
7 |
Результат
0 |
1 |
2 |
|
0 |
-2,25 |
-0,250 |
1 |
1 |
4,25 |
1,25 |
-2 |
2 |
-1,75 |
-0,750 |
1 |
Проверка
0 |
1 |
2 |
|
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
2 |
0 |
0 |
1 |
В данном примере проверка производится перемножением исходной матрицы на обратную, в результате чего получаем единичную матрицу.
Пример, когда матрица является вырожденной:
Разметка
~m=smt("1 2 3;3 2 1;4 5 6"):::Матрица m
@vmt(m)
~r=om(m)
:::Результат
@vmt(r)
:::Проверка
~e=mxm(r,m)
@vmt(e)
Вывод
Матрица m
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
3 |
2 |
1 |
2 |
4 |
5 |
6 |
Результат
Проверка
В данном примере vmt() ничего выводит, поскольку у неё на входе пустой массив. Чтобы посмотреть, на каком шаге алгоритма выявлена вырожденность матрицы, устанавливаем ненулевым параметр r.
Разметка
~m=smt("1 2 3;3 2 1;4 5 6"):::Матрица m
@vmt(m)
~r=om(m,1)
Вывод
Матрица m
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
3 |
2 |
1 |
2 |
4 |
5 |
6 |
a -> 0
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
0 |
-4 |
-8 |
2 |
0 |
-3 |
-6 |
b -> 0
0 |
1 |
2 |
|
0 |
1 |
||
1 |
-3 |
1 |
0 |
2 |
-4 |
0 |
1 |
a -> 1
0 |
1 |
2 |
|
0 |
1 |
0 |
-1 |
1 |
0 |
1 |
2 |
2 |
0 |
0 |
0 |
b -> 1
0 |
1 |
2 |
|
0 |
-0,500 |
0,500 |
0 |
1 |
0,750 |
-0,250 |
0 |
2 |
-1,75 |
-0,750 |
1 |
Из результатов вывода видно, что на нулевом шаге алгоритм "обнулил" все элементы нулевого столбца исходной матрицы (a -> 0), кроме диагонального (0,0). На первом шаге - первый столбец исходной матрицы (a -> 1). Но следующий этап преобразований осуществлён быть не может, поскольку в результате преобразований строка два оказалась нулевой, то есть линейно зависимой от двух других. Выявив это, алгоритм прекратил работу и вернул пустой массив.
Пример с индексированными матрицами.
Разметка
~x=massiv('')~x('a')=massiv("a:2 b:2")
~x('b')=massiv("a:2 b:1")
:::Матрица x
@vmt(x)
~r=om(x)
:::Результат
@vmt(r)
:::Проверка
~e=mxm(r,x)
@vmt(e)
Вывод
Матрица x
a |
b |
|
a | 2 |
2 |
b | 2 |
1 |
Результат
a |
b |
|
a | -0,500 |
1 |
b | 1 |
-1 |
Проверка
a |
b |
|
a | 1 |
0 |
b | 0 |
1 |
Функция rslu() - решение системы линейных уранений
Функция rslu(m,v) осуществляет решение системы линейных уравнений вида Mx=v. Её параметрами являются матрица m и вектор v. Если матрица является вырожденной, то функция возвращает пустой массив.
Разметка
~m=smt("1 2 3;3 2 1;4 5 7"):::Матрица m
@vmt(m)
~v=massiv("5 6 7")
:::Вектор v
@vvt(v)
~x=rslu(m,v)
:::Результат
@vvt(x)
:::Проверка
~n=mxv(m,x)
@vvt(n)
Вывод
Матрица m
0 |
1 |
2 |
|
0 |
1 |
2 |
3 |
1 |
3 |
2 |
1 |
2 |
4 |
5 |
7 |
Вектор v
0 |
1 |
2 |
5 |
6 |
7 |
Результат
0 |
1 |
2 |
-5,75 |
14,8 |
-6,25 |
Проверка
0 |
1 |
2 |
5 |
6 |
7 |
Проверка состоит в перемножении матрицы m на вектор результата вычислений. В результате получаем исходный вектор v.
Функции покомпонентных действий с парой векторов
Функция vuv(x,y) производит покомпонентное перемножение векторов x и y. В результат попадают только те произведения элементов вектора x для которых имеется элемент вектора y с одноимённым индексом.
Функция vpv(x,y) производит покомпонентное сложение векторов x и y. В результат попадают только суммы элементов вектора x с одноимёнными элементами вектора y.
Функция vmv(x,y) производит покомпонентное вычитание векторов x и y. В результат попадают только разности элементов вектора x с одноимёнными элементами вектора y.
Функция vdv(x,y) производит покомпонентное деление элементов вектора x на одноимённые компоненты вектора y, если последние не равны нулю.
Построение уравнения множественной линейной регрессии
При построении уравнения множественной линейной регрессии можно использовать каноническую матричную формулу - ((XT*X)^-1)*XT*Y, где:
X - матрица, столбцами которой являются независимые переменные, а строками - их наблюдаемые значения. При этом матрица X дополнена столбцом, состоящим из единиц;
XT - транспонированная матрица X;
Y - вектор значений зависимой переменной.
Указанная формула может быть записана как следующая суперпозиция рассмотренных ранее функций:
mxv(mxm(om(mxm(tm(X),X)),tm(X)),Y)
Данные для рассматриваемого далее примера получены из открытых источников. В примере предполагается, что исследуется зависимость выпуска продукции (y) от затрат труда (x1) и затрат капитала (x2). Выдвинуто предположение, что x1 и x2 связаны с y зависимостью:
y=a0+a1*x1+a2*x2
Наблюдения за указанными переменными представлены в следующей таблице.
x1 | 118 |
102 |
116 |
124 |
114 |
154 |
115 |
98 |
x2 | 106 |
50 |
54 |
42 |
36 |
106 |
88 |
46 |
y | 203 |
88 |
110 |
56 |
80 |
237 |
160 |
75 |
Основываясь на этих данных следует построить уравнение линейной регрессии y=a0+a1*x1+a2*x2.
Сначала предположим, что данные задаются прямо в статье и потому будем создавать матрицу значений переменных x1 и x2 построчно, а все необходимые вычисления будем производить последовательно и с комментариями.
Разметка
~xt('x0')=massiv(" 1 1 1 1 1 1 1 1")~xt('x1')=massiv("118 102 116 124 114 154 115 98")
~xt('x2')=massiv("106 50 54 42 36 106 88 46")
@vmt(XT)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
x0 | 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
x1 | 118 |
102 |
116 |
124 |
114 |
154 |
115 |
98 |
x2 | 106 |
50 |
54 |
42 |
36 |
106 |
88 |
46 |
Формируем вектор значений зависимой переменной y:
Разметка
~y=massiv('203 88 110 56 80 237 160 75')
@vvt(y)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
203 |
88 |
110 |
56 |
80 |
237 |
160 |
75 |
Построенная нами матрица xt является транспонированной по отношению к матрице данных с наблюдениями за независимыми переменными, поскольку в ней строками должны быть наблюдения, а столбцами - переменные. Поэтому матрицу x можно получить транспонированием матрицы xt.
Разметка
~x=tm(xt)
@vmt(x)
Вывод
x0 |
x1 |
x2 |
|
0 |
1 |
118 |
106 |
1 |
1 |
102 |
50 |
2 |
1 |
116 |
54 |
3 |
1 |
124 |
42 |
4 |
1 |
114 |
36 |
5 |
1 |
154 |
106 |
6 |
1 |
115 |
88 |
7 |
1 |
98 |
46 |
Перемножаем матрицы xt и x.
Разметка
~u=mxm(xt,x)
@vmt(u)
Вывод
x0 |
x1 |
x2 |
|
x0 | 8 |
941 |
528 |
x1 | 941 |
112 701 |
64 136 |
x2 | 528 |
64 136 |
40 808 |
Вычисляем обратную к u матрицу.
Разметка
~u=om(u)
@vmt(u)
Вывод
x0 |
x1 |
x2 |
|
x0 | 7,69 |
-0,072 |
0,013 |
x1 | -0,072 |
0,001 |
-0,000 |
x2 | 0,013 |
-0,000 |
0,000 |
Перемножаем транспонированную матрицу данных с наблюдениями за независимыми переменными на вектор наблюдений за зависимой переменной:
Разметка
~w=mxv(xt,y)
@vmt(w)
Вывод
x0 |
x1 |
x2 |
1 009 |
124 002 |
79 742 |
Получаем окончательный результат, перемножая матрицу u на вектор w:
Разметка
~b=mxv(u,w)
@vmt(b)
Вывод
x0 |
x1 |
x2 |
-79,8 |
0,634 |
1,99 |
Всё то же самое можно было бы вычислить всего одной формулой:
Разметка
~r=mxv(mxm(om(mxm(tm(x),x)),tm(x)),y)
@vvt(r)
Вывод
x0 |
x1 |
x2 |
-79,8 |
0,634 |
1,99 |
Исходные данные для решения задачи формирования уравнения множественной линейной регрессии можно собрать из содержимого отдельных секций и файлов. Например, в данной статье имеется секция mkz следующего содержания:
x1: 118 102 116 124 114 154 115 98
x2: 106 50 54 42 36 106 88 46
y: 203 88 110 56 80 237 160 75
x2: 106 50 54 42 36 106 88 46
y: 203 88 110 56 80 237 160 75
Как видно, она включает те же данные, что и формировались нами прямо в тексте статьи при рассмотрении предыдущих примеров. Данные секции представляют собой исходный материал для формирования объектов типа Массивы Ключ/Значение. Для их загрузки с выполнением необходимых трансформаций можно использовать функцию mkz() (см. предыдущую ссылку).
Разметка
~d=mkz("*~mkz")
@vmt(d)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
x1 | 118 |
102 |
116 |
124 |
114 |
154 |
115 |
98 |
x2 | 106 |
50 |
54 |
42 |
36 |
106 |
88 |
46 |
y | 203 |
88 |
110 |
56 |
80 |
237 |
160 |
75 |
Теперь переменная d содержит двумерный массив, содержащий необходимые данные. Однако для использования рассмотренного выше алгоритма их надо трансформировать так, чтобы значения зависимой переменной (вектор у) оказались в отдельном массиве, а значения независимых переменных были бы скомпонованы в матрицу xt, в которой во всей первой строке проставлены единицы, а последующие строки заняты данными из строк x1 и x2 матрицы d. Для достижения этого результата можно выполнить следующие действия.
Разметка
~y=d('y')::Вектор y
@vvt(y)
~n=ke(y)
Количество элементов вектора y равно =n
~xt('x0')=zv(1,n)
~xt('x1')=d('x1')
~xt('x2')=d('x2')
::Матрица xt
@vmt(xt)
Вывод
Вектор y
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
203 |
88 |
110 |
56 |
80 |
237 |
160 |
75 |
Количество элементов вектора y равно 8
Матрица xt
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
x0 | 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
x1 | 118 |
102 |
116 |
124 |
114 |
154 |
115 |
98 |
x2 | 106 |
50 |
54 |
42 |
36 |
106 |
88 |
46 |
Для вычисления числа элементов вектора y использована функция ke(u) (синоним count), которая возвращает число элементов массива u. Для заполнения строки x0 единицами использована функция zv(z,n), возвращающая массив, содержащий n элементов, каждый из которых имеет значение z.
Теперь нужно ещё получить массив x путём транспонирования xt.
Разметка
~x=tm(xt)
@vmt(x)
Вывод
x0 |
x1 |
x2 |
|
0 |
1 |
118 |
106 |
1 |
1 |
102 |
50 |
2 |
1 |
116 |
54 |
3 |
1 |
124 |
42 |
4 |
1 |
114 |
36 |
5 |
1 |
154 |
106 |
6 |
1 |
115 |
88 |
7 |
1 |
98 |
46 |
Нужные для выполнения представленного алгоритма структуры данных сформированы и можно применить общую расчётную формулу.
Разметка
~q=mxv(mxm(om(mxm(tm(x),x)),tm(x)),y)
@vvt(q)
Вывод
x0 |
x1 |
x2 |
-79,8 |
0,634 |
1,99 |
В только что рассмотренном примере данные по каждой переменной располагались в отдельной строке. Такой подход хорошо пригоден для размещения небольших массивов данных. Для больших массивов более приемлем вариант, когда каждая переменная занимает отдельный столбец, а строки содержат соответствующие значения для каждой переменной. Подготовленные таким образом данные являются исходным материалом для формирования объектов типа Массивы структурированных записей.
С массивами структурированных записей также можно выполняться самые разные манипуляции, позволяющие подготовить необходимые для работы того или иного алгоритма структуры данных. Например, в данной статье имеется секция msz, содержащая следующие данные.
# rk:$p
@ x1 x2 y
118 106 203
102 50 88
116 54 110
124 42 56
114 36 80
154 106 237
115 88 160
98 46 75
@ x1 x2 y
118 106 203
102 50 88
116 54 110
124 42 56
114 36 80
154 106 237
115 88 160
98 46 75
Здесь содержатся те же данные, но в другом формате, в котором значения переменных размещены в отдельных колонках. Первая строка определяет, что разделителем колонок в каждой строке является пробел (rk:$p). Вторая строка определяет имена колонок (x1,x2,y). Далее следуют строки, в каждой из которых имеется по три числа. Первое - относится к переменной x1, второе - к x2, третье - к y.
Для загрузки таким образом организованного массива структурированных записей самым простым способом является использование функции msz() [подробнее см. Массивы структурированных записей. ].
Разметка
~d=msz("*~msz")
@vmt(d)
Вывод
x1 |
x2 |
y |
|
0 |
118 |
106 |
203 |
1 |
102 |
50 |
88 |
2 |
116 |
54 |
110 |
3 |
124 |
42 |
56 |
4 |
114 |
36 |
80 |
5 |
154 |
106 |
237 |
6 |
115 |
88 |
160 |
7 |
98 |
46 |
75 |
Вынимаем колонку y в отдельный массив.
Разметка
~y=mszpk(d,'y')
@vvt(y)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
203 |
88 |
110 |
56 |
80 |
237 |
160 |
75 |
Вставляем в массив xt строку из единиц и переносим в его строки x1 и x2 данные из одноимённых колонок d.
Разметка
~xt('x0')=zv(1,ke(y))
@xt('x1')=mszpk(d,'x1')
@xt('x2')=mszpk(d,'x2')
@vmt(xt)
Вывод
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
x0 | 1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
x1 | 118 |
102 |
116 |
124 |
114 |
154 |
115 |
98 |
x2 | 106 |
50 |
54 |
42 |
36 |
106 |
88 |
46 |
Получаем x транспонированием xt.
Разметка
~x=tm(xt)
@vmt(x)
Вывод
x0 |
x1 |
x2 |
|
0 |
1 |
118 |
106 |
1 |
1 |
102 |
50 |
2 |
1 |
116 |
54 |
3 |
1 |
124 |
42 |
4 |
1 |
114 |
36 |
5 |
1 |
154 |
106 |
6 |
1 |
115 |
88 |
7 |
1 |
98 |
46 |
Всё готово. Можно применять уже апробированную формулу.
Разметка
~p=mxv(mxm(om(mxm(tm(x),x)),tm(x)),y)
@vvt(p)
Вывод
x0 |
x1 |
x2 |
-79,8 |
0,634 |
1,99 |
Оцените публикацию по предложенной шкале