首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >感知器算法

感知器算法

作者头像
不去幼儿园
发布2024-12-03 12:57:06
发布2024-12-03 12:57:06
3990
举报
文章被收录于专栏:强化学习专栏强化学习专栏

本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记: AI学习笔记(11)---《感知器算法》

感知器算法

1. 前言

理解并掌握感知机模型的定义以及几何含义,编写一个简单的使用感知机模型进行判别的例子。

掌握感知器学习算法的策略以及原理,并实现一个使用感知器学习算法解决分类问题的简单例子。

2.相关知识

2.1感知机定义

假设输入空间(特征空间)是 X∈Rn, 输出空间是 Y={+1,−1}。输入 x∈X 表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y∈Y表示实例的类别。由输入空间到输出空间的如下函数:

称为感知机。其中, wb称为感知机模型参数,w∈Rn叫做权值(weight)或权值向量(weight vector),b∈R叫做偏置(bias),w⋅x表示wx的内积。sign是符号函数,即

感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合{f∣f(x)=w⋅x+b}

2.2感知机几何解释

感知机有如下几何解释:线性方程

对应于特征空间Rn中的一个超平面S,其中w是超平面的法向量,b是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面S称为分离超平面(separating hyperplane)。

2.3数据集的线性可分性

给定一个数据集

能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有的yi​=+1的实例i,有w⋅xi​+b>0,对所有yi​=−1的实例i,有w⋅xi​+b<0,则称数据集T为线性可分数据集(linearly separable data set);否则,称数据集T线性不可分。

2.4感知器学习策略

假设训练数据集是线性可分的,感知器学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数w,b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数最小化。这里采用的损失函数是误分类点到超平面S的距离。 首先,输入空间中任意一点到超平面的距离定义为:


3.感知器学习算法原理

感知器学习算法是针对以下优化问题的算法。给定一个训练数据集

其中 M为误分类点的集合。

以上问题的求解采用梯度下降法不断的向最小化目标毕竟。首先,选取任意一个超平面 w0​,b0​。极小化的过程中不是一次使 M 中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。

假设误分类点集合 M 是固定的,那么损失函数 L(w,b)的梯度为:


4.编程实现

4.1感知机模型MATLAB代码
代码语言:javascript
复制
function [classify] = classify(samples, model_w, model_b)
    %%%%%%%%%% Begin %%%%%%%%%%
    classify = sign(model_w * samples.' + model_b); % 计算分类结果并返回符号函数值
    %%%%%%%%%% End %%%%%%%%%%
end
4.2 感知器学习算法MATLAB代码
代码语言:javascript
复制
function [w, b] = step2_mission(samples, labels, init_w, init_b, eta)
    %%%%%%%%%% Begin %%%%%%%%%%
    w = init_w; % 初始化权重向量 w
    b = init_b; % 初始化偏置 b
    
    [sample_num, ~] = size(samples); % 获取样本数量
    
    while(1 == 1) % 无限循环,直到满足终止条件
       flag = 1; % 初始化标志变量,用于判断是否所有样本都被正确分类
       for i = 1:sample_num % 遍历每一个样本
           if labels(i) * classify(samples(i,:), w, b) < 0 % 判断样本 i 是否被错误分类
               flag = 0; % 若有样本被错误分类,标志变量置为 0
               w = w + eta * labels(i) * samples(i,:); % 更新权重向量 w
               b = b + eta * labels(i); % 更新偏置 b
           end
       end
       
       if flag == 1 % 若所有样本都被正确分类,跳出循环
           break
       end
    end
    
    %%%%%%%%%% End %%%%%%%%%%
end

function [classify] = classify(samples, model_w, model_b)
    %%%%%%%%%% Begin %%%%%%%%%%
    classify = sign(model_w * samples.' + model_b); % 计算分类结果并返回符号函数值
    %%%%%%%%%% End %%%%%%%%%%
end
4.3 测试输入

MATLAB终端输入下面指令

测试classify(samples, model_w, model_b)

代码语言:javascript
复制
samples = [-7.82 -4.58 -3.97; -6.68 3.16 2.71; 4.36 -2.91 2.09; 6.72 0.88 2.80; -8.64 3.06 3.50; -6.87 0.57 -5.45; 4.47 -2.62 5.76; 6.73 -2.01 4.18; -7.71 2.34 -6.33; -6.91 -0.49 -5.68; 6.18 2.81 5.82; 6.72 -0.93 -4.04; -6.25 -0.26 0.56; -6.94 -1.22 1.13; 8.09 0.20 2.25; 6.81 0.17 -4.15; -5.19 4.24 4.04; -6.38 -1.74 1.43; 4.08 1.30 5.33; 6.27 0.93 -2.78];

w1 = [1.0 1.0 1.0];
w2 = [-1.0 1.0 -1.0];
w3 = [-1.0 0.0 2.0];
w4 = [1.0 1.0 -1.0];

b1 = 1.0;
b2 = 2.0;
b3 = 3.0;
b4 = 4.0;


disp('task1');
r1 = step1_mission(samples, w1, b1)

disp('task2');
r2 = step1_mission(samples, w2, b2)

disp('task3');
r3 = step1_mission(samples, w3, b3)

disp('task4');
r4 = step1_mission(samples, w4, b4)

测试step2_mission(samples, labels, init_w, init_b, eta)

代码语言:javascript
复制
samples = [-7.82 -4.58 -3.97; -6.68 3.16 2.71; 4.36 -2.91 2.09; 6.72 0.88 2.80; -8.64 3.06 3.50; -6.87 0.57 -5.45; 4.47 -2.62 5.76; 6.73 -2.01 4.18; -7.71 2.34 -6.33; -6.91 -0.49 -5.68; 6.18 2.81 5.82; 6.72 -0.93 -4.04; -6.25 -0.26 0.56; -6.94 -1.22 1.13; 8.09 0.20 2.25; 6.81 0.17 -4.15; -5.19 4.24 4.04; -6.38 -1.74 1.43; 4.08 1.30 5.33; 6.27 0.93 -2.78];
labels = [-1.0000    1.0000    1.0000    1.0000   -1.0000   -1.0000    1.0000    1.0000   -1.0000   -1.0000    1.0000    1.0000   -1.0000   -1.0000    1.0000    1.0000    1.0000   -1.0000    1.0000    1.0000];

w1 = [1.0 1.0 1.0];
w2 = [-1.0 1.0 -1.0];
w3 = [-1.0 0.0 2.0];
w4 = [1.0 1.0 -1.0];

b1 = 1.0;
b2 = 2.0;
b3 = 3.0;
b4 = 4.0;

eta1 = 0.1;
eta2 = 0.2;
eta3 = 0.3;
eta4 = 0.5;

disp('task1');
[rw1, rb1] = step2_mission(samples,labels, w1, b1, eta1)

disp('task2');
[rw2, rb2] = step2_mission(samples,labels, w2, b2, eta2)

disp('task3');
[rw3, rb3] = step2_mission(samples,labels, w3, b3, eta3)

disp('task4');
[rw4, rb4] = step2_mission(samples,labels, w4, b4, eta4)

文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 感知器算法
    • 1. 前言
    • 2.相关知识
      • 2.1感知机定义
      • 2.2感知机几何解释
      • 2.3数据集的线性可分性
      • 2.4感知器学习策略
    • 3.感知器学习算法原理
    • 4.编程实现
      • 4.1感知机模型MATLAB代码
      • 4.2 感知器学习算法MATLAB代码
      • 4.3 测试输入
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档