前言
哈哈哈,学过高中生物的小伙伴们都知道,我们所学的生物神经网络是指生物的大脑神经元,细胞,触点等组成的网络,用于产生生物的意识,帮助生物进行思考和行动。其中神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。
人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connection Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的,广泛用于计算机视觉等领域。
如下图
我们可以很清楚的看出神经网络是有输入层,隐藏层,输出层组成的。
接下来,我们先介绍一下感知机
感知机
感知机((Peceptron)一般被看成最简单的人工神经网络,也是一个二元线性分类器,定义就是输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化。
举个简单的例子,在一个平面里有蓝色的点和和黑色的点,感知机就是寻找一个平面去区分这些点
如下图是一个感知机模型
-
输入x,一个人感知机可以有多个输入,每个输入对应还有一个权值w,此外还有一个偏执项b,然后对xw点积求和
-
激活函数,感知机有很多激活函数,理想的激活函数通常为阶跃函数或者sigmoid函数
-
最后以下公式进行输出
对激活函数我们简单介绍一下
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数。
阶跃函数
阶跃函数是一种特殊的连续时间函数,是一个从0跳变到1的过程。
sigmoid函数
若大家还想对激活函数有更多的了解,可以点这个激活函数
接着我们继续回到感知机
我们现在介绍一下感知机的学习过程
- 通过计算得到输出值
- 将实际输出值和理论输出值做差
- 调整输出端的权值
权值训练
将w权重项和b偏置项初始化为0,然后,利用感知器规则迭代的修改w和b,直到训练完成
其中η是一个称为学习速率的常数,其作用是控制每一步调整权的幅度。每次从训练数据中取出一个样本的输入向量x,使用感知器计算其输出y,再根据上面的规则来调整权重。每处理一个样本就调整一次权重。经过多轮迭代后(即全部的训练数据被反复处理多轮),就可以训练出感知器的权重,使之实现目标函数。
代码实现
import numpy as np
import matplotlib.pyplot as plt
p_x = (np.random.randn(250,2)*25))
#生成250个坐标(x,y),然后放大25,若不放大点都聚集在一起,看不清
#一般x轴范围在放大倍数的四倍,如放大25,则x范围在(-50,50)最佳
#阵行数,z指矩np.random.randn(x,y,z)中x指矩阵数,y指矩阵列数
p_y = np.zeros((250,1)) #np.zeros(())指设置p_y为空数组
for i in range(len(p_x)):
p_y[i] = p_x[i][0] - p_x[i][1] #设置分界线可随意
y = np.sign(p_y).astype(np.int8)
#目的转换p_y的类型,及浮点数转化整形
#np.sign()是取数字符号(数字前的正负号)的函数,
#如p_y<0则y=-1,p_y=0则y=0,p_y=1则y=1
for i in range(len(p_x)): #来区分分界线上不同的颜色的点
if y[i] == 1:
plt.plot(p_x[i][0], p_x[i][1], 'ro')
else:
plt.plot(p_x[i][0], p_x[i][1], 'bo')
for i in range(1000):
temp = -1
for j in range(len(p_x)):
if y[j] != np.sign(np.dot(w, p_x[j]) + b): #np.dot点积和矩阵乘法
temp = j
break
if temp == -1:
break
#按照标准进行不断的学习和改正w和b的值,使得分布趋于正确
w += lr * y[temp] * p_x[temp]
b += lr * y[temp]
line_x = [-50, 50]
line_y = [0, 0]
for i in range(len(line_x)):
line_y[i] = (-w[0] * line_x[i] - b) / w[1]
plt.plot(line_x, line_y)
print(line_x, line_y)
plt.show()
结果如下
代码来源感知机
问题分析
如图所示,对于此方面的问题就不是很好解决,类似于线性不可分的问题,因此我们就要学到多层感知机MLP,BP算法。这个我们下次会继续学习。
今天我们就先到这里,然后由于是刚刚学习,很多东西都不懂,代码也不会什么打,如果大家有什么建议欢迎提出,谢谢大家的观看!!!