【问题标题】:Perceptron training in MatlabMatlab中的感知器训练
【发布时间】:2013-12-23 02:36:34
【问题描述】:

我正在尝试在 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 值和偏差是一个。每个输入都分配了一个介于 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

【问题讨论】:

  • 当有人试图执行您提供的代码时会出现多个问题。次要:在两个图之间添加“等待”语句。主要:我建议调试您提供的代码的第二部分(实际的感知器算法),以便正确初始化/定义变量:权重、Z、eta、sizea 等。干杯

标签: matlab machine-learning classification perceptron


【解决方案1】:

你的代码有两个主要问题:

  1. 每次更新weights 向量时,都需要在循环中更新v
  2. 您似乎有 10 个训练集。因此,您必须在循环中按顺序更新v,而不是同时更新。继续迭代每个训练集,更新weights,然后使用新的weights 计算下一个训练集的v,依此类推,直到没有错误(errors = 0 在你的情况下) .

小问题:

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

应该是

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

您可以参考this example了解更多算法细节。

【讨论】:

  • 我已经编辑了我的原始帖子。现在,每当更新权重时都会更新 V。我也调整了 if 语句,但我似乎仍然有一个无限运行的循环。对于 V,我应该不是说如果 v >=1 则 v = 1,而是应用我用来绘制点的方程?我不确定 v 的值如何适合这个等式,除非我只是将 v 的值与等式的结果进行比较以绘制我的观点。
  • 您可以将阈值更改为 0.5,就像我向您展示的示例一样。此外,您可能需要在 v = sum((1*weights(1,1)) + (Z(i,1)*weights(1,2)) + (Z(i,2)*weights (1,3)));其中 i 是您拥有的第 i 个训练样本。仅使用一个样本更新 v 和权重
  • @lennon310,这是一个二进制在线感知器吗?
猜你喜欢
  • 2016-03-02
  • 2021-09-07
  • 2013-01-03
  • 1970-01-01
  • 2021-12-15
  • 2017-05-10
  • 2014-11-04
  • 2017-07-16
  • 2023-03-29
相关资源
最近更新 更多