Numpy 对数损失和交叉熵损失的结果不同

Numpy 对数损失和交叉熵损失的结果不同,numpy,scikit-learn,cross-entropy,Numpy,Scikit Learn,Cross Entropy,逻辑回归的负对数似然由[…]给出,这也称为交叉熵误差函数 所以我试了一下,发现有点不同: from sklearn.metrics import log_loss y_true = [0, 0 , 0, 0] y_pred = [0.5, 0.5, 0.5, 0.5] log_loss(y_true, y_pred, labels=[0, 1]) # 0.6931471805599453 from math import log2 def cross_entropy(p, q): r

逻辑回归的负对数似然由[…]给出,这也称为交叉熵误差函数

所以我试了一下,发现有点不同:

from sklearn.metrics import log_loss
y_true = [0, 0 , 0, 0]
y_pred = [0.5, 0.5, 0.5, 0.5]
log_loss(y_true, y_pred, labels=[0, 1]) # 0.6931471805599453

from math import log2
def cross_entropy(p, q):
    return -sum([p[i]*log2(q[i]) for i in range(len(p))])
cross_entropy(y_true, y_pred) #-0.0

为什么?

首先,
sklearn.metrics.log\u loss
将自然对数(
math.log
numpy.log
)应用于概率,而不是以2为底的对数

第二,您显然得到了
-0.0
,因为在
y\u true
中将日志概率乘以零。对于二进制情况,日志丢失是

-logP(y_true, y_pred) = -(y_true*log(y_pred) + (1-y_true)*log(1-y_pred))
第三,您忘记在代码中计算日志丢失的平均值

从数学导入日志
def bin_cross_熵(p,q):
n=len(p)
返回-范围(n)内i的和(p[i]*log(q[i])+(1-p[i])*log(1-q[i])/n
bin_cross_熵(y_true,y_pred)#0.6931471805599453