Я тренирую глубокие нейронные сети, используя корреляцию Пирсона в качестве моей функции потери.Чтобы вычислить корреляцию Пирсона (p
) между предсказаниями и метками (для каждой партии), у меня есть два метода:
- Вычислить
p
строка за строкой и суммировать их, и разделить их наразмер пакета, чтобы получить среднее значение p
. - Вычислить
p
за один шаг: сгладить все прогнозы как x
, пометить как y
и вычислить p = pearson_loss(x,y)
.
Например, для ввода:
X = [[1,2],[3,4]]
и Y = [[-1,-2],[-3,-4]]
.
- Вычислить первый ряд, который равен
p1 = pearson_loss([1,2],[-1,-2])
, а затем второй ряд, p2 = pearson_loss([3,4],[-3,-4])
, и получить среднее значение p = (p1+p2)/2.
- Вычислить
p = pearson_loss([1,2,3,4], [-1,-2,-3,-4])
Есть ли у этих двух методов огромная разница?
PS: В Tensorflow я определил потерю Пирсона, используя Keras следующим образом (используйте метод 2):
def pearson_loss(x, y):
mx = K.mean(x)
my = K.mean(y)
xm, ym = x-mx, y-my
r_num = K.sum(tf.multiply(xm,ym))
r_den = K.sqrt(tf.multiply(K.sum(K.square(xm)), K.sum(K.square(ym))))
r = r_num / r_den
# ensure r is in range
r = K.maximum(K.minimum(r, 1.0), -1.0)
return -r