1.线性神经网络和单层感知器非常类似,单层感知器的激活函数是sign函数,线性神经网络的激活函数是y=x函数,也称为线性函数。
题目:假设有3个2维的数据,数据特征分别是(3,3),(4,3),(1,1),(2,1)。(3.3)和(4,3)两个数据的标签为1,(1,1),(2,1)数据标签为-1,构建线性神经网络分类。
思路:我们要分类的数据是二维数据,所以只需要2个输入节点(一般输入数据有几个特征,我们就设置几个输入神经元),我们可以把神经元的偏置值也设置成一个输入节点,因此就有三个输入节点。结构如图。
1.在pycharm中导入numpy科学计算包和matplotlib画图包。
import numpy as np
import matplotlib.pyplot as plt
2.定义输入数据,习惯一行代表一个数据,默认所有神经元输入偏置为1,因此输入数据表示如下。
#输入数据,一行代表一个数据。
X=np.array([[1,3,3],
[1,4,3],
[1,1,1],
[1,2,1]])
3.定义标签,习惯一行代表一个标签,设置如下。
Y=np.array([[1],
[1],
[-1],
[-1]])
4.初始化权值,输入为三个神经元,输出为一个神经元,因此是3-1结构,所以权值设置为三行一列结构,权值在0-1内随机产生,如下。
W=np.random.random([3,1])
5.设置学习率和神经网路输出,学习率不易设置太大或者太小,否则会产生梯度爆炸或者学习效率太低,一般设置为0-1之间。
lr=0.1
Y=0
6.定义更新权值函数,首先使用权值W这个全局变量,其次计算四个数据的预测值,再计算标签值与预测值的误差,表达式为E=T-Y,最后计算权值的更新,权值更新表达式为△W=lrEX得到每一次权值的改变,设置如下。
def train():
globle W
#计算预测值
Y=np.dot(X,W)
#计算误差
E=T-Y
#shape[0]表示X的行数,表示你有多少个数据,除后表示权值改变的平均
delta_W=lr*(X.T.dot(E))/X.shape[0]
#更新权值
W=W+delta_W
7.设置训练次数,利用循环更新次数,如下。
for i in range(100):
train()
8.画图,首先设置标签为1的正样本x,y的坐标,再设置负样本x,y的坐标,如图。
#正样本
x1=[3,4]
y1=[3,3]
#负样本
x2=[1,2]
y2=[1,1]
9.计算分界线的斜率和截距,神经网络的总和为x0w0+x1w1+x2w2,所以令其为0时候,因为x0永远是1,把x1和x2分别看做平面坐标系中的x和y,得到y=-w0/w2-w1x/w2,所以可得到斜率和截距。如下
k=-W[1]/W[2]
d=-W[0]/W[2]
10.设定两个点来确定直线。并画出正负样本散点图,如下
xdate=(0,5)
plt.plot(x_data,xdata*k+d,'r')
plt.scatter(x1,y1,c='b')
plt.scatter(x2,y2,c='r')
plt.show()