算法研习:Logistic算法原理分析

2019-06-18 21:05:31 浏览数 (1)

在这篇文章中,我将用数学解释逻辑回归,介绍逻辑回归、sigmoid函数以及最大似然估计三者之间的关系。然后使用python中的梯度下降实现一个逻辑回归示例。本文主要包括五个问题:

1.什么是Logistic回归?

2.为什么不使用线性回归?

3.最大似然估计(MLE)

4.梯度下降

5.附python梯度下降实现代码

Logistic回归

Logistic回归是一种经典的统计模型,已广泛应用于学术界和工业界。与用于进行预测的线性回归不同,逻辑回归也用于解决分类问题。例如当一个人从银行申请贷款时,银行对申请人将来是否会违约非常感兴趣?(是/否问题)。解决此问题的一种方法是直接预测申请人的未来状态。这种方法称为感知。感知是另一个有趣的问题,它是SVM和神经网络的基础。另一种方法就是逻辑回归,对申请人违约概率进行预测。由于概率的性质,预测将落在[0,1]中。根据经验如果预测概率大于或等于0.5,那么我们可以标记为YES;如果预测概率小于0.5,那么我们可以标记为NO;然而线性回归的范围是从负无穷到正无穷,而不是[0,1]。要解决这个问题,就需要使用Sigmoid函数了。其函数表达式为:

Sigmoid函数具有许多属性。

因此在逻辑回归中,y可以写为:

记住这个表达式,下边我们会用到。

线性回归的缺点

“统计学习简介”一书给出了直截了当的解释。首先,线性回归的范围是概率边界[0,1]之外的。例如,如果通过线性回归和逻辑回归预测违约概率,则通过线性回归的一些预测概率甚至是负的,而逻辑回归不会出现这样的问题。见下图。

线性回归的另一个问题是预测值总是基数,如1,2,3,而不是类别。

最大似然估计

从整个人口总体中抽取一个样本。该样本遵循伯努利分布。

在该公式中,y是1或0,p是事件发生的概率。如果总共有N条记录,概率是多少呢?简而言之,假设每个根本是独立且相同分布的,我们可以将N个概率联系在一起。

然后在等式两边同时取对数得。

注意,在公式中的p是需要估计的参数(概率),p的表达式为:

这个公式熟悉吗?是的,这就是第1部分中的S形函数。在统计中,最大似然估计(MLE)通过找到最大似然函数的参数值来获得参数估计。在这个典型的例子,我们可以计算出参数p最大化对数似然,这也等于最小化成本函数Ĵ。这是凸优化中的双重问题。如果您有兴趣,我推荐Stephen Boyd和Lieven Vandenberghe的书Convex Optimization。成本函数为:

这就是似然函数、sigmoid函数以及逻辑回归损失函数三者之间的数学联系。

梯度下降

与具有封闭形式解的线性回归不同,逻辑回归采用梯度下降来寻找最优解。梯度下降的一般思想是迭代地调整参数以最小化成本函数。主要有三种梯度下降,包括批量梯度下降,小批量梯度下降和随机梯度下降。在本文中我们主要采用批量梯度下降。

根据我们定义的逻辑回归的成本函数J,得到其梯度是:

在第1部分中应用sigmoid函数的导数,然后我们可以得到梯度化简为:

最后,将初始值赋给w; 然后通过学习率*成本函数梯度迭代更新w,直到成本函数最小化。

附Python梯度下降实现

这一部分我将通过虹膜分类数据来展示梯度下降如何工作的。首先导入必要的python库。

代码语言:javascript复制
from sklearn import datasets
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines

接下来加载虹膜数据,这里只选用二分类。

代码语言:javascript复制
# Load data
iris = datasets.load_iris()
X=iris.data[0:99,:2]
y=iris.target[0:99]
# Plot the training points
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max()   .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max()   .5
plt.figure(2, figsize=(8, 6))

梯度下降计算过程

代码语言:javascript复制
#Step 1: Initial Model Parameter
Learning_Rate=0.01
num_iterations=100000
N=len(X)
w=np.zeros((2,1))
b=0
costs=[]
for i in range(num_iterations):
  #Step 2: Apply sigmoid Function and get y prediction
    Z=np.dot(w.T,X.T) b
    y_pred=1/(1 1/np.exp(Z))
  #Step 3: Calculate Cost Function
    cost=-(1/N)*np.sum(y*np.log(y_pred) (1-y)*np.log(1-y_pred))
  #Step 4: Calculate Gradient
    dw=1/N*np.dot(X.T,(y_pred-y).T)
    db=1/N*np.sum(y_pred-y)
  #Step 5: Update w & b
    w = w - Learning_Rate*dw
    b = b - Learning_Rate*db
   #Records cost
    if i0==0:
    costs.append(cost)
    print(cost)

可视化损失函数下降过程

代码语言:javascript复制
# Plot cost function
Epoch=pd.DataFrame(list(range(100,100001,100)))
Cost=pd.DataFrame(costs)
Cost_data=pd.concat([Epoch, Cost], axis=1)
Cost_data.columns=['Epoch','Cost']
plt.scatter(Cost_data['Epoch'], Cost_data['Cost'])
plt.xlabel('Epoch')
plt.ylabel('Cost')

从上图可以看出,损失函数先急剧下降; 经过40000次迭代后趋于稳定。

代码语言:javascript复制
# Plot linear classification
fig, ax = plt.subplots()
ax.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1,edgecolor='k')
line=mlines.Line2D([3.701,7],[2,4.1034],color='red')
ax.add_line(line)
ax.set_xlabel('Sepal length')
ax.set_ylabel('Sepal width')
plt.show()

图中的红线是线性决策边界。因为在这种情况下,数据只包含2个维度,因此决策边界是一条线。如果存在3个或更多个维度的情况时,决策边界是超空间。

0 人点赞