逻辑回归的学习笔记(含公式推导和代码)

目录

前言

逻辑回归的用途?

逻辑回归的原理?

1、数据集

2、模型的表示

3、训练模型

(1)目标函数

(2)梯度下降法



前言

       因为研究生的方向是偏向nlp的,所以决定在从机器学习入手好好学习一下相关知识,以便有一些理论基础。其实之前在本科零零碎碎都是学习过一些逻辑回归的相关知识,吴恩达的机器学习视频监督学习部分也看了一遍,但是总感觉有些东西还是理解不够充分(明明是一个基础的模型,可能是我太笨了orz,学习知识总是要学习好几遍才能大概看得懂,嘤嘤嘤!),最近再次学习逻辑回归,对其有了更加深刻的理解,所以写一个博客记录一下。

逻辑回归的用途?

逻辑回归主要的作用是用于机器学习中的二分类问题。

      打一个的比方:给我1000个女孩子信息,每个女孩子的信息包含{长相,身高,年龄,体重,胸},每个女孩子给我两种选择0:不喜欢,1:喜欢,我通过自己的审美将这1000个女孩子分为喜欢和不喜欢两种类别,然后将1000个女生的信息(数据)和我的分类结果(数据的标签)给逻辑回归模型去训练,训练结束后,再新给一个女生信息{好看,168,22,55,大},训练好的逻辑回归模型就可以根据这些信息来判断我是否会喜欢这个女孩了(虽然傻子都知道我会喜欢orz,因为我的要求是女的,活的hhhhh),该例子纯属举例,并无其他恶意用途。

逻辑回归的原理?

言归正传,我来说一下我对逻辑回归原理的理解。

1、数据集

首先介绍数据集,包含的特征{长相,身高,年龄,体重,胸}

x_1={好看,158,25,60,小}        y_1={不喜欢}

x_2={不好看,165,24,65,大}     y_2={不喜欢}

......                                                  ......

x_{1000}={好看,168,20,55,小}   y_{1000}={喜欢}

x表示女生的特征信息,y表示我是否喜欢的标签。

 

2、模型的表示

       我们可以用条件概率来表示这个问题:p(Y=y_i|X=x_i)  , x_i表示第i条数据,y_i表示第i条数据的标签信息。

例如:P(Y=y_{1000})|X=x_{1000})=P(y={喜欢}|x={好看,168,20,55,小})

意思是:在给定女生的特征信息为{好看,168,20,55,小}的条件下,我喜欢这种类型的概率。

 

      很明显P(Y=y_{1000})|X=x_{1000})应该等于1,因为训练数据中,给定女生的特征信息为{好看,168,20,55,小},我是喜欢,所以再次出现一个{好看,168,20,55,小}这些特征信息的女生,我一定还是会喜欢的,所以条件概率P(y={喜欢}|x={好看,168,20,55,小})=1。

 

      问题在于我们如何用一个式子来表示p(Y=y_i|X=x_i)呢?

答:我们需要寻找一个p(Y=y_i|X=x_i)\rightarrow f(x_i)的映射关系。

 

一种通常的做法是使用线性组合的方式来表示:f(x_i) = W^Tx_i+b

W表示权重值的列向量{[w_1,w_2,w_3...,w_n]}^T,W^T就是W转置之后变成了行向量[w_1,w_2,w_3...,w_n],n表示特征种数,此处的n为5,总共有5种特征分别是{长相,身高,年龄,体重,胸}b是一个实数。

f(x_i) = W^Tx_i+b = w_1{x_i}^{(1)}+w_2{x_i}^{(2)}+w_3{x_i}^{(3)}+w_4{x_i}^{(4)}+w_5{x_i}^{(5)}+b     

可以简单理解为:w代表特征的重要性,w_1代表长相的重要性,w_2代表身高的重要性,依次类推。x_i表示数据集中的第i条数据,{x_i}^{(1)}表示第i条数据第一个特征的值,在例子中为第i条数据中长相的值,{x_i}^{(2)}表示第i条数据中身高的值,依次类推

