gpt4 book ai didi

matlab - Matlab 中的感知器训练

转载 作者:行者123 更新时间:2023-11-30 09:02:05 25 4
gpt4 key购买 nike

我正在尝试在 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

最佳答案

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

  1. 每次更新权重向量时,您都需要更新循环中的v
  2. 您似乎有 10 个训练集。因此,您必须在循环中按顺序更新 v,而不是同时更新。继续迭代每个训练集,更新权重,然后使用新的权重计算下一个训练集的 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获取算法的更多细节。

关于matlab - Matlab 中的感知器训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20412115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com