python机器学习——逻辑回归
我们知道感知器算法对于不能完全线性分割的数据是无能为力的,在这一篇将会介绍另一种非常有效的二分类模型——逻辑回归。在分类任务中,它被广泛使用
逻辑回归是一个分类模型,在实现之前我们先介绍几个概念:
几率(odds ratio):
\[
\frac {p}{(1-p)}
\]
其中p表示样本为正例的概率,当然是我们来定义正例是什么,比如我们要预测某种疾病的发生概率,那么我们将患病的样本记为正例,不患病的样本记为负例。为了解释清楚逻辑回归的原理,我们先介绍几个概念。
我们定义对数几率函数(logit function)为:
\[
logit(p) = log \frac {p}{(1-p)}
\]
对数几率函数的自变量p取值范围为0-1,通过函数将其转化到整个实数范围中,我们使用它来定义一个特征值和对数几率之间的线性关系为:
\[
logit(p(y=1|x)) = w_0x_0+w_1x_1+...+w_mx_m = \sum_i^nw_ix_i=w^Tx
\]
在这里,p(y=1|x)是某个样本属于类别1的条件概率。我们关心的是某个样本属于某个类别的概率,刚好是对数几率函数的反函数,我们称这个反函数为逻辑函数(logistics function),有时简写为sigmoid函数:
\[
\phi(z) = \frac{1}{1+e^{-z}}
\]
其中z是权重向量w和输入向量x的线性组合:
\[
z = w^Tx=w_0+w_1x_1+...+w_mx_m
\]
现在我们画出这个函数图像:
import matplotlib.pyplot as plt
import numpy as np
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
z = np.arange(-7, 7, 0.1)
phi_z = sigmoid(z)
plt.plot(z, phi_z)
plt.axvline(0.0, color='k')
plt.axhspan(0.0, 1.0, facecolor='1.0', alpha=1.0, ls='dotted')
plt.yticks([0.0, 0.5, 1.0])
plt.ylim(-0.1, 1.1)
plt.xlabel('z')
plt.ylabel('$\phi (z)$')
plt.show()

可以看出当z接近于正无穷大时,函数值接近1,同样当z接近于负无穷大时,函数值接近0。所以我们知道sigmoid函数将一个实数输入转化为一个范围为0-1的一个输出。
我们将逻辑函数将我们之前学过的Adaline联系起来,在Adaline中,我们的激活函数的函数值与输入值相同,而在逻辑函数中,激活函数为sigmoid函数。

