本篇文章是博主在人工智能等领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在AI学习笔记: AI学习笔记(11)---《感知器算法》
理解并掌握感知机模型的定义以及几何含义,编写一个简单的使用感知机模型进行判别的例子。
掌握感知器学习算法的策略以及原理,并实现一个使用感知器学习算法解决分类问题的简单例子。
假设输入空间(特征空间)是 X∈Rn, 输出空间是 Y={+1,−1}。输入 x∈X 表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y∈Y表示实例的类别。由输入空间到输出空间的如下函数:

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

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

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

能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有的yi=+1的实例i,有w⋅xi+b>0,对所有yi=−1的实例i,有w⋅xi+b<0,则称数据集T为线性可分数据集(linearly separable data set);否则,称数据集T线性不可分。
假设训练数据集是线性可分的,感知器学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数w,b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数最小化。这里采用的损失函数是误分类点到超平面S的距离。 首先,输入空间中任意一点到超平面的距离定义为:

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

其中 M为误分类点的集合。
以上问题的求解采用梯度下降法不断的向最小化目标毕竟。首先,选取任意一个超平面 w0,b0。极小化的过程中不是一次使 M 中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
假设误分类点集合 M 是固定的,那么损失函数 L(w,b)的梯度为:

function [classify] = classify(samples, model_w, model_b)
%%%%%%%%%% Begin %%%%%%%%%%
classify = sign(model_w * samples.' + model_b); % 计算分类结果并返回符号函数值
%%%%%%%%%% End %%%%%%%%%%
endfunction [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 %%%%%%%%%%
endMATLAB终端输入下面指令
测试classify(samples, model_w, model_b)
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)
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)文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。