前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法研习:Logistic算法原理分析

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

作者头像
深度学习与Python
发布2019-06-18 21:05:31
1.1K0
发布2019-06-18 21:05:31
举报

在这篇文章中,我将用数学解释逻辑回归,介绍逻辑回归、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 i%100==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个或更多个维度的情况时,决策边界是超空间。

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-12,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 深度学习与python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com