2013-12-05 7 views
6

У меня есть несколько данных в двух массивах numpy.расчет процентной ошибки путем сравнения двух массивов

a = [1, 2, 3, 4, 5, 6, 7] 
b = [1, 2, 3, 5, 5, 6, 7] 

Я говорю массив a мой вычисленный результат и массив b истинные значения результата. Я хочу рассчитать процент ошибки в моем результате. Теперь я могу пройти через два массива и сравнить их 0, если значения совпадают и 1 для несоответствия, затем добавить их, делить на общие значения и рассчитать процентную погрешность.

Возможно ли использовать более быстрый и элегантный способ для этого?

+0

Любой подход будет смотреть на все значения в обоих массивах правильно? –

+2

Возможно, вам необходимо предоставить дополнительную информацию о том, для чего это используется. Ваш алгоритм дает количество несоответствующих элементов. Может быть, вы хотите абсолютное значение несоответствий (тогда, возможно, использовать RMS). Или вы можете попробовать использовать корреляцию. Но это имеет смысл, зависит от того, для чего вы используете значение ошибки. –

+0

Да, вы правы. Возможно, мне удастся удалить слово «быстрее» из моего сообщения. –

ответ

4

Что-то вдоль линий:

>>> a = np.array([1, 2, 3, 5, 5, 6, 7]) 
>>> a = np.array([1, 2, 3, 4, 5, 6, 7]) 
>>> (a != b).sum()/float(a.size) 
0.14285714285714285 

Update Я буду Любопытным, почему это один несколько быстрее:

a = np.random.randint(4, size=1000) 
b = np.random.randint(4, size=1000) 
timeit('from __main__ import a, b; (a != b).sum()/float(a.size)', number=10000) 
# 0.42409151163039496 
timeit('from __main__ import a, b, np; np.mean(a != b)', number=10000) 
# 0.5342614773662717 
+2

'==' следует заменить на '! =', Потому что OP хочет получить процент ошибок. – falsetru

+3

'np.mean' cast' a! = B' как 'dtype = np.double' для операции накопления, которая занимает немного больше времени, когда вы просто суммируете' (a! = B) .sum() 'как' np. int'. Время '(a! = B) .sum (dtype = np.double)/float (a.size)' и 'np.mean (a! = B, dtype = np.int)' для примера. – Daniel

10

Сначала вычислим позиции, где a и b отличаются использованием a != b, затем найдите среднее из этих значений:

>>> import numpy as np 
>>> a = np.array([1, 2, 3, 4, 5, 6, 7]) 
>>> b = np.array([1, 2, 3, 5, 5, 6, 7]) 
>>> error = np.mean(a != b) 
>>> error 
0.14285714285714285 
+0

OP имеет разные 'b', возможно, стоит поменять ваш образец на него (и получить нулевую ошибку) – alko

+0

@alko: хорошо поймать, я обновил свой ответ, спасибо! – mdml

Смежные вопросы