二分类单层神经网络

0. 前言

前面说明了线性回归在神经网络结构中的实现。线性回归实际就是单层的回归神经网络。那么如何把回归推广到分类模型呢?在学习逻辑回归的时候,就是通过一个函数将线性回归变成了逻辑回归,即实现了分类。此处亦可如此。

1. Sigmoid函数

s i g ( z ) sig(z) sig(z) = 1 1 + e − z {1}\over{1+e^{-z}} 1+ez1

在这里插入图片描述
当自变量趋于正无穷的时候,函数值趋近于1;当自变量趋于负无穷的时候,函数值趋近于0;当自变量等于0时,函数值为0.5。

2. 在神经网络中sigmoid函数的使用

在这里插入图片描述
输入层与单层神经网络相同,输出层多了一个函数,此处是sigmoid函数,这个函数可以将连续型值分割,最终实现分类。

数据

x 1 x_1 x1 x 2 x_2 x2 y y y
000
100
010
111
import numpy as np
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])


def sigmoid(z):
    """sigmoid函数"""
    sig_res = 1/(1+np.exp(-z))
    return sig_res


def y_sigmoid(x1, x2):
    w1, w2, b = 0.1, 0.1, -0.15  # 给定回归系数和截距
    z = w1*x1 + w2*x2 + b
    g = sigmoid(z)
    y = [int(x) for x in g >= 0.5]
    return g, y


g, y_res = y_sigmoid(X[:, 0], X[:, 1])
print("g:", g)
print("y_res: ", y_res)

输出结果:

g: [0.46257015 0.4875026  0.4875026  0.5124974 ]
y_res:  [0, 0, 0, 1]

通过sigmoid函数将线性回归的结果映射到(0, 1)之间,0.5是一个阈值,以此区分两个类别。

对于y = [int(x) for x in g >= 0.5]的解释:

int(x)是对x取整,且需要注意的是int是向下取整,即有int(0.4) = 0 ; int(0.8) = 0; int(1.2) = 1,所以y = [int(x) for x in g >= 0.5]中的>= 0.5是一个逻辑判断,会返回一个布尔数组[False False False True],又int(False)=0; int(True)=1,所以最终返回的y_res是[0, 0, 0, 1]

3. 符号函数

除了上面的sigmoid函数,符号函数也能将连续值分割,转成分类结果。

符号函数sign,也称阶跃函数

g ( z ) = { 1  if  z > 0 0  if  z = 0 − 1  if  z < 0 g(z)=\left\{\begin{aligned} 1 & \text { if } z>0 \\ 0 & \text { if } z=0 \\-1 & \text { if } z<0 \end{aligned}\right. g(z)=101 if z>0 if z=0 if z<0

在这里插入图片描述
不同于sigmoid函数,需要通过sigmoid(z)来使得值压缩在(0, 1),符号函数的输出可以直接作为类别,一般对于二分类,可以转换成下面的式子:

z = b + w 1 x 1 + w 2 x 2 z = b+w_1x_{1} + w_2x_{2} z=b+w1x1+w2x2

y = { 1  if  w 1 x 1 + w 2 x 2 + b > 0 0  if  w 1 x 1 + w 2 x 2 + b ≤ 0 y=\left\{\begin{array}{ll}1 & \text { if } w_{1} x_{1}+w_{2} x_{2}+b>0 \\ 0 & \text { if } w_{1} x_{1}+w_{2} x_{2}+b \leq 0\end{array}\right. y={10 if w1x1+w2x2+b>0 if w1x1+w2x2+b0

y = { 1  if  w 1 x 1 + w 2 x 2 > − b 0  if  w 1 x 1 + w 2 x 2 ≤ − b y=\left\{\begin{array}{ll}1 & \text { if } w_{1} x_{1}+w_{2} x_{2}>-b \\ 0 & \text { if } w_{1} x_{1}+w_{2} x_{2} \leq -b\end{array}\right. y={10 if w1x1+w2x2>b if w1x1+w2x2b

-b就是阈值

import numpy as np
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 0, 0, 1])

def y_sign(x1, x2):
    """阶跃函数"""
    w1, w2, b = 0.1, 0.1, -0.15  # 给定回归系数和截距
    z = w1 * x1 + w2 * x2 + b
    y = [int(x) for x in z >= 0]
    return y

y_res = y_sign(X[:, 0], X[:, 1])
print("y_res: ", y_res)

# y_res:  [0, 0, 0, 1]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值