Matlab中的感知器训练

时间:2013-12-05 22:27:19

标签: matlab machine-learning classification perceptron

我正在尝试在MATLAB中创建一个简单的感知器训练函数。我想在没有发现错误的情况下返回权重。

这是我想要分类的数据。

d = rand(10,2);
figure

labels = ones(10,1);
diff =  d(:,1) + d(:,2) - 1;
labels( diff + 1 >= 1) = 2;

pathWidth = 0.05;
labels( abs(diff) < pathWidth) = [];
d(abs(diff) < pathWidth,:) = [];

plot(d(labels == 1,1),d(labels == 1,2),'k.','MarkerSize',10)
plot(d(labels == 2,1),d(labels == 2,2),'r.','MarkerSize',10)

它生成一个标记数据集,如果增加d的点数,则两个类(红色,黑色)之间的分割更加明显。

对于我的感知器功能,我传递数据(d)和标签。我有3个输入,x值,y值和偏差是1。每个输入都具有0到1之间的随机权重。请注意,数据集d我在感知器功能中命名为Z. 我确实使用了sigmoid激活函数,但是它会在while循环中运行一次并且在此之后总是返回true,sigmoid函数也给了我inf或1的值。下面我只使用阈值激活但它似乎不断循环而不是回报我的重量。我认为问题可能在于下面的if语句

if(v >= 0 && labels(i) == 1 || v < 0 && labels(i) == 2)

感知器功能:

function perceptron(data,labels)

sizea = numel(data(:,1));
weights = rand(sizea,3);

Z = data(:,:)
eta = 0.5;
errors = 1;
count = 0;

while errors > 0 
    errors = 0;
    v = sum((1*weights(1,1)) + (Z(:,1)*weights(1,2)) + (Z(:,2)*weights(1,3)));
    if v >= 1
        v = 1;
    else 
        v = 0;
    end
    count = count + 1
    for i = 1:sizea % for each object in dataset
        if(v == 1 && labels(i) == 1 || v == 0 && labels(i) == 2)
            errors = 1;
            weights(1,1) = weights(1,1) - (2*v-1) * eta * 1;
            weights(1,2) = weights(1,2) - (2*v-1) * eta * Z(i,1);
            weights(1,3) = weights(1,3) - (2*v-1) * eta * Z(i,2);
            v = sum((1*weights(1,1)) + (Z(:,1)*weights(1,2)) + (Z(:,2)*weights(1,3)));
            if v >= 1
                v = 1;
            else 
                v = 0;
            end
        end
    end 
end

1 个答案:

答案 0 :(得分:2)

您的代码中存在两个主要问题:

  1. 每次更新v向量时,您需要在循环中更新weights
  2. 好像你有10个训练集。因此,您必须在循环中顺序更新v而不是同时更新。继续针对每个训练集进行迭代,更新weights,然后使用新的weights计算下一个训练集的v,依此类推,直到没有错误({在你的情况下{1}}。
  3. 小问题:

    errors = 0

    应该是

    if(v >= 0 && labels(i) == 1 || v < 0 && labels(i) == 2)
    

    您可以参考this example获取算法的更多详细信息。