感知器算法实验 -1
实验一感知器及其应用

实验⼀感知器及其应⽤1. 实验⽬的理解感知器算法原理,能实现感知器算法;掌握机器学习算法的度量指标;掌握最⼩⼆乘法进⾏参数估计基本原理;针对特定应⽤场景及数据,能构建感知器模型并进⾏预测。
2. 实验内容安装Pycharm,注册学⽣版。
安装常见的机器学习库,如Scipy、Numpy、Pandas、Matplotlib,sklearn等。
编程实现感知器算法。
熟悉iris数据集,并能使⽤感知器算法对该数据集构建模型并应⽤。
3. 实验报告要求按实验内容撰写实验过程;报告中涉及到的代码,每⼀⾏需要有详细的注释;按⾃⼰的理解重新组织,禁⽌粘贴复制实验内容!4. 作业信息这个作业属于哪个课程这个作业要求在哪学号3180701101 5. 代码#导⼊包import pandas as pdimport numpy as npfrom sklearn.datasets import load_irisimport matplotlib.pyplot as plt%matplotlib inline# load data,下载数据iris = load_iris()df = pd.DataFrame(iris.data, columns=iris.feature_names)#⽣成表格df['label'] = iris.target# 统计鸢尾花的种类与个数df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']bel.value_counts() # value_counts() 函数可以对df⾥⾯label每个值进⾏计数并且排序,默认是降序结果:2 501 500 50Name: label, dtype: int64#画数据的散点图plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')#将数据的前50个数据绘制散点图plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')#将数据的50-100之间的数据绘制成散点图plt.xlabel('sepal length')#给x坐标命名plt.ylabel('sepal width')#给y坐标命名plt.legend()结果:#对数据进⾏预处理data = np.array(df.iloc[:100, [0, 1, -1]])#iloc函数:通过⾏号来取⾏数据,读取数据前100⾏的第0,1列和最后⼀列X, y = data[:,:-1], data[:,-1]#X为data数据中除去最后⼀列的数据,y为data数据的最后⼀列(y中有两类0和1)y = np.array([1 if i == 1 else -1 for i in y])#将y中的两类(0和1)改为(-1和1)两类# 定义算法# 此处为⼀元⼀次线性⽅程class Model:def __init__(self):self.w = np.ones(len(data[0])-1, dtype=np.float32) #初始w的值self.b = 0 #初始b的值为0self.l_rate = 0.1 #步长为0.1# self.data = datadef sign(self, x, w, b):y = np.dot(x, w) + b #dot进⾏矩阵的乘法运算,y=w*x+breturn y#随机梯度下降法def fit(self, X_train, y_train):is_wrong = False #初始假设有误分点while not is_wrong:wrong_count = 0 #误分点个数初始为0for d in range(len(X_train)):X = X_train[d] #取X_train⼀组及⼀⾏数据y = y_train[d] #取y_train⼀组及⼀⾏数据if y * self.sign(X, self.w, self.b) <= 0: #为误分点self.w = self.w + self.l_rate*np.dot(y, X) #对w和b进⾏更新self.b = self.b + self.l_rate*ywrong_count += 1 #误分点个数加1if wrong_count == 0: #误分点个数为0,算法结束is_wrong = Truereturn 'Perceptron Model!'def score(self):passperceptron = Model()#⽣成⼀个算法对象perceptron.fit(X, y)#将测试数据代⼊算法中结果:'Perceptron Model!'#画出超平⾯x_points = np.linspace(4, 7,10) #⽤于产⽣4,7之间的10点⾏⽮量。
感知器和BP网络设计及应用

