感知器算法实验--1
- 格式:docx
- 大小:192.58 KB
- 文档页数:22
实验⼀感知器及其应⽤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点⾏⽮量。
感知器算法寻找估计参数的方法引言感知器算法是一种基本的机器学习算法,用于分类和模式识别问题。
它使用线性模型和阈值函数来对输入数据进行分类。
在这篇文章中,我们将深入探讨感知器算法中寻找估计参数的方法。
什么是感知器算法?感知器算法是一种二分类线性模型,可以将输入数据进行二分。
它的基本思想是根据输入数据的特征和权重,通过阈值函数进行判断,并输出预测结果。
感知器算法的核心就是通过迭代调整权重和阈值,使得算法能够逐渐逼近真实模型的参数,从而实现对未知数据的分类。
感知器算法的原理感知器算法的原理非常简单:对于一个输入向量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. 对偶感知器算法对偶感知器算法是对原始感知器算法的改进。
它使用了对偶形式的学习算法,从而避免了对每个样本进行更新参数值的操作。
基于Python实践感知器分类算法Perceptron是⽤于⼆进制分类任务的线性机器学习算法。
它可以被认为是⼈⼯神经⽹络的第⼀种和最简单的类型之⼀。
绝对不是“深度”学习,⽽是重要的组成部分。
与逻辑回归相似,它可以快速学习两类分类任务在特征空间中的线性分离,尽管与逻辑回归不同,它使⽤随机梯度下降优化算法学习并且不预测校准概率。
在本教程中,您将发现Perceptron分类机器学习算法。
完成本教程后,您将知道:Perceptron分类器是⼀种线性算法,可以应⽤于⼆进制分类任务。
如何使⽤带有Scikit-Learn的Perceptron模型进⾏拟合,评估和做出预测。
如何在给定的数据集上调整Perceptron算法的超参数。
教程概述本教程分为3个部分,共三个部分。
他们是:感知器算法Perceptron与Scikit-学习⾳调感知器超参数感知器算法Perceptron算法是两类(⼆进制)分类机器学习算法。
它是⼀种神经⽹络模型,可能是最简单的神经⽹络模型类型。
它由将⼀⾏数据作为输⼊并预测类标签的单个节点或神经元组成。
这可以通过计算输⼊的加权和和偏差(设置为1)来实现。
模型输⼊的加权总和称为激活。
激活=权重*输⼊+偏差如果激活⾼于0.0,则模型将输出1.0;否则,模型将输出1.0。
否则,将输出0.0。
预测1:如果激活> 0.0预测0:如果激活<= 0.0假设输⼊已乘以模型系数,如线性回归和逻辑回归,则优良作法是在使⽤模型之前对数据进⾏标准化或标准化。
感知器是线性分类算法。
这意味着它将学习在特征空间中使⽤⼀条线(称为超平⾯)将两个类别分开的决策边界。
因此,适⽤于那些类别可以通过线性或线性模型(称为线性可分离)很好地分离的问题。
该模型的系数称为输⼊权重,并使⽤随机梯度下降优化算法进⾏训练。
⼀次将来⾃训练数据集的⽰例显⽰给模型,模型进⾏预测并计算误差。
然后,更新模型的权重以减少⽰例的误差。
这称为Perceptron更新规则。
感知器实验一、实验目的:利用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);四、实验结果:。
实验二感知器准则算法实验一、实验目的贝叶斯分类方法是基于后验概率的大小进行分类的方法,有时需要进行概率密度函数的估计,而概率密度函数的估计通常需要大量样本才能进行,随着特征空间维数的增加,这种估计所需要的样本数急剧增加,使计算量大增。
在实际问题中,人们可以不去估计概率密度,而直接通过与样本和类别标号有关的判别函数来直接将未知样本进行分类。
这种思路就是判别函数法,最简单的判别函数是线性判别函数。
采用判别函数法的关键在于利用样本找到判别函数的系数,模式识别课程中的感知器算法是一种求解判别函数系数的有效方法。
本实验的目的是通过编制程序,实现感知器准则算法,并实现线性可分样本的分类。
二、实验内容实验所用样本数据如表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。
一、实验背景感知器算法是一种简单的线性二分类模型,由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、掌握利用Matlab对感知器网络进行构建与实现的方法。
二、实验原理1、感知器网络模型(1)感知器网络模型的拓扑结构如图1所示:图1 感知器网络模型的拓扑结构(2)感知器网络模型学习算法a、初始化:赋予权值一个较小的随机值错误!未找到引用源。
(非零值);b、将第错误!未找到引用源。
个模式错误!未找到引用源。
送入输入神经元,并给出理想输出值错误!未找到引用源。
;c、计算神经元网络模型的实际输出错误!未找到引用源。
;d、根据错误!未找到引用源。
与错误!未找到引用源。
计算第错误!未找到引用源。
条连线的权值增量:e、转b,选取第个样本,直到学完所有输入样本;f、按式g、若,转到b,否则结束。
三、实验内容2、利用Matlab对感知器网络进行构建与实现(1)Percept1(简单分类问题):设计单一感知器神经元来解决一个简单的分类问题:将4个输入向量分为两类,其中两个输入向量对应的目标值为1,另两个对应的目标值为0,输入向量为:P=[-2 -0.9 0.5 -0.5; -0.2 0.8 -0.6 2.0],目标向量为:T=[1 0 1 0],源程序如下:P=[-2 -0.9 0.5 -0.5;-0.2 0.8 -0.6 2.0];T=[1 0 1 0];plotpv(P,T);pause;net=newp([-1 1; -1 1],1);watchon;cla;plotpv(P,T);linehandle=plotpc(net.IW{1},net.b{1});E=1;net=init(net);linehandle=plotpc(net.IW{1},net.b{1}); while(sse(E))[net,Y,E]=adapt(net,P,T);linehandle=plotpc(net.IW{1},net.b{1}); drawnow;end;pause;watchoff;p=[0;-0.5];a=sim(net,p);plotpv(p,a);ThePoint=findobj(gca,'type','line');set(ThePoint,'Color','red');hold on;plotpv(P,T);plotpc(net.IW{1},net.b{1});hold off;disp('End of percept1');运行结果如下图所示:(2)Percept2(多个感知器神经元的分类问题):将上例的输入向量扩充为10组,将输入向量分为4类,即输入向量为:P=[0.6 0.7 0.9 0.9 1.7 0.0 0.4 -0.7 -0.4 -1.5;1.6 1.8 1.6 0.7 0.8 0.6 0.5 0.9 -1.0 -1.3],目标向量为:T=[1 1 1 0 0 1 1 1 0 1; 0 0 0 0 0 1 1 1 1 1],源程序如下:P=[0.6 0.7 0.9 0.9 1.7 0.0 0.4 -0.7 -0.4 -1.5;1.6 1.8 1.6 0.7 0.8 0.6 0.5 0.9 -1.0 -1.3];T=[1 1 1 0 0 1 1 1 0 1;0 0 0 0 0 1 1 1 1 1];plotpv(P,T);net=newp([-1.5 1;-1.5 1],2);figure;watchon;cla;plotpv(P,T);linehandle=plotpc(net.IW{1},net.b{1});E=1;net=init(net);linehandle=plotpc(net.IW{1},net.b{1});while(sse(E))[net,Y,E]=adapt(net,P,T);linehandle=plotpc(net.IW{1},net.b{1},linehandle);drawnow;end;watchoff;figure;p=[0.7;1.2];a=sim(net,p);plotpv(p,a);ThePoint=findobj(gca,'type','line'); set(ThePoint,'Color','red');hold on;plotpv(P,T);plotpc(net.IW{1},net.b{1});hold off;disp('End of percept2');运行结果如下图所示:(3) Percept3(输入奇异样本对网络训练的影响)当网络的输入样本中存在奇异样本时(即该样本向量相对其他所有样本向量特别大或特别小),此时网络训练时间将大大增加,如输入向量为:P=[-0.7 -0.5 0.6 -0.1 -40;-0.6 0.7 -0.5 1.0 60],目标向量为:T=[1 1 0 1 1],源程序如下:P=[-0.7 -0.5 0.6 -0.1 -40;-0.6 0.7 -0.5 1.0 60];T=[1 1 0 1 1];plotpv(P,T);net=newp([-40 1; -1 50],1);pause;plotpv(P,T);linehandle=plotpc(net.IW{1},net.b{1});cla;plotpv(P,T);linehandle=plotpc(net.IW{1},net.b{1});E=1;net.adaptParam.passes=1net=init(net);linehandle=plotpc(net.IW{1},net.b{1});while(sse(E))[net,Y,E]=adapt(net,P,T);linehandle=plotpc(net.IW{1},net.b{1},linehandle);drawnow;end;pause;p=[0.7;1.2];a=sim(net,p);plotpv(p,a);ThePoint=findobj(gca,'type','line');set(ThePoint,'Color','red');hold on;plotpv(P,T);plotpc(net.IW{1},net.b{1});hold off;pause;axis([-2 2 -2 2]);disp('End of percept3');运行结果如下图所示:在上述网络中由于样本向量相对其他所有样本向量特别大或特别小,故网络训练时间将大大增加,为解决此问题只需用标准化感知器学习规则训练即可大大缩短训练时间。
模式识别第三章感知器算法一.用感知器算法求下列模式分类的解向量W:•1:{(O,O,O)T,(1,O,O)T,(1,O,1)T,(1,1,O)T}•2:{(0,0,1)T,(0,1,1)T,(0,1,0)T,(W)T}将属于⑷2的训练样本乘以(-1),并写成增广向量的形式:X1 = (0,0,0,1)T,X2 =(1,0,0,1)T,X s =(1,0,1,1)T,X4 =(1,1,0,1)TX5 =(0,0,-1,—1)T,X6 =(0,-1,-1,—1)T,X7 =(0,-1,0,—1)T,X B=(-1,-1,-1, — 1)T第一轮迭代:取C =1, •⑴=(0,0,0,0)T因T(1)X1 =(0,0,0,0)(0,0,0,1)T-0不大于0,故•⑵g(1) X1 =(0,0,0,1)T因T(2)X2 =(0,0,0, 1)(1,0,0,1)T =1 大于0, 故(3)八⑵=(0,0,0,1)T因T(3)X s =(0,0,0,1)(1,0,1,1)T=1 大于0,故■ (4) - ■ (3) = (0,0,0,1)T因T(4)X4=(0,0,0,1)(1,1,0,1)T =1 大于0,故(5) = (4)=(0,0,0,1)T因' ■ (5)X5 =(0,0,0,1)(0,0,-1,-1) 一1 不大于0,故(6) = (5) X5 = (0,0,-1,0)因T(6)X6 =(0,0,-1,0)(0,-1,-1,—1)T =1 大于0,故(7) = (6)=(0,0,-1,0)T因T(7)X7 =(0,0,-1,0)(0,-1,0,-1)丁=0不大于0,故(8)二⑺ X7 =(0,-1,-1,-1)丁因T(8)X8 =(0,-1,-1,-1)(-1,-1,-1,-1)丁 =3大于o,故(9)八(8) =(0,-1,-1,-1)丁第二轮迭代:因T(9)X1 =(0,-1,-1,-1)(0,0,0,1)T 1 不大于0,故丄10)八(9) x1=(0,-1,-1,0)T因T(10)X^(0,-1,-1,0)(1,0,0,1)T-0不大于0,故(11) = (10) X2 =(1,-1,一1,1)丁因T(11)x s =(1,-1,-1,1)(1,0,1,1)丁=1 大于0,故(12)=朮(11)=(1,一1,一1,1)丁因T(12)X4 =(1,-1,-1,1)(1,1,0,1)丁=1 大于0,故(13) = (12) =(1,-1,-1,1)丁因T(13)X5 =(1,-1,一1,1)(0,0,-1,-1)丁=0不大于0,故(14)= (13) X5=(1,—1,—2,0)T因「(14)x6 =(1,-1,-2,0)(0,-1,-1,一1)丁=3大于0,故(15)= (14) = (1,-1,-2,0)丁因J(15)X7 =(1,-1,一2,0)(0,-1,0,-1)丁=1 大于0,故(15)=(1,-1,-2,0)T因T(16)X8 =(1,-1,-2,0)(-1,-1,-1,-1)丁=2大于0,故「(17) e:(16) =(1,-1 ,-2,0)T第三轮迭代:因"(17)X1 =(1,-1,-2,0)(0,0,0,1)T =0不大于0, 故(18) = (17)捲=(1, —1厂2,1)T因T(18)X2 =(1,-1,-2,1)(1,0,0,1)T = 2大于0,故(19) = (18) =(1,-1,-2,1)丁因T(19)X3 =(1,-1,-2,1)(1,0,1,1)丁=0不大于0,故(20^ (19) X3 =(2,-1,-1,2)T因T(20)X4 =(2,-1,-1,2)(1,1,0,1)丁=3大于0, 故(21)八(20) =(2,-1,-1,2)丁因.T(21)X5 =(2,-1,-1,2)(0,0,-1,-1)丁 1 不大于0,故,(22)八(21) X5 = (2,-1,-2,1)丁因"(22)X6 =(2,-1,-2,1)(0,-1,-1,一1)丁=2 大于0,故(23)八(22) = (2,-1,-2,1)丁因T(23)X7 =(2,-1,-2,1)(0,-1,0,-1)T不大于0,故(24) - (23) X^(2,-2,-2,0)T因T(24)X8 =(2,-2,-2,0)(-1,-1,-1,-1)T =2大于0,故(25^ (24^ (2,-2,-2,0)T第四轮迭代:因「(25)X1 =(2,-2,-2,0)(0,0,0,1)T =0不大于0,故(26) = (25) X^ (2,-2,-2,1)丁因T (26)X2 =(2,-2,-2,1)(1,0,0,1)T =3 大于0,故,(27)八(26) = (2,-2,-2,1)丁因「(27)X3 =(2,-2,-2,1)(1,0,1,1)丁 =1 大于0,故(28)八(27) =(2,-2,-2,1)丁因T(28)X4 =(2,-2,-2,1)(1,1,0,1)丁=1 大于0,故(29) = (28) = (2,-2,-2,1)丁因J(29)x5=(2,-2,-2,1)(0,0,-1,-1)丁=1 大于0,故「(30)八(29) = (2,-2,-2,1)丁因T(3O)X6 =(2,-2,-2,1)(0,-1,-1,-1)丁=3大于0,故(31)八(20) = (2,-2,-2,1)丁因T (31)X7 =(2,-2,-2,1)(0,-1,0,-1)丁=1 大于0,故(32)= (31)=(2,-2,-2,1)丁因大于0,故(33)=叫32) = (2,-2,-2,1)T第五轮迭代:因丁(33)人=(2,-2,-2,1)(0,0,0,1)丁=1 大于0,故■ (34) = ■ (33) = (2^2^2,1)T因T(34)X2=(2,-2,-2,1)(1,0,0,1)T =3大于0,故• (35) = (34) = (2,-2,-2,1)丁因T(35)X3=(2,一2,一2,1)(1,0,1,1)丁=1 大于0,故(36) = (35) = (2, 一2,一2,1)丁因T(36)X4=(2,一2,—2,1)(1,1,0,1)T =1 大于0,故‘(37) (36) = (2,-2, -2,1)T因.T(37)X5=(2,_2,21)(0,0,-1,_1)T =1 大于o,故• (38) *(37) = (2,一2,一2,1)丁因T(38)X6 =(2,一2,一2,1)(0,-1,-1,一1)丁=3大于o,故(39) = • (38) =(2,-2,-2,1)丁因T(39)X7 =(2,-2,-2,1)(0,-1,0,-1)丁=1 大于o,故(40) - (39) =(2,-2,-2,1)T因T(40)X8=(2,-2,-2,1)(-1,-1,-1,-1)丁=1 大于0,故(41)= (40) = (2,-2,-2,1)T该轮迭代全部正确,因此解向量■ =(2,-2,-2,1)丁,相应的判别函数为:d(x) = 2% -2x2-2X3 1二.编写求解上述问题的感知器算法程序1. 实验结果截图2. 程序代码%程序功能:实现感知器算法%作者:赵晓梅201428014628066%时间:2014.10.5clc;clear all ;fprintf( '感知器算法\n');%输入模式样本X=[0,0,0,1;1,0,0,1;1,0,1,1;1,1,0,1;0,0,-1,-1;0,-1,-1,-1;0,-1,0,-1;-1,-1,-1,-1];[N, n]=size(x); %获取样本数目和维数;N为样本数目;n为样本维数C=1;W0=[0,0,0,0]'; %初始化解向量w=w0;flag=1; %迭代继续标志,当迭代全部正确时,flag=O ,迭代结束k=0; %记录迭代次数while (flag)flag=O;k=k+1;for i=1:Nif w'*x(i,:)'<=0 %当迭代错误,w加上相应的x w=w+x(i,:)';flag=1;endendendfprintf( '迭代次数%d\n' ,k);fprintf( '解向量为w=(');for j=1: nfprintf( '%d ' ,w(j));endfprintf( ')\n' );fprintf( '相应的判别函数为d(x)=');for j=1: n-1fprintf( '(%d)x%d+' ,w(j),j);endfprintf( '(%d)\n' ,w(j));。
感知器算法实验--1一.实验目的1.理解线性分类器的分类原理。
2.掌握感知器算法,利用它对输入的数据进行分类。
3.理解BP算法,使用BP算法对输入数据进行分类。
二. 实验原理1.感知器算法感知器算法是通过训练模式的迭代和学习算法,产生线性可分的模式判别函数。
感知器算法就是通过对训练模式样本集的“学习”得出判别函数的系数解。
在本次实验中,我们主要是采用硬限幅函数进行分类。
感知器的训练算法如下:设输入矢量{x1,x2,…,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)()kw k w k w k x ρ⎧+=⎨+⎩如果w T (k) x k >0分类正确,则为第一个表达式,如果w T (k) x k ≤0错误分类则为第二个表达式。
在全部模式训练完一轮之后只要还有模式分类错误,则需要进行第二轮迭代,再用全部训练模式训练一次,建立新的权矢量。
如果对训练模式还有错分,则进行第三轮迭代依此类推,直至对所有驯良模式均能正确分类为止,此时的w 即为所求的权矢量。
2.BP 算法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 x1和x3 x2和x3 正确率迭代系数正确率迭代次正确率迭代次数数m=5 r1=100% r2=10 0% 1334r1=100%r3=100%1336r2=92%r3=86%4452m=15 r1=100% r2=10 0% 915r1=100%r3=100%1276r2=92%r3=98%2213m=25 r1=100% r2=10 0% 989r1=100%r3=100%1131r2=92%r3=96%197m=35 r1=100% r2=10 0% 961r1=100%r3=100%1044r2=92%r3=98%141m=45 r1=100% r2=10 0% 867r1=100%r3=100%1039r2=90%r3=100%2006x1和x2之间分别选取训练样本数为5和45时的分类效果:x1和x3之间分别选取训练样本数为5和45时的分类效果:x2和x3之间分别选取训练样本数为5和45时的分类效果:下面是分别进行不同多次实验所得的正确率的统计结果:实验次数训练样本分类正确次数 正确率x1和x3 之间个数p=20m=5 r1=19,r2=20 97.5%m=15 r1=20,r2=20 100%m=25 r1=20,r2=20 100%m=35 r1=19,r2=20 97.5%m=45 r1=20,r2=20 100%p=50m=5 r1=50,r2=50 100%m=15 r1=50,r2=50 100%m=25 r1=49,r2=50 99%m=35 r1=50,r2=50 100%m=45 r1=50,r2=50 100%p=100m=5 r1=98,r2=100 99%m=15 r1=97,r2=100 98.5%m=25 r1=100,r2=100 100%m=35 r1=97,r2=100 98.5%m=45 r1=99,r2=100 99.5%x1和x2 之间实验次数训练样本个数分类正确次数正确率p=20m=5 r1=20,r2=20 100%m=15 r1=19,r2=20 97.5%m=25 r1=19,r2=20 97.5%m=35 r1=20,r2=20 100%m=45 r1=20,r2=20 100%p=50m=5 r1=48,r2=50 98%m=15 r1=49,r2=50 99%m=25 r1=49,r2=50 99%m=35 r1=50,r2=50 100%m=45 r1=50,r2=50 100%p=100 m=5 r1=95,97.5%m=15 r1=99,99.5%m=25 r1=97,r2=100 98.5%m=35 r1=99,99.5%m=45 r1=98,99%x2和x3之间实验次数训练样本个数分类正确次数正确率p=20m=5 r1=4,20%m=15 r1=0,50%m=25 r1=4,37.5%m=35 r1=4,37.5%m=45 r1=0,27.5%p=50 m=5 r1=3,5%m=15 r1=0,43%m=25 r1=13,34%m=35 r1=1,14%m=45 r1=0,40%分析实验结果可以得出:无论从一次实验所得结果还是从做多次实验所得的统计结果上来看,利用前向二层神经网络实现x1、x2和x3两两之间的分类,对于x1和x2之间、x1和x3之间的分类效果是比较明显的,可以很好的将两类分开。