类脑科学实验(二)——感知器模型实现及分类实验

版权声明:南木的博客 https://blog.csdn.net/Godsolve/article/details/90521689

实验背景

感知器,也可翻译为感知机,是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。
它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器。
感知器是生物神经细胞的简单抽象,神经细胞结构大致可分为:树突、突触、细胞体及轴突。
单个神经细胞可被视为一种只有两种状态的机器——激动时为‘是’,而未激动时为‘否’。
神经细胞的状态取决于从其它的神经细胞收到的输入信号量,及突触的强度(抑制或加强)。
当信号量总和超过了某个阈值时,细胞体就会激动,产生电脉冲。电脉冲沿着轴突并通过突触传递到其它神经元。
为了模拟神经细胞行为,与之对应的感知机基础概念被提出,如权量(突触)、偏置(阈值)及激活函数(细胞体)。

实验目的

  • 加深对感知器模型的理解,能够使用感知器模型解决简单的分类问题

实验内容

  • 根据感知器的相关知识,使用Python语言实现一个简单的感知器模型,该模型能够实现简单的二分类任务(与或非运算任选一)。

实验要求

  • 基于与或非(任选一)真值表构建训练数据,将构建好的训练数据存储到列表中。
  • 创建网络。
  • 二分类任务测试。将测试数据输入到创建并训练好的网络中,网络的输出是与该测试数据与或非(任选一)运算最为接近的数据。

实验步骤

  1. 将权重初始化为 0 或一个很小的随机数
unit_step = lambda x: 0 if x < 0 else 1
w=np.random.rand(len(input_data[0]))#随机生成[0,1)之间,作为初始化w 
bias=0.0#偏置
  1. 对于每个训练样本 x(i) 执行下列步骤:
计算输出值 y^.
    更新权重
    for i in range(iteration):
        samples= zip(input_data,y)
        for (input_i,label) in samples:#对每一组样本 
            #计算f(w*xi+b),此时x有两个
            result=input_i*w+bias
            #print(result)
            result=float(sum(result))
            print(result)
            y_pred=float(unit_step(result))#计算输出值 y^ 
            w=w+rate*(label-y_pred)*np.array(input_i)#更新权重 
 
            bias=rate*(label-y_pred)#更新bias
    return w,bias
  1. 设置初始数据
def load_data():
    input_data=[[1,1], [0,0], [1,0], [0,1]]
    labels=[1,0,0,0]
    return input_data,labels
  1. 设置输出函数
if __name__=='__main__':
    input_data,y=load_data()
    w,b=train_pre(input_data,y,60,0.01)
    predict([1,1],w,b)

微信公众号

同时也欢迎各位关注我的微信公众号 南木的下午茶

在这里插入图片描述


实验代码

# -*- coding: utf-8 -*-
"""
Created on Fri May 17 14:58:42 2019

@author: Dell
"""

# -*- coding: utf-8 -*-
#   python 3.4
import numpy as np
from random import choice 
from sklearn import cross_validation
from sklearn.linear_model import LogisticRegression  
'''
1.将权重初始化为 0 或一个很小的随机数
2.对于每个训练样本 x(i) 执行下列步骤: 
   计算输出值 y^.
    更新权重
'''
def load_data():
    input_data=[[1,1], [0,0], [1,0], [0,1]]
    labels=[1,0,0,0]
    return input_data,labels
 
    
def train_pre(input_data,y,iteration,rate):
    #===========================
    '''
    参数:
    input_data:输入数据
    y:标签列表
    iteration:训练轮数
    rate:学习率
    
    '''
    #============================
    unit_step = lambda x: 0 if x < 0 else 1
    w=np.random.rand(len(input_data[0]))#随机生成[0,1)之间,作为初始化w
    bias=0.0#偏置
   
    
    for i in range(iteration):
        samples= zip(input_data,y)
        for (input_i,label) in samples:#对每一组样本
            #计算f(w*xi+b),此时x有两个
            result=input_i*w+bias
            result=float(sum(result))
            y_pred=float(unit_step(result))#计算输出值 y^
            w=w+rate*(label-y_pred)*np.array(input_i)#更新权重
 
            bias=rate*(label-y_pred)#更新bias
    return w,bias        
 
   
def predict(input_i,w,b):
    unit_step = lambda x: 0 if x < 0 else 1#定义激活函数
    result=result=result=input_i*w+b
    result=sum(result)
    y_pred=float(unit_step(result))
    print(y_pred)
    
if __name__=='__main__':
    input_data,y=load_data()
    w,b=train_pre(input_data,y,20,0.01)
    predict([1,1],w,b)
    

猜你喜欢

转载自blog.csdn.net/Godsolve/article/details/90521689
今日推荐