模式识别实验二:感知器算法实验

目录

一、实验目的

二、实验原理

(一)线性判别函数

(二)感知器算法

三、实验内容

四、实验结果与分析

(一)实验结果

(二)实验图像

(三)实验代码

(四)实验分析

五、思考与提高


一、实验目的

1、了解感知器算法的基本原理和线性分类器的概念;

2、掌握感知器算法实现过程,包括初始化、计算权重、更新权重等步骤;

3、分析感知器算法的优缺点以及其在解决实际问题中的应用场景。

二、实验原理

(一)线性判别函数

在一个n维的特征空间中,记

X={​{({​{x}_{1}},{​{x}_{2}},\cdots ,{​{x}_{n}})}^{T}}\\ {​{W}_{0}}={​{({​{w}_{1}},{​{w}_{2}},\cdots ,{​{w}_{n}})}^{T}}

则线性判别函数的一般表达式为

$d(X)={​{w}_{1}}{​{x}_{1}}+{​{w}_{2}}{​{x}_{2}}+\cdots +{​{w}_{n}}{​{x}_{n}}+{​{w}_{n+1}}$

其中,W0称为权向量,且

d(X)=W_{0}^{T}X+{​{w}_{n+1}}\\ X={​{({​{x}_{1}},{​{x}_{2}},\cdots ,{​{x}_{n}},1)}^{T}}\\ W={​{({​{w}_{1}},{​{w}_{2}},\cdots ,{​{w}_{n}},{​{w}_{n+1}})}^{T}}

这里,X和W分别被称为增广模式向量和增广权向量。于是有:

d(X)={​{W}^{T}}X

(二)感知器算法

       感知器模型的一个重要特点就是输入 与神经元之间的连接权值可以通过训练或者学习的方式来调整,从而实现输入样本的线性可分。当感知器用于两类模式的分类时,相当于在高维样本的特征空间中,用一个超平面把两类区分开。已证明,如果两类模式是线性可分的,权值学习算法一定收敛。

其中,利用增广规范化模式向量和权向量感知器算法的具体步骤如下:

1、给定初始值:置k = 1,取初始权向量Wk,选常数c > 0。

2、依次输入训练样本XkXk∈{X1, X2, ... , XN }。

3、计算判别函数值:d(Xk) = WkTXk

4、按如下规则修正权向量:

      若d(Xk) = WkTXk >0,则Wk不用修正,即Wk+1 = Wk

      若d(Xk) = WkTXk <0, 则修正Wk,即Wk = Wk + cXk

5、令k = k+1,重复步骤2,知道对所有训练样本,权向量不再需要修正为止,算法结束,一般情况下常数c满足:0 < c ≤1。

三、实验内容

1、利用感知器算法解平面两分类问题;

2、利用感知器算法解空间两分类问题;

3、利用感知器算法解多类问题。

四、实验结果与分析

(一)实验结果

本次实验利用增广规范化模式向量和权向量感知器算法解决两分类的问题,此外,对于多类问题使用ωi | ωj 二分法的形式,将M个类别的多类问题转化为$C_{M}^{2}=M(M-1)/2$ωi | ωj 两类问题,得到每组数据的判别函数如表1所示。

表2-1 各组样本数据的判别函数

样本序号datai

样本类数k

空间维度n

判别函数

dij(X)

1

2

2

4.05x1 + 4.95x2 – 4 = 0

2

3

2

1.44x1 + 1.60x2 – 2 = 0

25.72x1 + 36.78x2 – 45 = 0

–4.95x1 – 6.93x2 + 5 = 0

3

2

3

4.73x1 + 6.59x2 + 3.26x3 – 8 = 0

(二)实验图像

图2-1 数据样本以及判别函数图像

(三)实验代码

数据集及代码可于文章顶部进行资源下载

1、感知器函数:preception.m

