单层感知机----或门实现

文章目录

  • 一、前言---感知机
  • 二、实现过程
    • 1.引入库
    • 2.或门真值表-训练集数据
    • 3.建立model,初始化定义权重、偏置、学习率
    • 4.前向传播定义
    • 5.训练过程(更新权重和偏置)
    • 6.训练模型


一、前言—感知机

感知机(Perceptron)模型是由美国心理学家弗兰克 罗森布拉特于1957年提出的一种具有单层计算单元的神经网络。这个模型旨在建立一个线性超平面来解决线性可分问题,就如我们现在的或门分类。


二、实现过程

1.引入库

代码如下:

import numpy as np
import pandas as pd
from operator import mod
from turtle import forward

2.或门真值表-训练集数据

代码如下
对于或门来说,有一出一,全零出零。

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

3.建立model,初始化定义权重、偏置、学习率

    def __init__(self):
        """ 权重、偏置、学习率 """
        self.w = np.random.normal(size=2)
        self.b = np.random.normal(size=1)
        self.lr = 0.1

4.前向传播定义

    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

5.训练过程(更新权重和偏置)

    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

6.训练模型

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)

``

你可能感兴趣的:(单层感知机----或门实现)