Относительная ошибка между двумя матрицами - PullRequest
5 голосов
/ 12 октября 2011

Учитывая две матрицы с плавающей точкой в ​​R, я хотел бы получить относительную ошибку между каждой записью, а затем среди всех ошибок найти максимум всех из них и сравнить его с 10%, то есть MAX_ERROR <= 10%

Я знаю, что ошибка вычисления (для каждой записи):

|v_ij(MATRIX1) - v_ij(MATRIX2)| / | v_ij(MATRIX1)|

Как это сделать в R, избегая цикла for?

Ответы [ 4 ]

4 голосов
/ 12 октября 2011

Если вы хотите определить, какие элементы не прошли этот тест, попробуйте следующее:

over_err <- which( abs(MATRIX1-MATRIX2)/abs(MATRIX1) > 0.1, arr.ind=TRUE)

Если вы хотите отобразить список индексов и значений в MATRIX1, которые удовлетворяют (или не удовлетворяют) этому условию, тогда:

cbind(over_err, MATRIX1[over_err])
4 голосов
/ 12 октября 2011

Если вы хотите обработать случаи, когда в матрице есть нули (что в противном случае приводит к делению на ноль), у этого ответа есть несколько решений: Вы переназначаете == и! = На isTRUE (all.equal ())?

Небольшое изменение предложенной мной функции almostEqual даст:

relativeError <- function(x, y, tolerance=1e-8) {
  diff <- abs(x - y)
  mag <- pmax( abs(x), abs(y) )
  ifelse( mag > tolerance, diff/mag, diff)
}

m1 <- cbind(c(0,1), c(1,1))
m2 <- cbind(c(0,1), c(1,1.11)) 
any(relativeError(m1, m2) > 0.01) # TRUE

# Building on @DWin's answer:
which(relativeError(m1, m2) > 0.01, arr.ind=TRUE) # 2 2

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

3 голосов
/ 12 октября 2011

Должно работать следующее:

maxerr <- max(abs((a - b) / a))

, где a и b - две матрицы. Чтобы преобразовать результат в процент, умножьте на 100.

1 голос
/ 26 января 2017

Если Точная матрица M_exact и аппроксимированная матрица M_app; затем с помощью Mathematica процентная ошибка может быть рассчитана как

error(%) = 100(Norm[M_app - M_exact]/Norm[M_exact])

Для проверки относительной погрешности в матричном элементе

Relative_error = (Abs[M_app - M_exact])/Abs[M_exact]

Для более подробной информации: http://www.netlib.org/lapack/lug/node75.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...