[机器学习]-逻辑回归-原理及代码实现(含数据)

提出问题

二分类问题

图像的宽x,高y,根据x和y的大小,将图像分为横向图片和纵向图片

宽x 高y 形状label
80 150 纵向
60 110 纵向
35 130 纵向
160 50 横向
160 20 横向
125 30 横向

逻辑回归-概率分类

sigmoid函数

sigmoid函数的由来

几率事件发生的概率除以未发生的概率 ,设p为事件发生的概率,则(1-p)为事件未发生的概率。此时:

odds =\frac{p}{1-p}

定义域:p\in[0,1];值域:odds\in[0,+\infty)

将上式取对数,可以将其扩展到实数空间 ,就是logit函数

logit(p) = log_e(odds)=log_e(\frac{p}{1-p})

定义域:p\in(0,1);值域:logit(p)\in(-\infty,+\infty)

由于logit函数和线性回归模型在同一取值范围内,因此,可以用线性回归模型来表示logit函数:

logit(p)=\theta_1x_1+\theta_2x_2+bias

\theta_1x_1+\theta_2x_2+bias=z

则:

logit(p)=log_e(\frac{p}{1-p})=z

对上式等号两边取e:

\frac{p}{1-p}=e^z\\ p=(1-p)e^z=e^z-pe^z \\ p = \frac{e^z}{1+e^z}=\frac{1}{1+e^{-z}}

至此,得到了sigmod函数,用来将线性回归模型 输出的实数空间取值映射成为概率

sigmoid函数的一般表达式如下:

g(z)=\frac{1}{1+e^{-z}}

sigmoid函数图像

sigmoid

sigmoid函数性质
定义域:(- \infty, + \infty)
值域:(0, 1)
z=0, g(z)=0.5
z<0, g(z)<0.5
z>0, g(z)>0.5