学号:1001314197人工神经网络实验报告实验一感知器和BP网络设计及应用实验1 感知器和BP网络设计及应用题目一初步认识Matlab人工神经网络工具箱一、实验目的初步了解人工神经网络工具箱。
二、实验容认识人工神经网络工具箱包含的主要功能函数及分类。
三、实验步骤(1) 在命令窗口键入help nnet(2) 描述人工神经网络工具箱划分的主要函数模块,并在每类下挑选3-4个函数,说明其主要功能。
四、实验结果>> help nnetNeural Network ToolboxVersion 6.0 (R2008a) 23-Jan-20081.Graphical user interface functions.图形用户界面函数nnstart - Neural Network Start GUI 神经网络启动图形用户界面GUInctool - Neural network classification tool 神经网络分类工具nftool - Neural Network Fitting Tool 神经网络拟合工具nntraintool - Neural network training tool 神经网络训练工具work creation functions. 网络生成函数cascadeforwardnet – Cascade-forward neural network. 级联神经网络competlayer - Competitive neural layer. 竞争神经层distdelaynet - Distributed delay neural network. 分布式延迟神经网络elmannet - Elman neural network. Elman 神经网络ing networks. 网络使用network - Create a custom neural network. 创建一个定制的神经网络sim - Simulate a neural network. 模拟神经网络init - Initialize a neural network. 初始化一个神经网络adapt - Allow a neural network to adapt. 神经网络的适应train - Train a neural network. 训练一个神经网络4.Simulink support. 仿真支持gensim - Generate a Simulink block to simulate a neural network. 生成Simulink模块来模拟神经网络setsiminit - Set neural network Simulink block initial conditions 设置神经网络Simulink模块初始条件getsiminit - Get neural network Simulink block initial conditions 获得神经网络Simulink模块初始条件neural - Neural network Simulink blockset. 神经网络Simulink 模块集5.Training functions. 训练函数trainb - Batch training with weight & bias learning rules. 批处理具有权重和偏差学习规则的训练trainbfg - BFGS quasi-Newton backpropagation. BFGS 拟牛顿反向传播trainbr - Bayesian Regulation backpropagation. 贝叶斯规则的反向传播trainbu - Unsupervised batch training with weight & bias learning rules. 无监管的批处理具有权重和偏差学习规则的训练6.Plotting functions. 绘图函数plotconfusion - Plot classification confusion matrix. 图分类混淆矩阵ploterrcorr - Plot autocorrelation of error time series. 误差自相关时间序列图ploterrhist - Plot error histogram. 误差直方图plotfit - Plot function fit. 绘图功能(函数)配合题目2 感知器的功能及初步设计一、实验目的掌握感知器的功能。
感知器算法寻找估计参数的方法

感知器算法寻找估计参数的方法引言感知器算法是一种基本的机器学习算法,用于分类和模式识别问题。
它使用线性模型和阈值函数来对输入数据进行分类。
在这篇文章中,我们将深入探讨感知器算法中寻找估计参数的方法。
什么是感知器算法?感知器算法是一种二分类线性模型,可以将输入数据进行二分。
它的基本思想是根据输入数据的特征和权重,通过阈值函数进行判断,并输出预测结果。
感知器算法的核心就是通过迭代调整权重和阈值,使得算法能够逐渐逼近真实模型的参数,从而实现对未知数据的分类。
感知器算法的原理感知器算法的原理非常简单:对于一个输入向量X和权重向量W,感知器算法的输出可以表示为:y = sign(W * X + b)其中,sign函数是一个阈值函数,当输入大于等于0时输出1,小于0时输出-1。
W和b是感知器的参数,通过迭代调整可以优化预测效果。
具体来说,感知器算法通过以下步骤进行迭代: 1. 初始化W和b,可以使用随机值或者其他启发式方法。
2. 对于每个输入样本X,计算感知器的输出y。
3. 如果y与期望输出不一致,根据差异调整W和b的值。
4. 重复步骤2和3,直到感知器的输出与期望输出一致或者达到预定的迭代次数。
感知器算法中寻找估计参数的方法为了找到最优的参数W和b,使得感知器算法能够对输入数据进行准确的分类,我们需要使用一种方法来调整参数值。
下面介绍几种常见的方法:1. 原始感知器算法原始感知器算法是感知器算法最早的一种形式。
它使用了简单的梯度下降法来更新参数值。
具体来说,对于错误分类的样本,我们可以这样更新参数值:W_new = W + α * y * Xb_new = b + α * y其中,α是学习率,用于控制每次更新的幅度。
通过迭代计算,不断更新参数值,最终可以找到使感知器算法最优的参数。
2. 对偶感知器算法对偶感知器算法是对原始感知器算法的改进。
它使用了对偶形式的学习算法,从而避免了对每个样本进行更新参数值的操作。
感知器实验

