逻辑回归(Logistic Regression)(二)

代价函数(Cost Function)

代价函数的常见形式(cont)

这里接着上篇的内容(逻辑回归(Logistic Regression)(一))写。我们上次说到了逻辑回归中的代价函数 J(\theta) :

  • J(\theta) = -\frac{ 1 }{ m }[\sum_{ i=1 }^{ m } ({y^{(i)} \log h_\theta(x^{(i)}) + (1-y^{(i)}) \log (1-h_\theta(x^{(i)})})]

但是我们会疑问,为什么这么定义代价函数呢?下面我会简单的解释一下:

对于单个的样本来讲, J(\theta) 所对应的 C(\theta) 为:

  • C(\theta)={y log h_\theta(x) + (1-y) \log (1-h_\theta(x)})]

上面的方程等价于:

  • C(\theta) = \{_{-log(1-h_\theta(x)), y=0}^{-log(h_\theta(x)),y=1}, where: h_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}

y=1 时:

  • C(\theta)= -log(h_\theta(x))

其函数图像为:



从图中可以看出, y=1 ,当预测值 h_\theta(x)=1 时,可以看出代价h_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}函数 C(\theta) 的值为0,这正是我们希望的。如果预测值 h_\theta(x)=1 P(y=1|x;\theta)=0 ,意思是预测 y=1 的概率为0,但是事实上 y=1 ,因此代价函数 C(\theta)=\infty 相当于给学习算法一个惩罚。

同理,我们也可以画出当 y=0 时, 函数 C(\theta) 的图像:



代价函数与参数

代价函数衡量的是模型预测值h(θ) 与标准答案y之间的差异,所以总的代价函数J是h(θ)和y的函数,即,J=f(h(θ), y)。又因为y都是训练样本中给定的,h(θ)有θ决定,所以,最终还是模型参数θ的改变导致了J的改变。对于不同的θ,对应不同的预测值h(θ),也就对应着不同的代价函数J的取值。变化过程为:

  • \theta -> h(\theta), y -> J(\theta)

为了更直观的看到参数对代价函数的影响,举个简单的例子:

有训练样本{(0, 0), (1, 1), (2, 2), (4, 4)},即4对训练样本,每个样本中第1个是x的值,第2个是y的值。这几个点很明显都是y=x这条直线上的点。如下图:


import matplotlib.pyplot as plt
import numpy as np
X = np.array([[0, 1, 2, 4]]).T  # 都转换成列向量
y = np.array([[0, 1, 2, 4]]).T
theta1 = np.array([[0, 0]]).T  # 三个不同的theta_1值
theta2 = np.array([[0, 0.5]]).T
theta3 = np.array([[0, 1]]).T
X_size = X.shape
X_0 = np.ones((X_size[0],1))  # 添加x_0
X_with_x0 = np.concatenate((X_0, X), axis=1)
h1 = np.dot(X_with_x0, theta1)
h2 = np.dot(X_with_x0, theta2)
h3 = np.dot(X_with_x0, theta3)
plt.plot(X, y, 'rx', label='y')
plt.plot(X, h1, 'b', label='h1, theta_1=0')
plt.plot(X, h2, 'm', label='h2, theta_1=0.5')
plt.plot(X, h3, 'g', label='h3, theta_1=1')
plt.xlabel('X')
plt.ylabel('y/h')
plt.axis([-0.1, 4.5, -0.1, 4.5])
plt.legend(loc='upper left')
plt.savefig('liner_gression_error.png', dpi=200)

常数项为0,所以可以取θ0=0,然后取不同的θ1,可以得到不同的拟合直线。当θ1=0时,拟合的直线是y=0,即蓝色线段,此时距离样本点最远,代价函数的值(误差)也最大;当θ1=1时,拟合的直线是y=x,即绿色线段,此时拟合的直线经过每一个样本点,代价函数的值为0。

通过下图可以查看随着θ1的变化,J(θ)的变化情况:


# 计算代价函数的值
def calcu_cost(theta, X, y):
    m = X.shape[0]  # sample size
    X_0 = np.ones((m,1))
    X_with_x0 = np.concatenate((X_0, X), axis=1)
    h = np.dot(X_with_x0, theta)
    return(np.dot((h-y).T, (h-y))/(2*m))

X = np.array([[0, 1, 2, 4]]).T
y = np.array([[0, 1, 2, 4]]).T
theta_0 = np.zeros((101, 1))
theta_1 = np.array([np.linspace(-2, 4, 101)]).T
theta = np.concatenate((theta_0, theta_1), axis=1)  # 101组不同的参数
J_list = []
for i in range(101):
    current_theta = theta[i:i+1].T
    cost = calcu_cost(current_theta, X, y)
    J_list.append(cost[0,0])
plt.plot(theta_1, J_list)
plt.xlabel('theta_1')
plt.ylabel('J(theta)')
plt.savefig('cost_theta.png', dpi=200)

从图中可以很直观的看到θ对代价函数的影响,当θ1=1时,代价函数J(θ)取到最小值。因为线性回归模型的代价函数(均方误差)的性质非常好,因此也可以直接使用代数的方法,求J(θ)的一阶导数为0的点,就可以直接求出最优的θ值。

代价函数与梯度

梯度下降中的梯度指的是代价函数对各个参数的偏导数,偏导数的方向决定了在学习过程中参数下降的方向,学习率(通常用α表示)决定了每步变化的步长,有了导数和学习率就可以使用梯度下降算法(Gradient Descent Algorithm)更新参数了, 即求解使 J(\theta) 最小的参数 \theta :

  • \theta_j = \theta_j - \alpha (\frac {\partial}{\partial \theta_j})J(\theta)=\theta_j - \alpha (\frac{1}{m})\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}

看来其和线性回归中的梯度下降函数形式一模一样,但其实是不一样的,因为在logistic回归中 h_\theta(x)=\frac{1}{1+e^{-\theta^Tx}}

关于从 \theta_j = \theta_j - \alpha (\frac {\partial}{\partial \theta_j})J(\theta)\theta_j =\theta_j - \alpha (\frac{1}{m})\sum_{i=1}^{m}(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)} 推导如下:




Reference:

[机器学习] Coursera ML笔记 - 逻辑回归(Logistic Regression)

sigmoid函数详解_mmmmmm_新浪博客

逻辑斯谛回归之决策边界 logistic regression -- decision boundary

【机器学习】代价函数(cost function)

编辑于 2017-08-09