0. 前言
前面说明了线性回归在神经网络结构中的实现。线性回归实际就是单层的回归神经网络。那么如何把回归推广到分类模型呢?在学习逻辑回归的时候,就是通过一个函数将线性回归变成了逻辑回归,即实现了分类。此处亦可如此。
1. Sigmoid函数
s i g ( z ) sig(z) sig(z) = 1 1 + e − z {1}\over{1+e^{-z}} 1+e−z1
当自变量趋于正无穷的时候,函数值趋近于1;当自变量趋于负无穷的时候,函数值趋近于0;当自变量等于0时,函数值为0.5。
2. 在神经网络中sigmoid函数的使用
输入层与单层神经网络相同,输出层多了一个函数,此处是sigmoid函数,这个函数可以将连续型值分割,最终实现分类。
数据
x 1 x_1 x1 | x 2 x_2 x2 | y y y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
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)=⎩⎪⎨⎪⎧10−1 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+b≤0
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+w2x2≤−b
-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]