感知器实验一、实验目的:利用Matlab神经网络感知器算法对线性可分的样本进行正确分类。
关键在于求出线性判别函数f(X)=w’X,即确定权重w二、算法分析:用temp来记录当前w值能对样本正确分类的个数,初始化为零;每次扫描所有样本,当对某一个样本能正确分类时,temp自增1,否则调整w;当temp能对所有样本正确分类时,该w就为所求的权重向量。
三、代码和实验结果x1=[1;2];x2=[-1;2];x3=[0;-1];t1=1; 给出三个样本对应的分类t2=0;t3=0;w=[1;-0.8];temp=0;while(temp <3)三个都满足时退出循环temp =0;if(x1.'*w<0&t1==0|x1.'*w>=0&t1==1)temp = temp +1;当前样本在此时的w值下的所属分类tep与该样本本来所属类别一致时可以,不一致时调整w;elseif(t1==1)w=w+x1elsew=w-x1endendif(x2.'*w<0&t2==0|x2.'*w>=0&t2==1)temp = temp +1;elseif(t2==1)w=w+x2elsew=w-x2endendif(x3.'*w<0&t3==0|x3.'*w>=0&t3==1)temp = temp +1;elseif(t3==1)w=w+x3elsew=w-x3endendendy=(-5:0.5: 5); 从-5到5坐标画图,z=-(w(1,1)/w(2,1))*y;plot(x1(1,1),x1(2,1),'r*'); 分别输出几个点用红色和蓝色表示hold onplot(x2(1,1),x2(2,1),'b*');hold onplot(x3(1,1),x3(2,1),'b*');hold onplot(y,z);四、实验结果:。
实验二 感知器准则算法实验学生用01

实验二感知器准则算法实验一、实验目的贝叶斯分类方法是基于后验概率的大小进行分类的方法,有时需要进行概率密度函数的估计,而概率密度函数的估计通常需要大量样本才能进行,随着特征空间维数的增加,这种估计所需要的样本数急剧增加,使计算量大增。
在实际问题中,人们可以不去估计概率密度,而直接通过与样本和类别标号有关的判别函数来直接将未知样本进行分类。
这种思路就是判别函数法,最简单的判别函数是线性判别函数。
采用判别函数法的关键在于利用样本找到判别函数的系数,模式识别课程中的感知器算法是一种求解判别函数系数的有效方法。
本实验的目的是通过编制程序,实现感知器准则算法,并实现线性可分样本的分类。
二、实验内容实验所用样本数据如表2-1给出(其中每个样本空间(数据)为两维,x1表示第一维的值、x2表示第二维的值),编制程序实现ω1和ω2类、ω2和ω3类的分类。
分析分类器算法的性能。
w2=[7.1-1.44.56.34.21.42.42.58.44.1;4.2-4.30.01.61.9-3.0-4.0-6.1 3.7-2.2];表2-1感知器算法实验数据三、具体要求1、复习感知器算法;2、写出实现批处理感知器算法的程序1)从v=0开始,将你的程序应用在ω1和ω2的训练数据上。
记下收敛的步数。
2)将你的程序应用在ω2和ω3类上,同样记下收敛的步数。
3)试解释它们收敛步数的差别。
3、提高部分:ω3和ω4的前5个点不是线性可分的,请手工构造非线性映射,使这些点在映射后的特征空间中是线性可分的,并对它们训练一个感知器分类器。
分析这个分类器对剩下的(变换后的)点分类效果如何?四、参考例程及其说明针对ω1、ω2和ω3的分类程序如下:clear%original data%产生第一类、第二类和第三类原始数据,分别赋给w1、w2和w3变量w1=[0.16.8-3.52.04.13.1-0.80.95.03.9;1.17.1-4.12.72.85.0-1.31.2 6.44.0];w2=[7.1-1.44.56.34.21.42.42.58.44.1;4.2-4.30.01.61.9-3.0-6.13.7-2.2];w3=[-3.00.52.9-0.1-4.0-1.3-3.4-4.1-5.11.9;-2.98.72.15.22.23.76.23.4 1.65.1];%normalized%分别产生第一类、第二类和第三类增广样本向量集ww1、ww2和ww3ww1=[ones(1,size(w1,2));w1];ww2=[ones(1,size(w2,2));w2];ww3=[ones(1,size(w3,2));w3];%产生第一类和第二类样本向量的规范化增广样本向量集w12w12=[ww1,-ww2];%%w13=[ww1,-ww3];%%w23=[ww2,-ww3];y=zeros(1,size(w12,2));%产生1x20的行向量,赋给y,初值全为0v=[1;1;1];%给权向量v赋初值k=0;%k为迭代次数,v(0)=[1;1;1]while any(y<=0)for i=1:size(y,2)y(i)=v'*w12(:,i);endv=v+(sum((w12(:,find(y<=0)))'))';k=k+1;endv%显示最终求得的权向量v的值k%迭代次数值figure(1)plot(w1(1,:),w1(2,:),'r.')hold onplot(w2(1,:),w2(2,:),'*')xmin=min(min(w1(1,:)),min(w2(1,:)));xmax=max(max(w1(1,:)),max(w2(1,:)));ymin=min(min(w1(2,:)),min(w2(2,:)));ymax=max(max(w1(2,:)),max(w2(2,:)));xindex=xmin-1:(xmax-xmin)/100:xmax+1;yindex=-v(2)*xindex/v(3)-v(1)/v(3);plot(xindex,yindex)%写出实现批处理感知器算法的程序,从v=0开始,将程序应用在ω2和ω3类上,同样记下收敛的步数。
实验一报告实验一 基于感知器的线性分类器设计

