感知器

感知器代码

程序说明

sign_p.m文件实现sign函数,输入小于等于0,输出-1,输入大于0,输出1。

perceptron.m为主函数,实现感知器。学习速率还未使用。

程序思想见台大机器学习基石第二周课程的笔记。

perceptron.m

    %perceptron感知器的代码实现
    n=0.2 %学习速率
    p=[-9,1,-12,-4,0,5;15,8,4,5,11,9] %输入向量x1,x2
    p=[ones(1,6);p]%加上x0=1后的输入向量
    y=[-1,1,-1,-1,-1,1]%期望的分类结果,即真实的分类结果,正样本+1,负样本-1
    %初始点的分类情况图像
    figure;
    plot([-9,-12,-4,0],[15,4,5,11],'o')%第一类用o表示
    hold on;
    plot([1,5],[8,9],'*')%第二类用*表示
    axis([-13,6,-10,16])
    legend('第一类','第二类')%图例

    w0=[0,0,0]%初始权值向量
    %由于[0,0,0]不代表任何直线
    %用[0,0,0]加上第一个点的标签*第一个点的向量,代表w1
    w1=w0+(y(1)*p(:,1))' 
    w=w1
    flag=1
    while(flag)
        flag=0
        for i=1:6
            %如果实际预测值和真实值不同,就修正w
            %只要修正过w,就要重设flag=1,表示还要重头再循环一次
            if y(i)~=sign_p(w*p(:,i));
                w=w+(y(i)*p(:,i))' 
                %每次修正画个图(如果w(3)=0,该条分隔线画图会出错,
                %但不影响以后的分隔线,只要最终结果的w(3)不为0,就没事) 
                x1=-13:0.2:6
                x2=(-w(2)*x1)/w(3)-w(1)/w(3)
                b=plot(x1,x2)%保存为图形句柄,以后可以删除
                pause;
                delete(b)%删除前面一条分隔线的图形句柄

                flag=1
            end
        end
    end

    %画出最终的分隔线
    x1=-13:0.2:6
    %由w(1)*1+w(2)*x1+w(3)*x2=0解出x2
    x2=(-w(2)*x1)/w(3)-w(1)/w(3)
    plot(x1,x2)


sign_p.m

    %sign函数的实现:
    %输入大于0 y=1,输入小于等于0,y=-1
    function y=sign_p(x)
        if(x>0)
            y=1
        else
            y=-1
        end

程序最终结果图

最终结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值