任务描述
本关任务:编写一个完整的单层感知器网络,实现对 Iris
数据集中 Iris
种类的分类预测。
相关知识
为了完成本关任务,你需要掌握:
- 前馈神经概述;
- 单层感知器网络;
- 单层感知器实现。
前馈神经概述
前馈型神经网络作为一种简单的神经网络形式,各个神经元按照层次结构分层排列,层与层之间的神经元相互连接,前一层神经元的输出作为下一层神经元的输入,各层次之间没有反馈,层内之间的神经元没有任何连接,其中第一层被称作输入层,最后一层是输出层,中间其它层被称作隐藏层。
整个神经网络结构无反馈,但是无反馈并不是意味着神经网络中的参数不能反向传播,而是指下一层的结果对上一次的结果并无影响。
常见结构
常见的前馈型神经网络包括单层的前馈型神经网络结构以及多层的前馈型神经网络结构,单层的前馈型神经网络被称作单层感知器,多层的前馈型神经网络被称作多层感知器。
1.单层感知器仅仅由输入层和输出层构成,不包含隐藏层,其结构如图 1
所示:
图1 单层感知器结构
2.多层感知器结构与单层感知器相似,只是包含了至少一层的隐藏层,如图 2
所示:
图2 多层感知器结构
单层感知器网络
感知器(Perceptron)是科学家 Frank Rosenblatt
于 20
世纪 60
年代发明的,它是神经网络家族中最容易理解和应用的模型,也是最简单的前馈型神经网络,同时也是一种二元线性分类模型,主要用于模式分类。
图3 简单的感知器网络结构示例
图 3
表示一个 n
维的输入的单层感知器, x1​,x2​,...,xn​
表示输入的 n
个向量, w1​,w2​,...,wn​
对应每一个向量的权值, b
为偏置,一个不依赖于任何输入向量的常量, fun(.)
表示激活函数,偏执可以理解为激活函数的偏移量,最终 y
为输入 n
维向量之后的输出结果。其数学形式如下:
y=f(i=1∑nwixi+b)=f(W⊺X)
对于激活函数 fun(.)
,可以根据实际的使用场景进行选择。对于二分类的场景,我们可以使用阶梯式的激活函数,其数学形式如下:
y={+1,−1,W⊺X+b>0W⊺X+b⩽0
单层感知器实现
算法实现步骤
- 获取训练样本;
- 初始化权重向量 w;
- 将权重向量与训练数据输入单层感知器,通过激活函数,得到分类结果;
- 根据分类结果,计算误差,更新权重和阈值;
- 利用更新后权重和阈值,从新对训练数据进行分类;
- 重复步骤3、4、5直到满足终止条件;
- 将预测数据输入单层感知器,利用最终的权重以及阈值来进行分类。
整个算法的核心就是权重以及阈值的更新,其方法就是我们曾讲过的梯度下降。根据梯度下降算法,权重的更新公式如下:
wj=wj+ΔwjΔwj=η(y−y^)xj
其中 wj​
表示第 j
个权重值, Δwj​
表示第 j
个权重的更新值, η
表示学习速率, y
表示正确的分类结果, y^​
表示感知器的分类结果, xj​
表示训练样本中第 j
个输入值。
数据介绍
本次实训使用的是 Iris
数据集,包含了 150
条数据,共分为三类,每类拥有 50
条数据,每条数据包含花萼长度(SepalLengthCm)、花萼宽度(SepalWidthCm)、花瓣长度(PetalLengthCm)、花瓣宽度(PetalWidthCm)以及花的类型(species)五项特征。
由于数据集中前两种类型(Iris-setosa 与 Iris-versicolor)的数据是线性可分的,并且单层感知器适用于线性可分的数据集的分类,因此我们只是用前两类的数据。为了测试方便,我们在对每条数据只选用花萼长度(Sepal Length)和花瓣长度(Petal Length)这两个属性作为训练数据集。除此外,在数据集中,由于花的类型是字符串类型,而其他属性是浮点型,为了计算的方便,需将花的类型数据进行转化,本文将 Iris-setosa 用数字−1替换,而将 Iris-versicolor 用数字1替换。
SepalLengthCmPetalLengthCmSpecies5.11.4-1(Iris-setosa)4.71.3-1(Iris-setosa)5.74.51 (Iris-versicolor )
编程要求
根据提示,在右侧编辑器 Begin-End 区间补充代码,编写单层感知器网络,完成分类任务。其中,fit 函数已经给出,只需实现 forward 函数和 predict 函数。
测试说明
平台会对你编写的代码进行测试:
测试输入:无
预期输出:
100%
import numpy as np
class Perception(object):
def __init__(self,lr=0.1,epochs=1000):
"""
初始化
:param lr: 学习
:param n_iter:
"""
self.lr = lr
self.epochs = epochs
def fit(self,X,y):
"""
训练
:param X: 训练数据的输入
:param y: 真实期望
"""
self.w_ = np.random.random(X.shape[1])
self.b = np.zeros([1])
for _ in range(self.epochs):
for x_i, target in zip(X,y):
update = self.lr * (target - self.predict(x_i))
self.w_ = self.w_ + (update * x_i)
self.b += update
def forward(self,X):
"""
向前传播
:param X: 输入
:return: 非经激活的预测值
"""
########## Begin ##########
# 将权重向量与训练数据输入单层感知器,进行向前传播
y_hat = np.dot(X, self.w_) + self.b
########## End ##########
return y_hat
def predict(self,X):
"""
预测函数,对前向传播后的结果进行分类
:param X: 输入值
:return: 对于数据类别的预测结果
"""
########## Begin ##########
# 可以使用 np.where() 函数来实现阶梯式的激活函数
prediction = np.where(self.forward(X) >= 0.0, 1, -1)
########## End ##########
return prediction
Original: https://blog.csdn.net/qq_39748425/article/details/124824922
Author: 我在洛阳
Title: 编写一个完整的单层感知器网络,实现对Iris数据集中Iris种类的分类预测。(python)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/664647/
转载文章受原作者版权保护。转载请注明原作者出处!