单层神经网络-Logistics回归中误差曲线

举报
tsinghuazhuoqing 发表于 2021/12/25 23:44:19 2021/12/25
【摘要】   ➤01 Logistic回归 Logistic回归通常用于处理二类分类问题。本质上它是单层神经网络模型。 1.问题 给出对象的特征向量: ...

 

01 Logistic回归


Logistic回归通常用于处理二类分类问题。本质上它是单层神经网络模型。

1.问题

给出对象的特征向量: x = { x 1 , x 2 , ⋯   , x n } x = \left\{ {x_1 ,x_2 , \cdots ,x_n } \right\} x={x1,x2,,xn}
得到一个预测结果: y ^ = P { y = 1 ∣ x } \hat y = P\left\{ {y = 1|x} \right\} y^=P{y=1x}

▲ Logistic回归模型

▲ Logistic回归模型

2. Logistic回归

首先进行线性回归:
z = W T ⋅ x ˉ + b z = W^T \cdot \bar x + b z=WTxˉ+b
然后在使用一个Sigmoid函数得到预测结果: y ^ = s i g m o i d ( z ) = 1 1 + e − z \hat y = sigmoid\left( z \right) = {1 \over {1 + e^{ - z} }} y^=sigmoid(z)=1+ez1

▲ Sigmoid函数以及它对应的导数

▲ Sigmoid函数以及它对应的导数

def sigmoid(x):
    return 1/(1+exp(-x))

def dsigmoid(x):
    x = sigmoid(x)
    return x*(1-x)

x = linspace(-5, 5, 100)
z = sigmoid(x)
dz = dsigmoid(x)

plt.plot(x, z, label='sigmoid')
plt.plot(x, dz, label='derivative')
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.grid(True)
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()

  

 

02 简单举例


1.逻辑与

使用Logistic回归来实现逻辑与逻辑:

(1) 与逻辑

x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

▲ AND逻辑示意图

▲ AND逻辑示意图

(2) Logistic回归

z = w 1 ⋅ x 1 + w 2 ⋅ x 2 + b z = w_1 \cdot x_1 + w_2 \cdot x_2 + b z=w1x1+w2x2+b y ^ = 1 1 + e − z \hat y = {1 \over {1 + e^{ - z} }} y^=1+ez1

定义损失函数:

L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L\left( {\hat y,y} \right) = {1 \over 2}\left( {\hat y - y} \right)^2 L(y^,y)=21(y^y)2

那么总的损失函数为:
L ( y ^ , y ) = ∑ i = 1 4 1 2 ( y ^ i − y i ) 2 L\left( {\hat y,y} \right) = \sum\limits_{i = 1}^4 {{1 \over 2}\left( {\hat y_i - y_i } \right)^2 } L(y^,y)=i=1421(y^iyi)2

▲ W1,W2相对的误差曲线

▲ W1,W2相对的误差曲线

可以看到这个误差相对于W1,W2是一个非凸的误差曲线。

▲ W2,b参数误差平面

▲ W2,b参数误差平面

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LOGTEST.PY                   -- by Dr. ZhuoQing 2020-11-17
#
# Note:
#============================================================

from headm import *
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm

b=-1
#------------------------------------------------------------
def sigmoid(x):
    return 1/(1+exp(-x))

def error(w1,w2):
    z00 = b
    z01 = w1+b
    z10 = w2+b
    z11 = w1+w2+b

    y00 = sigmoid(z00)
    y01 = sigmoid(z01)
    y10 = sigmoid(z10)
    y11 = sigmoid(z11)

    _y00 = 0
    _y01 = 0
    _y10 = 0
    _y11 = 1

    res = (y00-_y00)**2 +\
          (y10-_y10)**2 +\
          (y01-_y01)**2 +\
          (y11-_y11)**2

    return res/2.0

#------------------------------------------------------------
w1 = arange(-5, 5, 0.1)
w2 = arange(-5, 5, 0.1)
W1,W2 = meshgrid(w1, w2)

E = error(W1, W2)

ax = plt.axes(projection='3d')
ax.plot_surface(W1, W2, E, cmap='coolwarm')

ax.set_xlabel('W1 Axes')
ax.set_ylabel('W2 Axes')
ax.set_zlabel('Error Axes')

plt.show()

#------------------------------------------------------------
#        END OF FILE : LOGTEST.PY
#============================================================

  