function y = preception(W1, W2, w, c)
%% 功能:感知器算法解决二分类问题
% 参数说明:
% W1, W2,两个类的样本
% w:任取初值
% c:任取矫正增量系数

[m, n] = size(W1);
for i=1:m
    W1(:, n+1) = 1;
end
[m, n] = size(W2);
for i=1:m
    W2(:, n+1) = 1;
end
W2 = -W2;

M = ones(1, m);
w1 = mat2cell(W1, M, n+1);
w2 = mat2cell(W2, M, n+1);
X = cat(1, w1, w2);

[m, n] = size(X);
temp1 = []; temp2 = 0;
while(~isequal(temp1, temp2))
    temp2 = temp1;
    for i=1:m
        temp1{i,1} = w;
        if(w*X{i}' <= 0)
            w = w+c*X{i};
        end
    end
end

y = w;

function y = ismax(m, d)
% 判断数值m是否为数组中唯一的最大元素
% 若是则返回1, 反之则返回0;
sum = 0;
[row, col] = size(d);
for i=1:col
    if(m <= d(i))
        sum = sum +1;
    end
end
if(sum == 1)
    y=1;
else
    y=0;
end

2、辅助函数:ismax.m

function y = ismax(m, d)
% 判断数值m是否为数组中唯一的最大元素
% 若是则返回1, 反之则返回0;
sum = 0;
[row, col] = size(d);
for i=1:col
    if(m <= d(i))
        sum = sum +1;
    end
end
if(sum == 1)
    y=1;
else
    y=0;
end

3、分界线绘制函数:plot_DividLine.m

function plot_DividLine(a, b, c, w_x, w_y)
%% 功能:绘制分界线
% 参数说明:ax+by+c=0
% w_x:x轴坐标范围
% w_y:y轴坐标范围

%% main
x = w_x(1) : w_x(2);
if b == 0 && a~=0
    line([-c/a, -c/a], [w_y(1), w_y(2)]);
else
    if b ~= 0 && a==0
        line([w_x(1), w_x(2)], [-c/a, -c/a]);
    else
        plot(x, -(a*x+c)/b);
    end
end
text = [num2str(a), '*x_1+' ,num2str(b),'*x_2+',num2str(c),'=0'];
legend(text);
axis([w_x(1),w_x(2), w_y(1), w_y(2)]);  

4、data1主函数:main1.m

%% 初始化
load('Data01_Perceptron.mat');
[row, col] = size(x);
row=3; col =100;
W1 = zeros(col/2, row-1);
W2 = zeros(col/2, row-1);
w = [1 1 1];
c  = 1;
for i=1:col/2
    W1(i, :) = x(1:row-1, i)';
    W2(i, :) = x(1:row-1, i+col/2)';
end

%% 执行感知器算法
y = preception(W1, W2, w, c);

%% 数据可视化
str = {'rx', 'g*'};
hold on 

w_x = [0, 1];
w_y = [0, 1];
plot_DividLine(y(1), y(2), y(3), w_x, w_y);

plot(W1(:, 1), W1(:, 2), str{1}, 'MarkerSize',7.5);
plot(W2(:, 1), W2(:, 2), str{2}, 'MarkerSize',7.5);
grid on
hold off

5、data2主函数:main2.m

load('Data02_Perceptron.mat');
str = {'r*', 'bo', 'g^'};

[row, col] = size(x);

W1 = zeros(col/2, row-1);
W2 = zeros(col/2, row-1);
w = [1, 1, 1, 1];
c = 1;

for i=1:col/2
    W1(i, :) = x(1:row-1, i);
    W2(i, :) = x(1:row-1, i+col/2);
end

y = preception(W1, W2, w, c)

hold on
a = [0, 1];
b = [0, 1];
[w_x, w_y] = meshgrid(a, b);
%  y(1)*w_x + y(2)*w_y + y(3)*z +y(4) =0;
 z = -( y(1)*w_x + y(2)*w_y + y(4))/y(3);
%  surf(w_x, w_y, z);
  

plot3(x(1, 1:100), x(2, 1:100), x(3, 1:100), str{1})
plot3(x(1, 101:200), x(2, 101:200), x(3, 101:200), str{2})
axis([0,1, 0,1, 0,1]);
hold off

6、data3主函数:main3.m

%% 初始化
% load('Data01_Perceptron.mat');
% load('Data02_Perceptron.mat');
load('Data03_Perceptron_3classes.mat');
[row, col] = size(x);
W1 = zeros(col/3, row-1);
W2 = zeros(col/3, row-1);
W3 = zeros(col/3, row-1);
w = [1 1 1];
c  = 1;
for i=1:col/3
    W1(i, :) = x(1:row-1, i)';
    W2(i, :) = x(1:row-1, i+col/3)';
    W3(i, :) = x(1:row-1, i+2*col/3)';
end

%% 执行感知器算法
y1 = preception(W1, W2, w, c)
y2 = preception(W1, W3, w, c)
y3 = preception(W2, W3, w, c)

%% 数据可视化
str = {'rx', 'g*', 'bo'};
hold on 
w_x = [-0.1, 1.1];
w_y = [-0.1, 1.1];
plot_DividLine(y1(1), y1(2), y1(3), w_x, w_y);
plot_DividLine(y2(1), y2(2), y2(3), w_x, w_y);
plot_DividLine(y3(1), y3(2), y3(3), w_x, w_y);

plot(W1(:, 1), W1(:, 2), str{1}, 'MarkerSize',7.5);
plot(W2(:, 1), W2(:, 2), str{2}, 'MarkerSize',7.5);
plot(W3(:, 1), W3(:, 2), str{3}, 'MarkerSize',7.5);

(四)实验分析

1、从实验图像上来看,感知器取得了较为理想的输出结果:对于需要二分类的数据而言,根据维度的需要绘制直线或者平面即可,对于三分类的数据,本次实验采用  次二分类得到三条分类直线,很好的完成了任务;

2、实验结果只有在数据理想的情况之下才能够很好的完成样本分类,如果某类样本之中有少部分数据分布在另一类之中,该程序会出现陷入死循环的情况,因为程序无法将绘制弯折曲线且不能将少量干扰数据剔除掉。

五、思考与提高

1、利用感知器算法求解代数判别方程的解时,影响解的因素有哪些?怎样定量地评价解(判决界面)的质量?如何获得具有更高质量的判决界面?

答:(1)初始权重和阈值的选择、数据的规模和质量等都会影响解的生成;

(2)定量地评价解的质量可以使用一些评价指标,比如准确率、误判率、精度、召回率等。这些指标可以用来衡量判决界面对于新数据的分类能力。

(3)要获得具有更高质量的判决界面,可以尝试以下方法:

a、调整感知器的参数:通过调整感知器的参数,比如学习率、迭代次数、初始权重和阈值等,可以优化感知器的性能,提高判决界面的质量。

b、数据预处理:对输入数据进行预处理,比如归一化、去除噪声等,可以提高感知器的分类性能,进而提高判决界面的质量。

c、特征选择:选择与分类结果相关性较高的特征,可以降低感知器的复杂度,提高分类速度,进而提高判决界面的质量。

2、面对多类问题,应采用怎样的判决与迭代思路?如何相应的调整MATLAB代码?

    答:我所采用的方式是将多分类转化成多个二分类,在二分类模型的基础之上进行扩展,此时的判决与迭代条件仍然是输出参数不再更新时停止迭代,在代码上只需对多分类的数据进行预处理即可。

3、若要实现对非线性可分问题(一般问题)的求解,如何改进实验中的感知器算法?

答:经查阅资料,对于非线性可分问题,传统的感知器算法可能无法得到理想的分类效果,可以通过引入核函数、集成学习、深度学习和优化算法等方法来改进实验中的感知器算法,以提高分类效果和性能。

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值