例如如果w_5很大,就代表胸这个特征很重要。如果某个女生胸很大的话,可能其他长相,身高等特征都不用看了,直接可以判断结果为喜欢。(听听这是什么虎狼之词orz)。

在逻辑回归中需要使用f(x_i)来表示概率p(Y=y_i|X=x_i)的大小。

但是p(Y=y_i|X=x_i)\epsilon (-\infty,+\infty) 而f(X)\epsilon (-\infty,+\infty)

因此需要用一种方法来将f(X)转换一下使值域变为(-\infty,+\infty).

 

众人不解道:那什么方法可以达到这种效果呢?

kingpopen抚须笑曰:哈哈哈,sigmoid函数可助你达此功效!

 

如下图所示(有一说一设计出sigmoid函数的人是真的clever)

 

sigmoid函数的定义域为(-\infty,+\infty),值域为(0,1),在f(X)外面套上一个sigmoid函数就可以使得值域变为(-\infty,+\infty)

p(Y=y_i|X=x_i)=sigmoid(f(x_i)) = \frac{1}{(1+e^{-({W^Tx_i+b})})} \epsilon (-\infty,+\infty)

3、训练模型

模型我们已经知道该用什么表示了,接下来该通过已有的数据训练模型了。

训练模型的目的是学习出参数W^Tb的值,也就是学习{长相,身高,年龄,体重,胸}这些特征的重要性。

(1)目标函数

确定训练的目标函数:O(w,b) = \prod_{i = 1}^{N} {p(Y=y_i|X=x_i;w,b)}   用到了极大似然估计的方法。

可以理解为出现给定的这个训练集的概率是:每一条训练数据概率的乘积之和。而我们的目标是最大化这个乘积。

 

又到了大家最讨厌的公式推导环节嘤嘤嘤!(突然感觉LaTex打公式还是挺方便的orz)

用0表示y标签中的不喜欢,1表示y标签中的喜欢,y_i\epsilon \{0,1\}(真实的写代码环节我们会用数字表示y标签和x中各特征)

记:

p(Y=1|X=x_i;w,b)=sigmoid(f(x_i)) = \frac{1}{(1+e^{-({W^Tx_i+b})})}       

p(Y=0|X=x_i;w,b)=sigmoid(f(x_i)) =1- \frac{1}{(1+e^{-({W^Tx_i+b})})}

因此合并一下(看不懂的带个y_i的值进去试一试):p(Y=y_i|X=x_i)= p(Y=1|X=x_i)^{y_i}*p(Y=0|X=x_i)^{1-y_i}

 p(Y=y_i|X=x_i;w,b)中 “;”后面的的w,b表示这个模型的参数是w和b。

\mathop{\arg\max}\limits_{w,b}O(w,b) =\mathop{\arg\max}\prod_{i = 1}^{N} {p(Y=y_i|X=x_i;w,b)} \\ \\ =\mathop{\arg\min}\limits_{w,b} - \prod_{i = 1}^{N} {p(Y=y_i|X=x_i;w,b)} \\ \\ = \mathop{\arg\min}\limits_{w,b}-log\prod_{i = 1}^{N} {p(Y=y_i|X=x_i;w,b)} \\ \\ = \mathop{\arg\min}\limits_{w,b}-\sum_{i = 1}^{N} log[{p(Y=y_i|X=x_i;w,b)}] \\ \\ =\mathop{\arg\min}\limits_{w,b}-\sum_{i = 1}^{N} {y_i}\log{p(Y=1|X=x_i)}+({1-y_i})\log{p(Y=0|X=x_i)}

我们记L(w,b) =-\sum_{i = 1}^{N} {y_i}\log{p(Y=1|X=x_i)}+({1-y_i})\log{p(Y=0|X=x_i)}为损失函数(是不是就是交叉熵!)。

 

众人不解道:如何使损失函数最小化呢?

