Ошибка «неконформируемых массивов» при вычитании или делении матриц - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть матрица 5x3 с именем matrixoutput:

matrixoutput <- structure(c(755.012517738809, 713.680227809506, 796.559832334474, 
720.586278415567, 813.656728335122, 747.228849872966, 716.763851131365, 
790.005405393554, 719.099072835892, 794.80633176412, 747.924859415065, 
714.405749195011, 792.123774606548, 719.75129988389, 793.458302292789
), .Dim = c(5L, 3L))

У меня есть матрица 5x1 с именем matrixactual:

matrixactual <- structure(c(743.2, 710.37, 787.77, 721.41, 808), .Dim = c(5L, 
1L))

Я пытаюсь запустить "MAPE"вычисление для каждого столбца в matrixoutput как таковое:

MAPE <- mean(abs((matrixactual-matrixoutput)/matrixactual) * 100)

Однако при этом возвращается ошибка:

Ошибка в matrixactual - вывод матрицы: несоответствующие массивы

Есть идеи об обходном пути?Я думаю, что есть простое исправление.

Ответы [ 3 ]

0 голосов
/ 16 сентября 2018

Проблема matrixactual-matrixoutput.Вы вычитаете матрицу 5x3 из матрицы 5x1.Таким образом, вычитание является операцией «один к одному» и требует объектов одинакового размера.Вы должны использовать sweep и colMeans, чтобы получить правильное количество измерений:

MAPE <- colMeans(abs(sweep(matrixoutput,1,matrixactual)))
0 голосов
/ 16 сентября 2018
matrixactual <- c(matrixactual)  ## I mean `base::c`
colMeans(abs((matrixactual - matrixoutput) / matrixactual) * 100)

"Правило переработки" работает за этим "-" и "/".


Иногда мы можем столкнуться с еще более непонятной ситуацией:

A <- matrix(1:15, 5, 3)
b <- array(1:5, dim = 5)
b
#[1] 1 2 3 4 5

b выглядит как вектор, но на самом деле это не так.Это одномерный массив с атрибутом "dim"."-" будет жаловаться на несоответствующее измерение.

A - b
#Error in A - b : non-conformable arrays

Используйте A - c(b), чтобы фактически использовать «правило переработки».

Также может произойти сбой "%*%".

A %*% b
#Error in A %*% b : non-conformable arguments

Решение - A %*% c(b).

1D массив возвращается функцией table, когда он используется водин вход.Так что моя разработка здесь просто хочет сказать: возможно, надежный кусок кода должен всегда проверять размерность.

0 голосов
/ 16 сентября 2018

Попробуйте

colMeans(abs(sweep(matrixoutput, 1, matrixactual)) / rep(matrixactual,3))

Ключевым моментом здесь является отслеживание размера. Вы можете легко вычесть матрицы одного и того же размера друг из друга, но когда размеры отличаются, это становится сложно. В вашем случае R выдал вам сообщение об ошибке, когда вы пытались вычесть вектор из матрицы.

Здесь sweep(a, 1, b) удаляет каждое значение в b из соответствующей строки в a. Затем вам нужно разделить объект, размер которого выровнен по matrixoutput, что имеет место, если вы повторите matrixactual три раза.

Альтернативой будет

colMeans((matrixoutput - rep(matrixactual, 3)) / rep(matrixactual,3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...