感知机(Perceptron)模型是由美国心理学家弗兰克 罗森布拉特于1957年提出的一种具有单层计算单元的神经网络。这个模型旨在建立一个线性超平面来解决线性可分问题,就如我们现在的或门分类。
代码如下:
import numpy as np
import pandas as pd
from operator import mod
from turtle import forward
代码如下
对于或门来说,有一出一,全零出零。
def get_xy_data():
x = np.array([[0,0],[0,1],[1,0],[1,1]])
y = np.array([0,1,1,1])
return x,y
def __init__(self):
""" 权重、偏置、学习率 """
self.w = np.random.normal(size=2)
self.b = np.random.normal(size=1)
self.lr = 0.1
def forward(self, x):
""" 前向传播 """
# x -- [x1, x2]
s = x[0] * self.w[0] + x[1] * self.w[1] + self.b[0]
# 激活函数
if s >= 0:
return 1
else:
return 0
def train(self, X, Y):
""" 训练过程 """
for i in range(1000): # 迭代
j = 0
C = 0
for xi in X:
yi = self.forward(xi)
Ci = np.power(Y[j] - yi, 2) / 2
C += Ci
# 存在误差就更新w,b
if Ci > 0:
self.w[0] = self.w[0] + self.lr * (Y[j] - yi) * xi[0]
self.w[1] = self.w[1] + self.lr * (Y[j] - yi) * xi[1]
self.b[0] = self.b[0] + self.lr * (Y[j] - yi)
j += 1
# 没有误差就可以停止
if C <= 0:
print("=== 4组输入都正确了,结束训练")
print("C:{}, W: {}, b:{}".format(C, self.w, self.b))
break
if __name__ == "__main__":
# 训练模型
import data_manager
X,Y = data_manager.get_xy_data()
model = ORGateMdel()
model.train(X, Y)
# 验证训练结果
xi = [0, 0]
print("输入:{}, 输出:{}".format(xi, model.forward(xi)))
xi = [0, 1]
print("输入:{}, 输出:{}".format(xi, model.forward(xi)))
xi = [1, 0]
print("输入:{}, 输出:{}".format(xi, model.forward(xi)))
xi = [1, 1]
print("输入:{}, 输出:{}".format(xi, model.forward(xi)))
#保持路径
np.savez("./and_params",model.w,model.w)
``