代价函数
定义代价函数用来拟合逻辑回归的参数,这便是监督学习问题中的逻辑回归模型的拟合问题。
线性回归模型的代价函数是所有模型误差的平方和。理论上来说,对逻辑回归模型也可以沿用这个定义,但是问题在于,当我们将$h_\theta(x) = \frac{1}{1+e^{-\theta^TX}}$带入到这样的代价函数中时,得到的代价函数将是一个非凸函数(non-convex function)。
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
线性回归的代价函数为:
重新定义逻辑回归的代价函数为: ,其中
$h_\theta(x)$与$Cost(h_\theta(x), y)$之间的关系如下图所示:
这样构建的$Cost(h_\theta(x), y)$函数的特点是:
当实际的 y=1 且$h_\theta(x)$也为1 时误差为 0,当 y=1 但$h_\theta(x)$不为 1 时误差随着$h_\theta(x)$的变小而变大;
当实际的 y=0 且$h_\theta(x)$也为 0 时代价为 0,当 y=0 但$h_\theta(x)$不为 0 时误差随着 $h_\theta(x)$的变大而变大。
将构建的$Cost(h_\theta(x), y)$简化如下:
带入代价函数得到:
即:
牛刀小试
Todo: 补全下方的 cost 逻辑回归的代价函数
# 逻辑回归代价函数的Python代码实现:
import numpy as np
def cost(theta, X, y):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X * theta.T)))
# Todo: 补全 second
second = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
return np.sum(first - second) / (len(X))