4.2.4 逻辑回归的损失函数
逻辑回归中的Sigmoid函数可用于使值域保持在(0,1)之间,结合之前所讲的线性回归,我们所得到的完整的公式其实是:
θ0+θ1x1+θ2x2+…+θnxn就是之前所介绍的多元线性回归。
现在的问题就比较简单明了了,对于给定的样本数据集X,y,我们如何找到参数theta,来获得样本数据集X所对应的分类输出y(通过p的概率值)?
若要求解上述这个问题,我们需要先了解下逻辑回归中的损失函数,假设我们的预测值为:
假设损失函数分为下面两种情况,y表示真值;y_predict表示为预测值:
结合上述两个假设,我们来分析下,当真值y为1的时候,p的概率值越小(越接近0),说明y的预测值(y_predict)越偏向于0,损失函数cost就应该越大;当真值y为0的时候,如果这个时候p的概率值越大,则同理得到的损失函数cost也应该越大。
在数学上,我们希望使用一个函数来表示这种现象,可以使用如下这个函数: 下面我们解释一下这个函数,为了更直观地观察上述两个函数,我们通过Python中的Numpy以及Matplotlib库绘制该函数。
首先,我们绘制下-log(p_predict)if y=1,代码如下: import numpy as np
import matplotlib.pyplot as pltdef logp(x):
y = -np.log(x)
return y
plot_x = np.linspace(0.001, 1, 50) #取0.001避免除数为0
plot_y = logp(plot_x)
plt.plot(plot_x, plot_y)
plt.show() if y=1时,损失函数的效果如图4-11所示。
损失函数if y=1 当p=0的时候,损失函数的值趋近于正无穷,根据可知,y的预测值(y_predict)偏向于0,但实际上我们的真值y为1。
当p达到1的时候,y的真值与预测值相同,我们能够从图中观察到损失函数的值趋近于0代表没有任何损失。
下面,我们再来绘制一下-log(1-p_predict)if y=0,代码如下: import numpy as np
import matplotlib.pyplot as plt
def logp2(x):
y = -np.log(1-x)
return y
plot_x = np.linspace(0, 0.99, 50) #取0.99避免除数为0
plot_y = logp2(plot_x)
plt.plot(plot_x, plot_y)
plt.show() if y=0时,损失函数的损失函数if y=0 当p=1的时候,损失函数的值趋近于正无穷,根据可知,y的预测值(y_predict)偏向于1,但实际上我们的真值y为0。
当p达到0的时候,y的真值与预测值相同,我们能够从图中观察到损失函数的值趋近于0代表没有任何损失。
我们再稍微整理下这两个函数,使之合成一个损失函数: 下面稍微解释下这个函数,当y=1的时候,后面的式子
(1-y)log(1-p_pre dict),就变为了0,所以整个公式就变成了-ylog(p_predict);
当y=0的时候,前面的式子-ylog(p_predict)变为了0,整个公式就变成了-log(1-p_predict)。
最后,对于m个样本,求一组值使得损失函数最小。公式如下: (其中,ppredict=sigmoid(θT·xb),·θT代表了θ0x0+θ1x1+θ2x2+…+θnxn;x0恒等于1;θT为列向量)。
当公式变为上述形式的时候,对于我们来说,只需要求解一组θ使得损失函数最小就可以了,那么,对于如此复杂的损失函数,我们一般还是使用梯度下降法进行求解。
网友评论