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

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

实验问题:

假设平面坐标系上有三个点(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

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

1

2

权值调整:

权值套用规则
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()

结果:

这里写图片描述

后台日志为:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/xvshu/article/details/78289599