kingpopen抚须笑曰:哈哈哈,梯度下降法!

众人又不解道:何为梯度下降法?

kingpopen:卒!

 

(2)梯度下降法

梯度下降法的原理我就不啰嗦了(网上资料一大把),过程无非就是求导数。

L(w,b) =-\sum_{i = 1}^{N} {y_i}\log{p(Y=1|X=x_i)}+({1-y_i})\log{p(Y=0|X=x_i)}

为方便表示记\sigma (x) = sigmoid(x)  (sigmoid字太多了懒得打)

\frac{\Delta \sigma (x)}{\Delta x} = \sigma (x) *[1-\sigma (x)]

对损失函数中w和b分别进行求导:

\frac{\partial L(w,b)}{\partial w} = -\sum_{i = 1}^{N} [y_i\frac{x_i\sigma (W^Tx_i+b)[1-\sigma (W^Tx_i+b)]}{\sigma (W^Tx_i+b)} - (1-y_i)\frac{x_i\sigma (W^Tx_i+b)[1-\sigma (W^Tx_i+b)]}{1-\sigma (W^Tx_i+b)}] \\ \\ =-\sum_{i = 1}^{N} [y_ix_i(1-\sigma (W^Tx_i+b)) - (1-y_i)x_i\sigma (W^Tx_i+b)] \\ \\ = -\sum_{i = 1}^{N} [y_ix_i-y_ix_i\sigma (W^Tx_i+b) - x_i\sigma (W^Tx_i+b)+y_ix_i\sigma (W^Tx_i+b)] \\ \\ = -\sum_{i = 1}^{N} x_i[y_i-\sigma (W^Tx_i+b)] \\ \\ = \sum_{i = 1}^{N} x_i[\sigma (W^Tx_i+b)-y_i]

对b的求导和对w的类似:

\frac{\partial L(w,b)}{\partial b} = -\sum_{i = 1}^{N} [y_i\frac{\sigma (W^Tx_i+b)[1-\sigma (W^Tx_i+b)]}{\sigma (W^Tx_i+b)} - (1-y_i)\frac{\sigma (W^Tx_i+b)[1-\sigma (W^Tx_i+b)]}{1-\sigma (W^Tx_i+b)}] \\ \\ =-\sum_{i = 1}^{N} [y_i(1-\sigma (W^Tx_i+b)) - (1-y_i)\sigma (W^Tx_i+b)] \\ \\ = -\sum_{i = 1}^{N} [y_i-y_i\sigma (W^Tx_i+b) - \sigma (W^Tx_i+b)+y_i\sigma (W^Tx_i+b)] \\ \\ = -\sum_{i = 1}^{N} y_i-\sigma (W^Tx_i+b) \\ \\ = \sum_{i = 1}^{N} \sigma (W^Tx_i+b)-y_i

然后根据梯度下降算法

\hspace*{10pt} for \quad k \quad in \quad iteration:\\ \\ \hspace*{2cm}w_{k+1} = w_k - \eta \frac{\partial L(w,b)}{\partial w} \\ \\ \hspace*{2cm}b_{k+1} = b_k - \eta \frac{\partial L(w,b)}{\partial b}

iteration是迭代的次数,\eta是学习率。(都是超参数可以自己手动设置!)

 

最终学习出模型的参数w,b,当给出一个新的女生信息{好看,168,22,55,大}(我可以!!!),就可以通过模型判断是否会喜欢这种类型啦!

 

最后"Talk is cheap , show me the code",我简单实现了一下逻辑回归,数据集是鸢尾花的,写得超烂,不过正常逻辑应该没问题。

祭出我的porn(emmmm),哦不是,是祭出我的github:https://github.com/Kingpopen/Machine-Learning  欢迎大家拍砖!

之前是在p站(emmmm),哦,不是,是b站看到一个讲解逻辑回归的视频感觉讲得挺好,我的理解也是根据那个讲解来的,不过那个视频好像已经被删掉了orz。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值