北华大学开放实验报告实验名称:实验一基于感知器的线性分类器设计所属课程:模式识别班级:信息10—1学号:36*名:**实验一、基于感知器算法的线性分类器设计一、实验目的:1. 熟悉感知器算法。
2. 掌握感知准则函数分类器设计方法。
3. 掌握感知器算法,利用它对输入的数据进行分类。
二、实验原理:感知机算法线性分类器的第一个迭代算法是1956年由Frank Rosenblatt提出的,即具有自学习能力的感知器(Perceptron)神经网络模型,用来模拟动物或者人脑的感知和学习能力。
这个算法被提出后,受到了很大的关注。
感知器在神经网络发展的历史上占据着特殊的位置:它是第一个从算法上完整描述的神经网络,是一种具有分层神经网络结构、神经元之间有自适应权相连接的神经网络的一个基本网络。
感知器的学习过程是不断改变权向量的输入,更新结构中的可变参数,最后实现在有限次迭代之后的收敛。
感知器的基本模型结构如图1所示:图1 感知器基本模型其中,X输入,Xi表示的是第i个输入;Y表示输出;W表示权向量;w0是阈值,f是一个阶跃函数。
感知器实现样本的线性分类主要过程是:特征向量的元素x1,x2,……,xk是网络的输入元素,每一个元素与相应的权wi相乘。
,乘积相加后再与阈值w0相加,结果通过f函数执行激活功能,f为系统的激活函数。
因为f是一个阶跃函数,故当自变量小于0时,f= -1;当自变量大于0时,f= 1。
这样,根据输出信号Y,把相应的特征向量分到为两类。
然而,权向量w 并不是一个已知的参数,故感知器算法很重要的一个步骤即是寻找一个合理的决策超平面。
故设这个超平面为w ,满足:12*0,*0,T Tw x x w x x ωω>∀∈<∀∈ (1)引入一个代价函数,定义为:()**T x x YJ w w xδ∈=∑ (2)其中,Y 是权向量w 定义的超平面错误分类的训练向量的子集。
变量x δ定义为:当1x ω∈时,x δ= -1;当2x ω∈时,x δ= +1。
感知器的训练算法

