感知器及Matlab实现

目录

 

一、感知器模型

1.感知器的组成

(1)输入权值W

(2)激活函数

(3)输出Output

2.常见的另外两种感知器模型的表示

(1)偏置型

(2)阈值型

3.三种感知器模型的比较

二、感知器的训练规则

三、Matlab实现

Perceptron.m

test_Perceptron.m


一、感知器模型

1.感知器的组成

感知器模型包括:

(1)输入权值W

         W=[w_0,w_1,w_2,...,w_n]

(2)激活函数f(z)

         激活函数由多种选择,最常用、最简单的一种是:

         f(z)=sign(z)=\left\{\begin{matrix} 1,&z>0 \\ -1,&otherwise \end{matrix}\right.

        该模型中,感知器的输入为:w_0x_0+w_1x_1+w_2x_2+...+w_nx_n

(3)输出Output

          Output=f(w_0x_0+w_1x_1+w_2x_2+......+w_nx_n)

2.常见的另外两种感知器模型的表示

(1)偏置型

该模型与第一种模型的区别在于W和偏执项b;

该模型中,激活函数的输入为:w_1x_1+w_2x_2+...+w_nx_n+b 。

(2)阈值型

该模型的输入为:w_1x_1+w_2x_2+...+w_nx_n

该模型的激活函数为:f(z)=sign(z)=\left\{\begin{matrix} 1,&z>\theta \\ 0,&otherwise \end{matrix}\right.

3.三种感知器模型的比较

             权值型W            偏置型b              阈值型?
输入输入X是(n+1)维,X=[x_0,x_1,x_2,...,x_n]=[1,x_1,x_2,...,x_n]

输入为n维,

X=[x_1,x_2,...,x_n]

输入为n维,

X=[x_1,x_2,...,x_n]

激活函数

f(w_0x_0+w_1x_1+w_2x_2+...+w_nx_n)f(w_1x_1+w_2x_2+...+w_nx_n+b)

f(w_1x_1+w_2x_2+...+w_nx_n)

关系                    w_0=b=-\theta

三种模型本质上是一样的,只是表现形式不同。

从应用意义上理解感知器:以二分类为例,在训练时,感知器的初始权重是任意给的,之后根据感知器的训练规则不断更新感知器的权重,直到感知器可以将所有的训练样本正确分类。

二、感知器的训练规则

\left\{\begin{matrix} w_i:=w_i+\Delta w_i\\ \Delta w=\eta (t-y)x_i\end{matrix}\right.,i=0,1,2,3,4,...,m

\left\{\begin{matrix} w_i:=w_i+\Delta w_i\\ \Delta w=\eta (t-y)x_i \end{matrix}\right.,i=1,2,3,4,...,m     \left\{\begin{matrix} b:=b+\Delta b\\ \Delta b=\eta (t-y)\end{matrix}\right.,i=1,2,3,4,...,m

其中,ŋ :学习速率,t:目标函数输出,y:感知器输出,x_i:第i个样本

三、Matlab实现

Perceptron.m

第一种实现:

function W=Perceptron(X,y,learnRate,Maxiter)
 %输出:权重W=[w0,w1,w2,...,wn];
 %输入:样本数据X(m*n),样本标签y(m*1),learnRate学习速率,最大迭代次数Maxiter
 %y的取值{-1,1}
 %选取的激活函数为sign(z)
    [m,n]=size(X);
    %将样本扩充至m*(n+1)维
    X=[ones(m,1),X];
    %初始化权重
    W=zeros(n+1,1);
    
    for step=1:Maxiter
        flag=true;
        for j=1:m
            output=sign(X(j,:)*W);
            if(output~=y(j))
                flag=false;
                W=W+learnRate*(y(j)-output)*X(j,:)';
            end
        end
        if(flag==true)
            break;
        end
    end
end
 

第二种实现:

function [W,b]=Perceptron(X,y,learnRate,Maxiter)
 %输出:权重W=[w1,w2,...,wn],偏置项b
 %输入:样本数据X(m*n),样本标签y(m*1),learnRate学习速率,最大迭代次数Maxiter
 %y的取值{-1,1}
 %选取的激活函数为sign(z)
    [m,n]=size(X);

    %初始化权重
    W=zeros(n,1);
    %初始化偏置项
    b=0;
    
    for step=1:Maxiter
        flag=true;
        for j=1:m
            output=sign(X(j,:)*W+b);
            if(output~=y(j))
                flag=false;
                W=W+learnRate*(y(j)-output)*X(j,:)';
                b=b+learnRate*(y(j)-output);
            end
        end
        if(flag==true)
            break;
        end
    end
end
 

test_Perceptron.m

clear; clc;
close all;
%样本数据X
x=[0,0;0,1;1,0;1,1];
%样本标签
y=[-1;-1;-1;1];
%学习速率
n=0.1;
%最大迭代次数
iter=150;

%感知器
w=Perceptron(x,y,n,iter);
%[w,b]=Perceptron(x,y,n,iter);

%绘制样本散点图
pos=find(y==1);
neg=find(y==-1);
figure;
hold on;
plot(x(pos,1),x(pos,2),'k+');
plot(x(neg,1),x(neg,2),'ko');
xlabel('x(0)');
ylabel('x(1)');
title('样本散点图及分类结果')

%绘制直线
xline=linspace(0,5,50);
yline=-w(2)/w(3)*xline-w(1)/w(3);
%yline=-w(1)/w(2)*xline-b/w(2);
plot(xline,yline);

 

           

 

  • 9
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值