sigmoid函数的输出被解释为某个样本属于类别1的概率,用公式表示为:
\[
\hat y=\begin{cases}1,\quad \phi(z)\ge 0.5 \\\\0,\quad otherwise\end{cases}
\]
也就是当函数值大于0.5时,表示某个样本属于类别1的概率大于0.5,于是我们就将此样本预测为类别1,否则为类别0。我们仔细观察上面的sigmoid函数图像,上式也等价于:
\[
\hat y=\begin{cases}1,\quad z\ge 0.0 \\\\0,\quad otherwise\end{cases}
\]
逻辑回归的受欢迎之处就在于它可以预测发生某件事的概率,而不是预测这件事情是否发生。
我们已经介绍了逻辑回归如何预测类别概率,接下来我们来看看逻辑回归如何更新权重参数w。
对于Adaline,我们的损失函数为:
\[
J(w) = \sum_i\frac12(\phi(z^{(i)})-y^{(i)})^2
\]
我们通过最小化这个损失函数来更新权重w。为了解释我们如何得到逻辑回归的损失函数,在构建逻辑回归模型时我们要最大化似然L(假设数据集中的所有样本都是互相独立的):
\[
L(w)=P(y|x,w)=\prod^n_{i=1}P(y^{(i)}|x^{(i)};w)=\prod^n_{i=1}(\phi(z^{(i)}))^{y^{(i)}}(1-\phi(z^{(i)}))^{1-y^{(i)}}
\]
通常我们会最大化L的log形式,我们称之为对数似然函数:
\[
l(w)=logL(w)=\sum_{i=1}^n\left[y^{(i)}log(\phi(z^{(i)})+(1-y^{(i)})log(1-\phi(z^{(i)}))\right]
\]
这样做有两个好处,一是当似然很小时,取对数减小了数字下溢的可能性,二是取对数后将乘法转化为了加法,可以更容易的得到函数的导数。现在我们可以使用一个梯度下降法来最大化对数似然函数,我们将上面的对数似然函数转化为求最小值的损失函数J:
\[
J(w)=\sum_{i=1}^n\left[-y^{(i)}log(\phi(z^{(i)}))-(1-y^{(i)})log(1-\phi(z^{(i)}))\right]
\]
为了更清晰的理解上式,我们假设对一个样本计算它的损失函数:
\[
J(\phi(z),y;w)=-ylog(\phi(z))-(1-y)log(1-\phi(z))
\]
可以看出,当y=0时,式子的第一部分为0,当y=1时,式子的第二部分为0,也就是:
\[
J(\phi(z),y;w)=\begin{cases}-log(\phi(z)),\quad if\ y=1 \\\\-log(1-\phi(z)),\quad if \ y=0\end{cases}
\]

可以看出,当我们预测样本所属于的类别时,当预测类别是样本真实类别的概率越大时,损失越接近0,而当预测类别是真实类别的概率越小时,损失越接近无穷大。
作为举例,我们这里对权重向量w中的一个分量进行更新,首先我们求此分量的偏导数:
\[
\frac{\partial }{\partial w_j}l(w) = \left(y\frac{1}{\phi(z)}-(1-y)\frac{1}{1-\phi(z)}\right)\frac{\partial }{\partial w_j}\phi(z)
\]
在继续下去之前,我们先计算一下sigmoid函数的偏导数:
\[
\frac{\partial }{\partial z}\phi(z) = \frac{\partial }{\partial z}\frac{1}{1+e^{-z}}=\frac{1}{(1+e^{-z})^2}e^{-z}=\frac{1}{1+e^{-z}}(1-\frac{1}{1+e^{-z}})\\=\phi(z)(1-\phi(z))
\]
现在我们继续:
\[
\left(y\frac{1}{\phi(z)}-(1-y)\frac{1}{1-\phi(z)}\right)\frac{\partial }{\partial w_j}\phi(z)\\=\left(y\frac{1}{\phi(z)}-(1-y)\frac{1}{1-\phi(z)}\right)\phi(z)(1-\phi(z))\frac{\partial }{\partial w_j}z\\=\left(y(1-\phi(z))-(1-y)\phi(z)\right)x_j\\=(y-\phi(z))x_j
\]
所以我们的更新规则为:
\[
w_j = w_j + \eta\sum^n_{i=1}\left(y^{(i)}-\phi(z^{(i)})\right)x_j^{(i)}
\]
因为我们要同时更新权重向量w的所有分量,所以我们更新规则为(此处w为向量):
\[
w = w+\Delta w\\\Delta w = \eta\nabla l(w)
\]
因为最大化对数似然函数也就等价于最小化损失函数J,于是梯度下降更新规则为:
\[
\Delta w_j=-\eta\frac{\partial J}{\partial w_j}=\eta\sum^n_{i=1}\left(y^{(i)}-\phi(z^{(i)})\right)x^{(i)}_j\\w=w+\Delta w,\Delta w=-\eta \nabla J(w)
\]
python机器学习——逻辑回归的更多相关文章
- 吴裕雄 python 机器学习——逻辑回归
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...
- python机器学习-逻辑回归
1.逻辑函数 假设数据集有n个独立的特征,x1到xn为样本的n个特征.常规的回归算法的目标是拟合出一个多项式函数,使得预测值与真实值的误差最小: 而我们希望这样的f(x)能够具有很好的逻辑判断性质,最 ...
- 机器学习_线性回归和逻辑回归_案例实战:Python实现逻辑回归与梯度下降策略_项目实战:使用逻辑回归判断信用卡欺诈检测
线性回归: 注:为偏置项,这一项的x的值假设为[1,1,1,1,1....] 注:为使似然函数越大,则需要最小二乘法函数越小越好 线性回归中为什么选用平方和作为误差函数?假设模型结果与测量值 误差满足 ...
- 机器学习---逻辑回归(二)(Machine Learning Logistic Regression II)
在<机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)>一文中,我们讨论了如何用逻辑回归解决二分类问题以及逻辑回归算法的本质.现在 ...
- 机器学习/逻辑回归(logistic regression)/--附python代码
个人分类: 机器学习 本文为吴恩达<机器学习>课程的读书笔记,并用python实现. 前一篇讲了线性回归,这一篇讲逻辑回归,有了上一篇的基础,这一篇的内容会显得比较简单. 逻辑回归(log ...
- 机器学习之使用Python完成逻辑回归
一.任务基础 我们将建立一个逻辑回归模型来预测一个学生是否被大学录取.假设你是一个大学系的管理员,你想根据两次考试的结果来决定每个申请人的录取机会.你有以前的申请人的历史数据,你可以用它作为逻辑回归的 ...
- 机器学习——逻辑回归(Logistic Regression)
1 前言 虽然该机器学习算法名字里面有"回归",但是它其实是个分类算法.取名逻辑回归主要是因为是从线性回归转变而来的. logistic回归,又叫对数几率回归. 2 回归模型 2. ...
- python机器学习《回归 一》
唠嗑唠嗑 依旧是每一次随便讲两句生活小事.表示最近有点懒,可能是快要考试的原因,外加这两天都有笔试和各种面试,让心情变得没那么安静的敲代码,没那么安静的学习算法.搞得第一次和技术总监聊天的时候都不太懂 ...
- 机器学习---逻辑回归(一)(Machine Learning Logistic Regression I)
逻辑回归(Logistic Regression)是一种经典的线性分类算法.逻辑回归虽然叫回归,但是其模型是用来分类的. 让我们先从最简单的二分类问题开始.给定特征向量x=([x1,x2,...,xn ...
随机推荐
- 机器学习:weka中添加自己的分类和聚类算法
不管是实验室研究机器学习算法或是公司研发,都有需要自己改进算法的时候,下面就说说怎么在weka里增加改进的机器学习算法. 一 添加分类算法的流程 1 编写的分类器必须继承 Classifier或是Cl ...
- 详解立即执行函数(function(){}()),(function(){})()
要知道这几种写法之间的区别,我们要先聊些题外话——js中函数的两种命名方式,即表达式和声明式. 函数的声明式写法为:function foo(){/*...*/},这种写法会导致函数提升,所有func ...
- Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)
简介 按照上一篇的计划,这一篇给小伙伴们分享一下测试方法. 一.设置参数 测试方法是可以带有参数的.每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递 ...
- WPF实现放大镜
这是一个之前遗留的问题.wpf里面有很多很多的东西,我以前用的真的只是其中很小的一个角落都不到. 需求背景:图片来源于相机拍摄,由于对像素要求,拍出来的图像素比较高,原图尺寸为30722048,以目前 ...
- 第三方软件 G6ftp提权
步骤 1.下载配置文件 将administrator 2.利用lcx 端口转发 默认只允许本机连接 3.lcx.exe -tran 8027 127.0.0.1 8021 4.使用客户端以管理员用户登 ...
- 15.Nginx动静分离Rewrite
1.什么是动静分离? 将动态请求和静态请求区分访问, 2.为什么要做动静分离? 静态由Nginx处理, 动态由PHP处理或Tomcat处理.... 因为Tomcat程序本身是用来处理jsp代码的,但t ...
- (day28)操作系统发展史+进程
目录 一.操作系统发展史 (一)穿孔卡片(手工操作) (二)批处理系统(磁带存储) 1. 联机批处理系统 2. 脱机批处理系统 (三)多道技术 二.进程 (一)程序和进程 (二)进程调度 1. 先来先 ...
- Java多线程编程(一)Java多线程技能
一.进程和多线程的概念以及线程的优点 打开Windo任务管理器可以看到很多正在运行着的exe程序,完全可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元. 线程可以理解成在进 ...
- Dubbo与Kubernetes集成
Dubbo应用迁移到docker的问题 Dubbo是阿里开源的一套服务治理与rpc框架,服务的提供者通过zookeeper把自己的服务发布上去,然后服务调用方通过zk获取服务的ip和端口,dubbo客 ...
- mysql数据迁徙详解
数据迁徙是每个后端都会遇到的工作之一,本文介绍了一些常见的数据迁徙方法与工具 mysqldump:数据结构不变的数据迁徙 导出数据 mysqldump -u root -p DATABASE_NAME ...