代价函数
定义代价函数用来拟合逻辑回归的参数,这便是监督学习问题中的逻辑回归模型的拟合问题。
线性回归模型的代价函数是所有模型误差的平方和。理论上来说,对逻辑回归模型也可以沿用这个定义,但是问题在于,当我们将hθ(x)=11+e−θTX带入到这样的代价函数中时,得到的代价函数将是一个非凸函数(non-convex function)。
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
线性回归的代价函数为:
J(θ)=1mm∑i=112(hθ(x(i))−y(i))2重新定义逻辑回归的代价函数为: J(θ)=1m∑mi=1Cost(hθ(x(i)),y(i)) ,其中
hθ(x)与Cost(hθ(x),y)之间的关系如下图所示:
这样构建的Cost(hθ(x),y)函数的特点是:
当实际的 y=1 且hθ(x)也为1 时误差为 0,当 y=1 但hθ(x)不为 1 时误差随着hθ(x)的变小而变大;
当实际的 y=0 且hθ(x)也为 0 时代价为 0,当 y=0 但hθ(x)不为 0 时误差随着 hθ(x)的变大而变大。
将构建的Cost(hθ(x),y)简化如下:
Cost(hθ(x),y)=−y×log(hθ(x))−(1−y)×log(1−hθ(x))
带入代价函数得到:
J(θ)=1m∑mi=1[−y(i)log(hθ(x(i)))−(1−y(i)log(1−hθ(x(i)))]
即:
J(θ)=−1m∑mi=1[y(i)log(hθ(x(i)))+(1−y(i)log(1−hθ(x(i)))]
牛刀小试
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))