感知器的训练算法
已知两个训练模式集分别属于ω1类和ω2类,权向量的初始值为w(1),可任意取值。
若0x )k (w ,x k T 1k >∈ω,若0x )k (w ,x k T 2k ≤∈ω,则在用全部训练模式集进行迭代训练时,第k 次的训练步骤为:
- 若1k x ω∈且0x )k (w k T ≤,则分类器对第k 个模式x k 做了错误分类,此时应校正权向量,使得w(k+1) = w(k) + Cx k ,其中C 为一个校正增量。
- 若2k x ω∈且0x )k (w k T >,同样分类器分类错误,则权向量应校正如下:w(k+1) = w(k) - Cx k
- 若以上情况不符合,则表明该模式样本在第k 次中分类正确,因此权向量不变,即:w(k+1) = w(k)
若对2x ω∈的模式样本乘以(-1),则有:
0x )k (w k T ≤时,w(k+1) = w(k) + Cx k
此时,感知器算法可统一写成:
⎩⎨⎧≤+>=+0
x )k (w if Cx )k (w 0x )k (w if )k (w )1k (w k T k k T。
感知器算法的实验报告

一、实验背景感知器算法是一种简单的线性二分类模型,由Frank Rosenblatt于1957年提出。
它是一种基于误分类项进行学习,以调整权重来拟合数据集的算法。
感知器算法适用于线性可分的数据集,能够将数据集中的样本正确分类。
本次实验旨在通过编程实现感知器算法,并使用iris数据集进行验证。
通过实验,我们能够熟悉感知器算法的基本原理,了解其优缺点,并掌握其在实际应用中的使用方法。
二、实验目的1. 理解感知器算法的基本原理;2. 编程实现感知器算法;3. 使用iris数据集验证感知器算法的性能;4. 分析感知器算法的优缺点。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 机器学习库:Scipy、Numpy、Matplotlib、sklearn四、实验步骤1. 导入必要的库```pythonimport numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.model_selection import train_test_split```2. 读取iris数据集```pythoniris = datasets.load_iris()X = iris.datay = iris.target```3. 将数据集划分为训练集和测试集```pythonX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)```4. 编写感知器算法```pythondef perceptron(X, y, w, b, learning_rate):for i in range(len(X)):if np.dot(X[i], w) + b <= 0:w += learning_rate y[i] X[i]b += learning_rate y[i]return w, b```5. 训练感知器模型```pythonlearning_rate = 0.1max_iter = 100w = np.zeros(X.shape[1])b = 0for _ in range(max_iter):w, b = perceptron(X_train, y_train, w, b, learning_rate)```6. 评估感知器模型```pythondef predict(X, w, b):return np.sign(np.dot(X, w) + b)y_pred = predict(X_test, w, b)accuracy = np.mean(y_pred == y_test)print("感知器算法的准确率:", accuracy)```7. 可视化感知器模型```pythondef plot_decision_boundary(X, y, w, b):plt.figure(figsize=(8, 6))plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired,edgecolors='k', marker='o')x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))Z = np.dot(np.c_[xx.ravel(), yy.ravel()], w) + bZ = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.4)plt.xlabel("Sepal length (cm)")plt.ylabel("Sepal width (cm)")plt.title("Perceptron Decision Boundary")plt.show()plot_decision_boundary(X_train, y_train, w, b)```五、实验结果与分析1. 感知器算法的准确率为约0.9,说明感知器算法在iris数据集上表现良好。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 理解线性分类器的分类原理。
2. 掌握感知器算法,利用它对输入的数据进行分类。
3. 理解BP 算法,使用BP 算法对输入数据进行分类。
二. 实验原理 1.感知器算法感知器算法是通过训练模式的迭代和学习算法,产生线性可分的模式判别函数。
感知器算法就是通过对训练模式样本集的“学习”得出判别函数的系数解。
在本次实验中,我们主要是采用硬限幅函数进行分类。
感知器的训练算法如下:设输入矢量{x 1,x 2,…,x n }其中每一个模式类别已知,它们分别属于ω1类和ω2类。
(1)置步数k=1,令增量ρ为某正的常数,分别赋给初始增广权矢量w(1)的各分量较小的任意值。
(2)输入训练模式x k ,计算判别函数值w T (k) x k 。
(3)调整增广权矢量,规则是:a.如果x k ∈ω1和w T (k) x k ≤0,则w(k+1)=w(k)+ ρx k ;b.如果x k ∈ω2和w T (k) x k ≥0,则w(k+1)=w(k)-ρx k ;c.如果x k ∈ω1和w T (k) x k >0,或x k ∈ω2和w T (k) x k <0,则w(k+1)=w(k)(4)如果k <N ,令k=k+1,返回至(2)。
如果k=N ,检验判别函数w T (k) x k 对x 1,x 2,…,x n 是否正确分类。
如果是,结束;如果不是,令k=1,返回至(2)。
如果训练模式已经符号规范化,即x k ∈ω2已经乘以-1(包括增广分量1),则校正权矢量的规则可统一为()(1)()k w k w k w k x ρ⎧+=⎨+⎩如果w T (k) x k >0分类正确,则为第一个表达式,如果w T (k) x k ≤0错误分类则为第二个表达式。
在全部模式训练完一轮之后只要还有模式分类错误,则需要进行第二轮迭代,再用全部训练模式训练一次,建立新的权矢量。
如果对训练模式还有错分,则进行第三轮迭代依此类推,直至对所有驯良模式均能正确分类为止,此时的w 即为所求的权矢量。
BP (Back Propagation)神经网络是一种神经网络学习算法。
其由输入层、隐层、输出层组成的阶层型神经网络,隐层可扩展为多层。
相邻层之间各神经元进行全连接,而每层各神经元之间无连接,网络按有教师示教的方式进行学习,当一对学习模式提供给网络后,各神经元获得网络的输入响应产生连接权值(Weight )。
然后按减小希望输出与实际输出误差的方向,从输出层经各中间层逐层修正各连接权,回到输入层。
此过程反复交替进行,直至网络的全局误差趋向给定的极小值,即完成学习的过程。
算法描述: 输入层:单元i 的输入:ix ;单元数量:d ; 单元i 的输出:ix ;单元i 的激活函数:线性函数; 隐层: 单元j 的输入:netj ; 单元数量:nH ;01j dt j ji i j i net x xωωω==+=∑ 010(,,....,),1t d x x x x x ==01(,,....,)t j j j jd ωωωω=单元j 的输出:()j j y f net =;单元j 的激活函数:非线性函数; 输出层:单元k 的输入:k net ;单元数量:c ;01Hn t k kj j k k j net y yωωω==+=∑010(,,....,),1H t n y y y y y ==01(,,....,)Ht k k k kn ωωωω=单元k 的输出:()kk zf net =单元k 的激活函数:非线性函数两层神经网络图如下:分析:(1)给定隐层单元及输出层单元的激活函数,一个神经网络就可以实现一个对输入特征向量x 的非线性映射。
因此,神经网络本质上是一个非线性函数。
(2)给定隐层单元及输出层单元的激活函数,该非线性函数所对应的映射关系完全由权系数决定。
不同的权系数对应不同的非线性映射。
(3)神经网络学习的目的,就是根据已知的训练样本,确定神经网络的权系数。
这一过程称为训练过程。
在训练过程结束后,对于新样本x ,根据神经网络的输出进行判决。
(4)对于C 类分类问题,神经网络的输出为(),1,...,kzx k c =。
神经网络的判决规则为:如果()(),1,...,,k lz x z x l c l k ≥=≠,则判x 属于wk 。
(5)令()(),1,...,k k g x z x k c ==,可以看出神经网络实际上实现了C 个非线性的鉴别函数,并根据鉴别函数的取值进行分类。
(6)神经网络的训练目标:调整权系数w ,即所有的wkj 及wij ,使得对于训练集中的每一个训练样本(x,t),网络的输出尽可能满足:11()()......()c c z x t z x tz x t ⎛⎫⎛⎫ ⎪ ⎪=== ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭(7)优化准则:对于样本集D ,使下述误差函数取得最小值: ()()x x DJ J ωω∈=∑()211()()2c x k k k J t z x ω==-∑权系数的调整:kj kj kjJ ωωηω∂←-∂()'()k j k k k k kjJy t z f net δδω∂==--∂,1()cji ji j i j j k kjk ji ji J Jx f net ωωηδδδωωω=∂∂'←-==∂∂∑,, BP 算法描述:对于给定的样本集D={(x,t)},初始化网络结构d*nH*c 。
初始化权系数w ,学习效率η、阈值θ。
随机从D 中取出一个样本(x,t),根据该样本更新权系数w :kj kj kjJ ωωηω∂←-∂ji ji jiJ ωωηω∂←-∂计算()()pre J J J ωω∆=-,如果J θ∆<结束训练,并认为此时的w 为最优。
否则转第2步继续进行循环。
三.实验内容 1. 感知器算法实验本实验利用感知器算法的原理,随机抽取两类的部分数据,然后,用这两类的其他数据来验证分类是否正确。
这里是利用感知器两两分类的原理。
实验可得结果如下表。
其中r1是输入x1所得的分类正确率,r2是输入x2所得的分类正确率,r3是输入x3所得的分类正确率。
当训练样本数m 取20时,x1和x2数据分类正确率都是100%,x1和x3数据分类正确率是100%,而x2和x3的分类正确率分别为86% 和93%。
当训练样本数m 取30时,x1和x2数据分类正确率都是100%,x1和x3数据分类正确率是100%,而x2和x3的分类正确率分别为92% 和88%。
由实验结果可以看出,x1和x2、x1和x3之间是线性可分的,而x2和x3则达到了与预设的迭代次数的上限,且分类效果不明显。
说明感知器算法对于现行可分的数据有比较好的性能与速度,但对于线性不可分的数据则效果较差。
2.BP 算法实验(1)异或问题实验利用前向两层神经网络来完成异或分类,输入的样本为x1=[0 1 -1],x2=[1 0 -1],x3=[0 0 -1],x4=[1 1 -1]将这四个样本分成两类。
其中,x1和x2是属于w1类,x3和x4属于w2类。
第一层(输入层)采用三个神经元,两个输入神经元和一个恒等于1的神经元,第二层(输出层)设置一个神经元,第二层输出的值若小于0.5就表示为w1类,大于0.5就表示w2类。
这里采用负梯度法调整参数。
在本实验中,我们记录训练次数和做不同次实验的分类正确率。
取实验次数为1,训练次数为3686,分类正确率为100%;取实验次数为25,最后一次训练次数为2970,分类正确率100%;取实验次数为50,最后一次训练次数2942,分类正确率100%。
由实验可以看出,分别做1次、25次和50次实验,所得到的分类正确率都是100%,所以说利用前向两层神经网络来完成异或分类问题可以得到很好的分类效果。
(2)BP算法实验采用前向两层神经网络来实现x1、x2和x3两两之间的分类。
分别选取不同个数(m)的样本进行训练,得到相应的权系数,然后再将全部数据代入进行分类,记录训练次数和分类正确率。
可得如下结果:x1和x2之间分别选取训练样本数为5和45时的分类效果:x1和x3之间分别选取训练样本数为5和45时的分类效果:x2和x3之间分别选取训练样本数为5和45时的分类效果:下面是分别进行不同多次实验所得的正确率的统计结果:分析实验结果可以得出:无论从一次实验所得结果还是从做多次实验所得的统计结果上来看,利用前向二层神经网络实现x1、x2和x3两两之间的分类,对于x1和x2之间、x1和x3之间的分类效果是比较明显的,可以很好的将两类分开。
而对于x2和x3之间却很难用此种办法达到很好的分类效果。
四. 实验小结本次实验主要是进行线性可分类问题的实验,实验中分别运用感知器算法和BP算法进行x1、x2和x3两两之间的分类,结果得出,只有x1和x2之间及x1和x3之间是线性可分的,而x2和x3之间是无法用这两种办法分开的。
本次实验中,在运用BP算法进行x1、x2和x3之间的分类之前,还进行了异或问题的实验,实验中采用两层前向神经网络达到了很好的分类效果,为进行后面的实验打好了基础。
通过本次实验,使我对感知器算法和BP算法有了更加深入的认识,以前在神经网络这门课程中所学的理论问题,在本次实验中通过具体动手进行编程,使得对当时所学知识有了更加深入的认识。
在实验中也遇到了各种各样的问题,通过思考解决后,对我以后的学习很有帮助。
五. 代码1.感知器算法clear all;close all;clc;k=load('iris.txt'); k1=zeros(50,4); k2=zeros(50,4); k3=zeros(50,4); for i=1:1:50k1(i,:)=k(i,:);k2(i,:)=k(i+50,:);k3(i,:)=k(i+100,:); endm=input('训练样本数m='); T1=zeros(m,4);T2=zeros(m,4);T3=zeros(m,4);index=randperm(50);for i=1:1:mT1(i,:)=k1(index(i),:);T2(i,:)=k2(index(i),:);T3(i,:)=k3(index(i),:);endW=[0.1,0.1,0.1,0.1];count=0;k=0.02;cc=0;while(count<m&&cc<100)i=1;count=0;while(i<=m)if(W*T1(i,:)'<0)W=W+k*T1(i,:);count=0;endif(W*T2(i,:)'>0)W=W-k*T2(i,:);count=0;endif((W*T1(i,:)'>0)&&(W*T2(i,:)'<0))count=count+1;endi=i+1;endcc=cc+1;endcck=[k1;k2];for i=1:1:100if(W*k(i,:)'>0)if(0<i&&i<51) fprintf('第%d个数据被分为第一类,分类正确\n',i);else fprintf('第%d个数据被分为第一类,分类错误\n',i);endendif(W*k(i,:)'<0)if(50<i&&i<101) fprintf('第%d个数据被分为第二类,分类正确\n',i);else fprintf('第%d个数据被分为第二类,分类错误\n',i);endendend2.BP算法解决异或问题clear all;close all;clc;p=0;x1=[0 0 -1;1 1 -1];x2=[0 1 -1;1 0 -1];r11=0;r22=0;while p<25a=0.5;pf=1;w1=rand(3,2);w2=rand(3,1);k=1;while pf>0.001if mod(k,4)==1g1=x1(1,:);d=0.1;endif mod(k,4)==2g1=x2(1,:);d=0.9;endif mod(k,4)==3g1=x1(2,:);d=0.1;endif mod(k,4)==0g1=x2(2,:);d=0.9;endg2=g1*w1;o1=1./(1+exp(-g2));o1_y=[o1 -1];g3=o1_y*w2;o2=1./(1+exp(-g3));% 输出层的权系数调整det2=a*2*(d-o2)*o2*(1-o2)*o1_y; w2=w2+det2';s=2*(d-o2)*o2*(1-o2);%第一层的权系数调整w22=w2';det1=a*g1'*(s*w22(:,1:2).*o1.*(1-o1));w1=w1+det1;err=d-o2;pf=err^2;k=k+1;endr1=0;for j=1:1:2t1=x1(j,:)*w1;y1=1./(1+exp(-t1));y1_y=[y1 -1];I2=y1_y*w2;y2(j)=1./(1+exp(-I2));if y2(j)<0.5r1=r1+1;endendif r1==2r11=r11+1;endr2=0;for j=1:1:2t2=x2(j,:)*w1;y11=1./(1+exp(-t2));y11_y=[y11 -1];I21=y11_y*w2;y21(j)=1./(1+exp(-I21));if y21(j)>0.5r2=r2+1;endendif r2==2r22=r22+1;endp=p+1endlv=p/25;3.BP算法实现x1、x2和x3两两之间分类clear all;close all;clc; load('data.mat');m=input('训练样本数m='); %输入训练样本数T1=zeros(m,4);T2=zeros(m,4);T3=zeros(m,4);%随机抽取m个训练样本index=randperm(50);for i=1:1:m %得到随机的训练样本x1(i,:)=k1(index(i),:);x2(i,:)=k2(index(i),:);x3(i,:)=k3(index(i),:);endp=0;r11=0;r22=0;while p<50a=0.5;pf=1;w1=rand(4,5);w2=rand(6,1);k=1;tt=1;while pf>0.000001if k>mk=1;endif mod(k,2)==1g1=x2(k,:);d=0.1;endif mod(k,2)==0g1=x3(k,:);d=0.9;endg2=g1*w1;o1=1./(1+exp(-g2));o1_y=[o1 -1];g3=o1_y*w2;o2=1./(1+exp(-g3));% 输出层的权系数调整det2=a*2*(d-o2)*o2*(1-o2)*o1_y;w2=w2+det2';s=2*(d-o2)*o2*(1-o2);%第一层的权系数调整w22=w2';det1=a*g1'*(s*w22(:,1:5).*o1.*(1-o1)); w1=w1+det1;err=d-o2;pf=err^2;k=k+1;tt=tt+1; %训练次数endr1=0;r2=0;for j=1:1:50t1=k2(j,:)*w1;y1=1./(1+exp(-t1));y1_y=[y1 -1];I2=y1_y*w2;y2(j)=1./(1+exp(-I2));if y2(j)<0.5r1=r1+1;endendlv1=r1/50if r1==50r11=r11+1;endfor j=1:1:50t1=k3(j,:)*w1;y1=1./(1+exp(-t1));y1_y=[y1 -1];I2=y1_y*w2;y22(j)=1./(1+exp(-I2));if y22(j)>0.5r2=r2+1;endendlv2=r2/50if r2==50r22=r22+1;endp=p+1endr11/50r22/50plot([1:50],y2,'r');axis([0,50,0,1]);title(['m=',num2str(m)]);hold on plot([1:50],y22); grid onlv=(r11+r22)/100。