人工神经网络单层感知器代码实现

这篇文章,我们介绍了什么是单层感知器,这节课,我们来看看如果用代码实现一个单层感知器

实验问题:

假设平面坐标系上有三个点(3,3),(4,3)这两个坐标点的标签为 1 ,(1,1) 这个坐标的标签为-1 ,构建神经网络来分类

思路:

二维数据,需要两个数据点,将神经元偏置设置成另一个输入点,一共需要三个输入点

输入数据:(1,3,3),(1,4,3),(1,1,1)

数据对应标签为(1,1,-1)

初始化权值为w0,w1,w2 为 -1 到 1 的随机数

学习率为0.11

激活函数:sign

最终我们确定下来的是w0,w1,w2

那么分界线的表达式为: w0+w1*x1+w2*x2=0

因为x2为y轴上的值,那么最终的表达式为:

y=(-w1/w2)*x – -w0/w2

权向量和输入归纳为矩阵表达:

权值调整:

lr*(Y-O.T).dot(X)/int(X.shape[0])

(Y-O.T):是实际输出与期望输出的误差

这样我们就可以去套用权值校验公式了

具体代码为:

#单层感知器
import numpy as np
import matplotlib.pyplot as plt

#输入数据
X = np.array([[1,3,3],
[1,4,3],
[1,1,1]])
#标签
Y = np.array([1,1,-1])
#权值初始化一行三列,取值范围-1到1
W = (np.random.random(3)-0.5)*2
print("W is :",W)
#学习率设置
lr = 0.11
#计算迭代次数
n = 0
#神经网络输出
O=0

def update():
global X,Y,W,lr,n,O
n += 1
O = np.sign(np.dot(X,W.T))
W_C = lr*(Y-O.T).dot(X)/int(X.shape[0]) #权值需要改变的值
W = W+W_C #修正权值

for _ in range(100):
update() #更新权值
print("W:",W) #打印权值
print("n",n) #打印迭代次数
O = np.sign(np.dot(X,W.T)) #计算当前输出
if(O==Y.T).all(): #如果实际输出等领域期望输出,模型收敛,循环结束
print("Finished")
print("epoch:",n)
break

#整样本
x1=[3,4]
y1=[3,3]

#负样本
x2=[1]
y2=[1]

#计算分界线的斜率及截距
k=-W[1]/W[2]
d=-W[0]/W[2]
print("k:",k)
print("d:",d)

xdata = np.linspace(0,5)

plt.figure();
plt.plot(xdata,xdata*k+d,"r")
plt.plot(x1,y1,"bo")
plt.plot(x2,y2,"yo")
plt.show()

结果:

人工神经网络单层感知器代码实现

后台日志为:

人工神经网络单层感知器代码实现

版权声明:本文为CSDN博主「人情世故2017」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_24708791/article/details/78370915

为您推荐

Leave a Reply

Your email address will not be published.