sigmoid导数性质
g^{'}=g(1-g)

sigmoid函数的优势
    1. 引入了非线性映射,将线性回归(- \infty, + \infty)的值域映射到(0, 1)之间,符合概率值区间[0, 1]
    2. 大于0.5表示阳性,小于0.5表示阴性,有助于直观地做出预测类型的判断
    3. 数学特性好,便于求导

借助sigmoid函数,生成逻辑回归模型表达式 为:

f_{\theta}(x)=g(\theta^Tx)=\frac{1}{1+exp(-\theta^Tx)}

其中:

\theta^Tx=\theta_0+\theta_1x_1+\theta_2x_2+\theta_3x_3+\cdots+\theta_nx_n

该式表现为多元线性回归(含有n个参数)的模式。这也是逻辑回归中,回归二字的来源。

因为 0<f_\theta(x)<1,因此,上式可以作为概率来使用。


决策边界

定义概率计算式为:

\begin{aligned} P(y=1|\vec{x}) &=f_\theta(\vec{x})\\ P(y=0|\vec{x}) &=1-f_\theta(\vec{x}) \end{aligned}

该式含义:已知\vec{x}数据的条件下,y=1的概率为f_\theta(\vec{x})。假设计算得到f_\theta(\vec{x})=0.8,则说明数据\vec{x}对应的类别y1的概率为0.8

分类标准如下:(1:横向;0:纵向)

y=\begin{cases} 1\quad&(f_\theta(\vec{x})\ge0.5)\\ 0\quad&(f_\theta(\vec{x})<0.5) \end{cases}

根据逻辑回归模型表达式的定义,上式可改写为

y=\begin{cases} 1\quad&(\theta^Tx\ge0)\\ 0\quad&(\theta^Tx<0) \end{cases}

将分类条件改为这种写法的意义在于:\theta^Tx=0将作为分类边界 ,实现二分类的目的。

决策边界:用于数据分类的直线称为决策边界。上述讨论中的 \theta^Tx=0就是逻辑回归模型的决策边界。

为了获得合理的决策边界,即求得正确的参数\vec\theta,需要定义目标函数 ,进行微分,获得参数更新表达式 ,然后利用现有数据,不断更新\vec\theta来得到正确的决策边界。该过程即为逻辑回归模型。


似然函数(目标函数)

按照前述分析:

  • 当y=1时,我们希望概率P(y=1|\vec{x})是最大的
  • 当y=0时,我们希望概率P(y=0|\vec{x})是最大的

对于全部示例数据,有如下信息:

图像大小 形状label x_1 x_2 y 概率
80 x 150 纵向 80 150 0 期待P(y=0|\vec{x})最大
60 x 110 纵向 60 110 0 期待P(y=0|\vec{x})最大
35 x 130 纵向 35 130 0 期待P(y=0|\vec{x})最大
160 x 50 横向 160 50 1 期待P(y=1|\vec{x})最大
160 x 20 横向 160 20 1 期待P(y=1|\vec{x})最大
125 x 30 横向 125 30 1 期待P(y=1|\vec{x})最大

假定所有的训练数据都互不影响、独立发生。这样的话,整体的概率可用下面的联合概率来表示:

L(\vec\theta)=P(y^{(1)}=0|\vec{x}^{(1)})\cdot P(y^{(2)}=0|\vec{x}^{(2)})\cdot P(y^{(3)}=0|\vec{x}^{(3)})\cdot P(y^{(4)}=1|\vec{x}^{(4)})\cdot P(y^{(5)}=1|\vec{x}^{(5)})\cdot P(y^{(6)}=1|\vec{x}^{(6)})

更一般化的写法如下:

L(\vec\theta)=\prod_{i=1}^{m}P(y^{(i)}=1|\vec{x}^{(i)})^{y^{(i)}}\cdot P(y^{(i)}=0|\vec{x}^{(i)})^{1-y^{(i)}}\tag{1}

关键点:这个表达式利用了任何数的0次方都是1的特性。结合二分类的类别分别取0和1,得到所有样本概率乘积的统一表达式。

m:表示共有m个样本。

这里的目标函数L(\vec\theta)也被称为似然L 取自似然的英文单词Likelihood

回归的时候,处理的是误差,因此需要使误差最小化。

现在考虑的是联合概率,我们希望概率尽可能大,所以更新参数的目标是使得概率尽可能大。


对数似然函数

上述目标函数(似然函数)直接求微分比较困难,是因为:(取对数的原因)
    1. 联合概率都是小于1的,其乘积会更小,若值太小,编程时会出现精度问题
    2. 乘法相比于加法,计算量要大很多

因此需要在微分前,对函数进行变形,即:取似然函数的对数

取对数的可行性:对数函数是单调递增的,要获取 L(\theta)的最大值,即获取 logL(\theta)的最大值

对式(1)取自然对数,得到对数似然函数如下所示:

\begin{aligned} L(\vec\theta) &=\prod_{i=1}^{m}P(y^{(i)}=1|\vec{x}^{(i)})^{y^{(i)}}\cdot P(y^{(i)}=0|\vec{x}^{(i)})^{1-y^{(i)}}\\ log\left(L(\vec\theta)\right) &=log\left(\prod_{i=1}^{m}P(y^{(i)}=1|\vec{x}^{(i)})^{y^{(i)}}\cdot P(y^{(i)}=0|\vec{x}^{(i)})^{1-y^{(i)}}\right)\\ &=\sum_{i=1}^{m}log\left(P(y^{(i)}=1|\vec{x}^{(i)})^{y^{(i)}}\cdot P(y^{(i)}=0|\vec{x}^{(i)})^{1-y^{(i)}}\right)\\ &=\sum_{i=1}^{m}\left(log(P(y^{(i)}=1|\vec{x}^{(i)})^{y^{(i)}}) + log(P(y^{(i)}=0|\vec{x}^{(i)})^{1-y^{(i)}})\right)\\ &=\sum_{i=1}^{m}\left({y^{(i)}}\cdot log(P(y^{(i)}=1|\vec{x}^{(i)})) + ({1-y^{(i)}})\cdot log(P(y^{(i)}=0|\vec{x}^{(i)}))\right)\\ &=\sum_{i=1}^{m}\left({y^{(i)}}\cdot log(P(y^{(i)}=1|\vec{x}^{(i)})) + ({1-y^{(i)}})\cdot log(1-P(y^{(i)}=1|\vec{x}^{(i)}))\right)\\ &=\sum_{i=1}^{m}\left({y^{(i)}}\cdot log(f_\theta(\vec{x}^{(i)})) + ({1-y^{(i)}})\cdot log(1-f_\theta(\vec{x}^{(i)}))\right)\\ \end{aligned}

综上:逻辑回归使用如下的对数似然函数作为目标函数:

logL(\theta)=\sum_{i=1}^{m}\left({y^{(i)}}\cdot log(f_\theta(x^{(i)})) + ({1-y^{(i)}})\cdot log(1-f_\theta(x^{(i)}))\right)

逻辑回归参数学习更新的算法通常为梯度下降法拟牛顿法 ,这里采用梯度下降法,求导过程如下:

针对参数\theta_j,对上式两边求偏导如下:

\begin{aligned} \frac{\partial}{\partial\theta_j}logL(\theta)&= \frac{\partial}{\partial\theta_j}{\sum_{i=1}^{m}\left({y^{(i)}}\cdot log(f_\theta(x^{(i)})) + ({1-y^{(i)}})\cdot log(1-f_\theta(x^{(i)}))\right)}\\ &=\sum_{i=1}^{m}\left(y^{(i)}\cdot\frac{1}{f_\theta(x^{(i)})}\cdot \frac{\partial}{\partial\theta_j}f_\theta(x^{(i)})+(1-y^{(i)})\cdot\frac{-1}{1-f_\theta(x^{(i)})}\cdot \frac{\partial}{\partial\theta_j}f_\theta(x^{(i)})\right)\\ &=\sum_{i=1}^{m}\left((\frac{y^{(i)}}{f_\theta(x^{(i)})}-\frac{1-y^{(i)}}{1-f_\theta(x^{(i)})})\cdot \frac{\partial}{\partial\theta_j}f_\theta(x^{(i)})\right)\\ &=\sum_{i=1}^{m}\left((\frac{y^{(i)}}{f_\theta(x^{(i)})}-\frac{1-y^{(i)}}{1-f_\theta(x^{(i)})})\cdot f_\theta(x^{(i)})\cdot(1-f_\theta(x^{(i)}))\cdot \frac{\partial}{\partial\theta_j}\theta^Tx^{(i)}\right)\\ &=\sum_{i=1}^{m}\left( (y^{(i)}\cdot(1-f_\theta(x^{(i)}))-(1-y^{(i)})\cdot f_\theta(x^{(i)}))\cdot\frac{\partial}{\partial\theta_j}(\theta_0+\theta_1x_1+\theta_2x_2+\cdots+\theta_nx_n)\right)\\ &=\sum_{i=1}^{m}\left( (y^{(i)}-f_\theta(x^{(i)}))\cdot x_j^{(i)}\right) \end{aligned}

其中:
     i:第i个样本
     j:第j个参数

参数更新表达式如下所示:
\theta_j:=\theta_j+\eta\cdot\sum_{i=1}^{m}\left( (y^{(i)}-f_\theta(x^{(i)}))\cdot x_j^{(i)}\right)

因为要使似然函数最大化,因此,参数 \theta 应该向似然函数增大的方向移动 ,即:\theta_j的移动方向应该与微分符号一致 ,因此上式中使用加号"+"

\theta_j:第j个参数,共有n个参数
\eta学习率 ,超参数
m:样本的个数


线性不可分问题

通过构造合理的\theta^Tx,即构造不同形状的决策边界曲线\theta^Tx=0,使用逻辑回归模型,即可处理线性不可分问题,示例如下

上图中,这两类无法用一条直线来区分,可以寻找一条曲线\theta^Tx=0来作为决策边界,来解决这个线性不可分问题。如下图所示

根据逻辑回归模型中参数更新的方式,使用样本进行训练,不断更新参数\theta,就可以得到合理的决策边界,进而完成线性不可分问题的分类。


逻辑回归示例

现有数据集data3.csv,如下所示:

data3.csv

划分数据集,并做图如下

# 划分数据
 train = df.values
 train_x = train[:,:2]
 train_y = train[:,-1]
 
 
 # 作图观察数据
 df0 = df[df['y'] == 0]
 df1 = df[df['y'] == 1]
 plt.figure(dpi=150)
 plt.plot(df0['x1'], df0['x2'], 'x', label='class 0')
 plt.plot(df1['x1'], df1['x2'], 'o', label='class 1')
 plt.legend()
 plt.show()

根据图像观察样本点分布位置,初步猜测决策边界为二次函数,如下所示:

\theta^Tx=\theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2=0

据此,共4个参数,则输入数据X应该具有4列,如下所示

# 构造输入矩阵X
  X = np.c_[np.ones(len(train_x)), train_x, train_x[:,0]**2]
 
 # 随机初始化4个参数
  theta = np.random.rand(4)

根据参数更新表达式,迭代更新参数

# 定义模型表达式
 def f(X):
  z = np.dot(X, theta)
  return 1 / (1 + np.exp(-z))
 
 # 设定学习率为0.001
 ETA = 0.001
 
 # 设置更新次数为5000
 epoch = 5000
 
 # 开始迭代更新
 for i in range(epoch):
  theta = theta + ETA * np.dot(train_y-f(X), X)

根据决策边界:
\theta^Tx=\theta_0 + \theta_1x_1 + \theta_2x_2 + \theta_3x_1^2=0
计算得到,决策边界曲线为:
x_2 = \frac{-(\theta_0+\theta_1x_1+\theta_3x_x^2)}{\theta_2}
作图查看分类结果

 # 作图查看分类结果
 df0 = df[df['y'] == 0]
 df1 = df[df['y'] == 1]
 
 x1 = np.linspace(-3, 5, 100)
 x2 = -(theta[0] + theta[1] * x1 + theta[3]*x1**2) / theta[2]
 
 plt.figure(dpi=100)
 plt.plot(df0['x1'], df0['x2'], 'x', label='class 0')
 plt.plot(df1['x1'], df1['x2'], 'o', label='class 1')
 plt.plot(x1, x2, '--')
 plt.legend()
 plt.show()
逻辑回归解决线性不可分问题

参考内容:《白话机器学习的数学》[日]立石贤吾
文中数据:https://zlzsm.lanzoui.com/iSMCSu5wkzc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容