在MATLAB中使用感知器对数据进行分类

克里斯

我正在生成可以线性分离的随机数据。我想编写自己的感知器版本以将它们分开。我知道有些帖子也有类似的问题-但我找不到我的错误。我真的被困住了。该算法有效,但似乎无法收敛。如果您能帮助我,我将不胜感激。

我的代码:

single_layer_perceptron.m

% INPUT
% amount of values
points = 20;
% stepsize
s = 1.0;

% INITIALIZE
% Booleans
TRUE  = 1;
FALSE = 0;

% generate data
D = generateRandomData(points);
% x-values
x = D(:,1);
% y-values
y = D(:,2);
% training set
d = D(:,3);
% weights
w = zeros(3,1);
% bias
b = 1;
% sucsess flag
isCorrect = FALSE;
% correctly predicted values counter
p = 0;
% COMPUTE 

% while at east one point is not correctly classified
while isCorrect == FALSE
    % for every point in the dataset
    for i=1 : points
        % calculate outcome with current weight
        c = heaviside(b * w(1) + x(i) * w(2) + y(i) * w(3));
        % compare output with training set
        a = errorFunction(c,d(i)); 
        % if outcome was wrong
        if a ~= 0
            % ajust weights
            w(1) = w(1) + a*s*b;
            w(2) = w(2) + a*s*x(i);
            w(3) = w(3) + a*s*y(i);
        else
            % increase correctness counter
            p = p + 1;
        end
    end

    %disp(w);
    disp(p);

    if p >= points
       isCorrect = TRUE;
    end

    p = 0;

end

generateRandomData.m

function f = generateRandomData(points)
% generates random data that can be lineary seperated (silent)
% generate random function y = mx + n
m = 2  * rand * sign(randn);   % in (-2,2)/0
n = 10  * rand + 5;            % in (5,15)

% generate random points
x = 20 * rand(points,2);        % in ((0,20), (0,20))

% labeling
f = [x, zeros(points,1)];
for i=1:length(x(:,1))
    y = m*x(i,1) + n;
    if x(i,2) > y
        f(i,3) = 1;
    end    
end

end

activationFunctionHeaviside.m

function f = activationFunctionHeaviside(x)
f = (1/2)*(sign(x)+1);
end

errorFunction.m

function f = errorFunction(c,d)
% w has been classified as c - w should be d

if c < d 
    % reaction too small 
    f = -1;
elseif c > d
    % reaction too large
    f = 1;
else
    % reaction correct
    f = 0;
end

end

非常感谢!

塔舒卡

单层感知器是线性二元分类器即当数据不是线性可分不收敛如果绘制数据,则两个类都重叠。

在此处输入图片说明

我们可以通过在您的函数generateRandomData.m中添加公差来解决此问题

function f = generateRandomData(points)
% generates random data that can be lineary seperated (silent)
% generate random function y = mx + n
m = 2  * rand * sign(randn);   % in (-2,2)/0
n = 10  * rand + 5;            % in (5,15)

% generate random points
x = 20 * rand(points,2);        % in ((0,20), (0,20))

% tolerance
tol = 0.5;

% labeling
f = [x, -ones(points,1)];
for ii=1:size(f,1)
    y = m*f(ii,1) + n;
    if f(ii,2) > y+tol
        f(ii,3) = 1;
    elseif f(ii,2) < y-tol
        f(ii,3) = 0;
    else
        f(ii,1) = f(ii,1)+2*tol;
        f(ii,3) = 1;
    end    
end
end

但是,由于errorFunction.m已切换符号,因此您的代码仍未收敛应该是这样的:

function f = errorFunction(c,d)
% w has been classified as c - w should be d

if c < d 
    % reaction too small 
    f = +1;
elseif c > d
    % reaction too large
    f = -1;
else
    % reaction correct
    f = 0;
end

end

一旦完成了这些更改,便得到了一个很好的线性分类:

在此处输入图片说明

绘制假设的代码:

% Plot
idx = logical(D(:,3));
Xax = 0:20; Yax=-(b*w(1)+Xax*w(2))/w(3);
figure;
hold on;
scatter(D(idx,1),D(idx,2),'bo')
scatter(D(~idx,1),D(~idx,2),'rx')
plot(Xax,Yax,'k--')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Keras的多层感知器进行多类分类

来自分类Dev

sknn多层感知器分类器

来自分类Dev

感知器中的错误分类错误

来自分类Dev

使用感知器进行情感分析

来自分类Dev

使用感知器进行情感分析

来自分类Dev

MATLAB中3类分类器单层感知器的代码

来自分类Dev

如何使用KNN在MATLAB中对数据进行分类?

来自分类Dev

用单层感知器对手写数字进行分类

来自分类Dev

创建单个感知器进行训练

来自分类Dev

使用多层感知器的 XOR 分类为所有输入输出 1

来自分类Dev

如何在Matlab中为多层数据集创建多层感知器

来自分类Dev

了解感知器

来自分类Dev

了解感知器

来自分类Dev

无法使用R对数据进行分类

来自分类Dev

根据年份在MATLAB中对数据(单元阵列)进行分类

来自分类Dev

单层感知器训练?

来自分类Dev

scikit感知器偏差

来自分类Dev

感知器乙状结肠

来自分类Dev

感知器学习算法

来自分类Dev

对感知器功能的困惑

来自分类Dev

多层感知器问题

来自分类Dev

使用遗传算法进化多层感知器

来自分类Dev

使用PyCaffe的全连接多层感知器

来自分类Dev

创建用于多类分类的基本前馈感知器神经网络

来自分类Dev

创建用于多类分类的基本前馈感知器神经网络

来自分类Dev

使用 Python 根据整数值对数据进行分类

来自分类Dev

MATLAB:使用 fitctree 训练分类器对新数据进行标签预测

来自分类Dev

多类 Keras 感知器分类器将所有内容都归类为一个类

来自分类Dev

什么是带有滑动窗口的多层感知器以及如何进行训练和测试