线性神经网络(解决异或问题

时间:2022-12-14 17:44:48

日常三大包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

多想想upadte函数的原理,
这里是先随机一个权重W,然后W的置换与X相乘去,得到的是一个列
w1x1+w2x2+w3x3的形式
然后其与Y进行比较,得到每个W梯度应该下降的多少,然后改变不停改变W得到最优值

#输入数据
X=np.array([[1,0,0,0,0,0],
   [1,1,0,1,0,0],
   [1,0,1,0,0,1],
   [1,1,1,1,1,1]])
#
Y=np.array([-1,1,1,-1])
#随机学习权重
W=(np.random.random(6)-0.5)*2
lr=0.11
#计算迭代次数
n=0
#神经网路输出
O=0
def update():
    global X,Y,W,n,lr
    n+=1
#这里表示为每个对应的输入x的三个变量*W.T,得到每个x有不同的权重相乘得到的结果
    O=np.dot(X,W.T)
#这里是通过损失函数来改变权值,这里考虑了3个输入所对应的每个w应该改变的权值
    W_C=lr*(Y-O.T).dot(X)/int(X.shape[0])
#这里表示每个W应该的改变值
#如果数据很多那么W_C会很大,所以我们应该/数据量
    W+=W_C
print(W)

因为是三个变量,那么可以通过x=(-b正负根号下b的平方-4c)/2a得到x的值

for i in range(1000):    #经过这里就已经完成训练了
    update()
#线性的话,通过加大循环次数来减少误差
#正样本
x1=[0,1]
y1=[1,0]
#负样本的坐标
x2=[0,1]
y2=[0,1]

def calculate(x,root): #这里传入的x,这里只是根据x得出y然后得出结果的图形
    a=W[5]
    b=W[2]+x*W[4]
    c=W[0]+x*W[1]+x*x*W[3]
    if root==1:
        return (-b+np.sqrt(b*b-4*a*c))/2*a
    if root==2:
        return (-b-np.sqrt(b*b-4*a*c))/2*a

xdata = np.linspace(-1,2)
#建立0,5的等差随机数字
plt.figure()
#设置一个图
plt.plot(xdata,calculate(xdata,1),'r')
plt.plot(xdata,calculate(xdata,2),'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()
#绘制图像,xdata表示等差序列,最后面那个表示参数