我想对fisheriris数据应用感知器算法,我尝试了这段代码
function [ ] = Per( )
%PERCEPTON_NN Summary of this function goes here
% Detailed explanation goes here
%%%%%%%%%%%STEP ONE INPUT DATA PREPERATION
%N=3000;
load fisheriris
tr=50; %traning
te=50; %test
epochs =150;
data=meas;
%N = size(meas,1);
%species=nonomil(species)
%figure,plot(data_shuffeled(1,:),data_shuffeled(2,:),'rx');
%%%%%%%%%%%%%%%%%%%STEP TWO INTIALIZE WEIGHT
baise=1;
w=[baise; 1 ; 1;1 ; 1];
eta=0.9; %%learning rate
%%%%%%%%%%%%%%%%%%%%%%%% Rosen Blatt learning Algo
for epoch=1 : epochs
for i=1 : tr
x=[1;data(i,1);data(i,2);data(i,3);data(i,4)]; % input vector
N = size(species,i); %desiard output
y=w'*x; % y=actual output ,w'= transpose w , mmoken y=w.*x
%%%%%%%%%%%%%%% Activation function (hardlimit)(step fn)
y=1*(y>=0)+(-1)*(y<0); % da badl el if
%%%%%%%%%%% Error calcualtion %%%%%%%
err(i)=N-y;
%%%%%%%%%%%%%% update weight %%%%%%%%%5
wnew=w+ eta*err(i)*x;
w=wnew;
end
mse(epoch)=mean(err.^2);
end
%%%%%%%%%%%%%%%%%%%%%% step four classification (testing) %%%%%%%%%%%%%%%%%%5
hold on
for i=1 : te
%x=[1;data(i,1);data(i,2),data(i,3);data(i,4)];
x=[1;data(i,1);data(i,2);data(i,3);data(i,4)];
% d=data_shuffeled(3,i+tr);
N = size(species,i);
y=w'*x;
y=1*(y>=0)+(-1)*(y<0);
if (y==1)
plot(x(2),x(3),x(4),x(5),'rx');
elseif y==-1
plot(x(2),x(3),x(4),x(5),'r&');
end
end
hold off
if abs(N-y)>1E-6
testerro=testerro+1;
end
我编写了这段代码,使感知器算法以fisheriris数据“meas”作为输入,物种作为“输出”
代码中的任何帮助或对此代码的任何修改。
谢谢。
答案 0 :(得分:0)
首先,您是否知道MATLAB具有神经网络训练的功能,称为Neural network toolbox?
其次,认为data_shuffeled是你自己的功能。在MATLAB中有一些叫做randperm
的东西,您应该用它来混淆数据。
第三,当你可以在MATLAB中使用向量/矩阵时,你想避免使用for循环。
而不是(用于测试)
for i = 1:te,
....
end
您可能想要
X = [ones(te,1), data]; %X is [50x5] so each row of X is x'
y = X*w; %y is [50x1], X is [50x5], w is [5x1]
idx_p1 = y==1; %all the indices of y where y is +1
idx_m1 = y==-1; %all the indicies of y where y is -1
plot(X(idx_p1,1),y(idx_p1),'rx');
plot(X(idx_m1,1),y(idx_m1),'r&');
我不知道你如何使用plot
和4维X,所以上面只是用X的第一个特征(列)绘制。
另外,训练对我来说很奇怪。首先,我不认为你应该使用N来表示数据矩阵测量的大小和所需的输出。 'yhat'或'ybar'是一个更好的名字。此外,如果N是所需的输出,那么为什么i size(species,i)
在哪里我循环通过1:50?物种是[150x1]向量。 size(species,1) = 150
。并且size(species,x)
其中x是2到50将是1.你确定要这个吗?不应该是这样的:
yhat = -ones(50,1); %Everything is -1
yhat(strmatch('virginica,species)) = 1; %except virginicas which are +1