日常三大包
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表示等差序列,最后面那个表示参数