实验背景
感知器,也可翻译为感知机,是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。
它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器。
感知器是生物神经细胞的简单抽象,神经细胞结构大致可分为:树突、突触、细胞体及轴突。
单个神经细胞可被视为一种只有两种状态的机器——激动时为‘是’,而未激动时为‘否’。
神经细胞的状态取决于从其它的神经细胞收到的输入信号量,及突触的强度(抑制或加强)。
当信号量总和超过了某个阈值时,细胞体就会激动,产生电脉冲。电脉冲沿着轴突并通过突触传递到其它神经元。
为了模拟神经细胞行为,与之对应的感知机基础概念被提出,如权量(突触)、偏置(阈值)及激活函数(细胞体)。
实验目的
- 加深对感知器模型的理解,能够使用感知器模型解决简单的分类问题
实验内容
- 根据感知器的相关知识,使用Python语言实现一个简单的感知器模型,该模型能够实现简单的二分类任务(与或非运算任选一)。
实验要求
- 基于与或非(任选一)真值表构建训练数据,将构建好的训练数据存储到列表中。
- 创建网络。
- 二分类任务测试。将测试数据输入到创建并训练好的网络中,网络的输出是与该测试数据与或非(任选一)运算最为接近的数据。
实验步骤
- 将权重初始化为 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#偏置
- 对于每个训练样本 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
- 设置初始数据
def load_data():
input_data=[[1,1], [0,0], [1,0], [0,1]]
labels=[1,0,0,0]
return input_data,labels
- 设置输出函数
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)