感知机(PLA: Perceptron Learning Algorithm)
感知机就是模拟这样的大脑神经网络处理数据的过程。感知机模型如下图:
感知机是一种最基础的分类模型,前半部分类似于回归模型。感知机最基础是这样的函数,而逻辑回归用的sigmoid。这个感知机具有连接的权重和偏置
找到函数u的自变量w及参数b
使用playground
那么在这整个分类过程当中,是怎么做到这样的效果那要受益于神经网络的一些特点
要区分一个数据点是橙色的还是蓝色的,你该如何编写代码?也许你会像下面一样任意画一条对角线来分隔两组数据点,定义一个阈值以确定每个数据点属于哪一个组。
其中 b 是确定线的位置的阈值。通过分别为 x1 和 x2 赋予权重 w1 和 w2,你可以使你的代码的复用性更强。
此外,如果你调整 w1 和 w2 的值,你可以按你喜欢的方式调整线的角度。你也可以调整 b 的值来移动线的位置。所以你可以重复使用这个条件来分类任何可以被一条直线分类的数据集。但问题的关键是程序员必须为 w1、w2 和 b 找到合适的值——即所谓的参数值,然后指示计算机如何分类这些数据点。
但是这种结构的线性的二分类器
不能对非线性的数据进行有效的分类
如下面异或问题例子:
- 感知机结构,能够很好去解决与、或等问题,但是并不能很好的解决异或等问题。我们通过一张图来看,有四个样本数据
-
与问题:每个样本的两个特征同时为1,结果为1
-
或问题:每个样本的两个特征一个为1,结果为1
-
如果解决异或:每个样本的两个特征相同为0, 不同为1?
画图理解:
与问题:
异或问题,不存在一条线区分对角的两点为一组
公式理解:
其实上述我们可以理解:
假设存在一个函数:Z= sigmoid(AX1+BX2+C)对上图异或进行分组( 本身sigmoid函数是单调递增函数)。
左上角点:x1=0,x2=1输出z=1
右上角点:x2=1,x2=1输出z=0
左下角点:x1=0,x2=0输出z=0
右下角点:x1=1,x2=0输出z=1
观察异或运算我们来看下面结果:
- 如果当X2=0, 将X1的取值从0到1,使得Z的结果也从0到1,意味着Z的变化时与X1正相关,需要设置A为正数
- 如果当X2=1, 将X1的取值从0到1,使得Z的结果也从1到0,意味着Z的变化时与X1负相关,需要设置A为负数
上面的两个结论是矛盾的,所有采用逻辑回归无法精确得到一个输出为异或的模型。
如果给出下面的非线性数据,那么怎么解决这种问题呢?
其实我们多增加层或者多几个感知机即可解决?也就是下图这样的结构,组成一层的结构?
sigmoid函数单调递增函数
from matplotlib import pyplot as plt
import numpy as np
import math
def sigmoid_function(z):
fz = []
for num in z:
fz.append(1/(1 + math.exp(-num)))
return fz
if __name__ == '__main__':
z = np.arange(-10, 10, 0.01)
fz = sigmoid_function(z)
plt.title('Sigmoid Function')
plt.xlabel('z')
plt.ylabel('σ(z)')
plt.plot(z, fz)
plt.show()