如果取对数似然损失函数:
L ( y ^ , y ) = − [ y ⋅ log ⁡ ( y ^ ) + ( 1 − y ) ⋅ log ⁡ ( 1 − y ^ ) ] L\left( {\hat y,y} \right) = - \left[ {y \cdot \log \left( {\hat y} \right) + \left( {1 - y} \right) \cdot \log \left( {1 - \hat y} \right)} \right] L(y^,y)=[ylog(y^)+(1y)log(1y^)]
根据前面定义,总损失函数为:
L ( y ^ , y ) = log ⁡ ( 1 − y ^ 11 ) L\left( {\hat y,y} \right) = \log \left( {1 - \hat y_{11} } \right) L(y^,y)=log(1y^11)
L ( y ^ , y ) = log ⁡ ( 1 − 1 1 + e − w 1 − w 2 − b ) L\left( {\hat y,y} \right) = \log \left( {1 - {1 \over {1 + e^{ - w_1 - w_2 - b} }}} \right) L(y^,y)=log(11+ew1w2b1)

对数似然损失函数相对于w1,w2的变化曲面:
▲ 对数似然损失函数

▲ 对数似然损失函数

w2,b参数对应的损失误差曲面:

 

03 线性可分与不可分


使用Logistic回归来进行分类,它只能个解决线性可分的问题。下面对于逻辑和逻辑异或所组成的Logistic回归所对应的参数的误差平面的特点。

1.逻辑与w1,w2的误差曲面

从下面的曲线可以看到,误差曲线的最低值小于0.5,也就是说,如果恢复到逻辑值,这样的误差是可以回归到0的。因此,使用Logistic回归的时候是可以正确的区分逻辑与分类的。
▲ 逻辑与的参数误差曲线

▲ 逻辑与的参数误差曲线

2.逻辑异或的参数误差曲线

下面的曲线则显示的是逻辑异或的关系。可以看到它的最低值仍然是大于0.5的。这也说明该网络无法区分逻辑异或(这是一个非线性可分的问题)的种类的。

▲ 异或逻辑的参数误差曲线

▲ 异或逻辑的参数误差曲线

 

※ 结论


为什么在Logistic回归中,对于损失函数不再使用均方差 L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L\left( {\hat y,y} \right) = {1 \over 2}\left( {\hat y - y} \right)^2 L(y^,y)=21(y^y)2,而使用对数似然函数 L ( y ^ , y ) = − [ y ⋅ log ⁡ y ^ + ( 1 − y ) ⋅ log ⁡ ( 1 − y ^ ) ] L\left( {\hat y,y} \right) = - \left[ {y \cdot \log \hat y + \left( {1 - y} \right) \cdot \log \left( {1 - \hat y} \right)} \right] L(y^,y)=[ylogy^+(1y)log(1y^)]

通过逻辑与函数对比了这两种误差相对于参数的变化曲线,可以看到:
使用均方差进行Logistic回归的时候,误差曲线往往是非凸的,而使用对数似然损失函数,参数优化问题往往变成了凸优化。

通过Logistic参数误差曲线也可以分别出该网络是否可以解决相关的分类问题。对于线性可分的问题,使用Logitisc回归是可以区分的。但对于非线性可分的问题,使用Logistic无法解决。

■ 相关文献链接:

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# LOGTEST.PY                   -- by Dr. ZhuoQing 2020-11-17
#
# Note:
#============================================================

from headm import *
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm

#------------------------------------------------------------
def sigmoid(x):
    return 1/(1+exp(-x))

def error(w1,w2,b):
    z00 = b
    z01 = w1+b
    z10 = w2+b
    z11 = w1+w2+b

    y00 = sigmoid(z00)
    y01 = sigmoid(z01)
    y10 = sigmoid(z10)
    y11 = sigmoid(z11)

    _y00 = 1
    _y01 = 0
    _y10 = 0
    _y11 = 1

#    return log(1-y11)

    res = (y00-_y00)**2 +\
          (y10-_y10)**2 +\
          (y01-_y01)**2 +\
          (y11-_y11)**2

    return res/2.0

#------------------------------------------------------------
w1 = arange(-10, 10, 0.1)
w2 = arange(-10, 10, 0.1)
W1,W2 = meshgrid(w1, w2)

E = error(W1, W2, -5)

ax = plt.axes(projection='3d')
ax.plot_surface(W1, W2, E, cmap='coolwarm')

ax.set_xlabel('W1 Axes')
ax.set_ylabel('W2 Axes')
ax.set_zlabel('Error Axes')

plt.show()

#------------------------------------------------------------
#        END OF FILE : LOGTEST.PY
#============================================================

  

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/109733951

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。