Bien, no tengo ningun problema en poner mi codigo completo, es un poco extenso pero ahi va
function varargout = interfaz(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @interfaz_OpeningFcn, ...
'gui_OutputFcn', @interfaz_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function interfaz_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = interfaz_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles)
function edit1_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit2_Callback(hObject, eventdata, handles)
function edit2_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit3_Callback(hObject, eventdata, handles)
function edit3_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit4_Callback(hObject, eventdata, handles)
function edit4_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%%AQUI LO IMPORTANTE
function pushbutton1_Callback(hObject, eventdata, handles)
a=get(handles.uitable1,'Data');
g=str2double(a(:,:)) ;
c1=str2double(a(:,1)); % Datos de la primera entrada
c2=str2double(a(:,2)); % Datos de la segunda entrada
b=max(max(c1));
c=max(max(c2));
d=min(min(c1));
e=min(min(c2));
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
f=str2double(get(handles.edit1,'String')); %Optención k (número de patrones)
alpha=str2double(get(handles.edit2,'String')); %Optención ritmo de aprendizaje
niu=str2double(get(handles.edit3,'String')); %Optención niu coeficiente de momento
ed=str2double(get(handles.edit4,'String')); %Optención erro min promedio
%Obtención salida deseada
A=zeros(f,3);
for i=1:f
A(i,1)= ((2*g(i,1))/(b-d))+(1-((2*b)/(b-d))); %Normalización de datos primera entrada
end
for i=1:f
A(i,2)= ((2*g(i,2))/(c-e))+(1-((2*c)/(c-e))); %Normalización de Datos Segunda entrada
end
yd=zeros(f,1);
for i=1:f
if A(i,1)>0 && A(i,2)>0
yd(i,1)=1;
elseif A(i,1)<0 && A(i,2)<0
yd(i,1)=-1;
else
yd(i,1)=-1;
end
end
%Inicialización de pesos de forma random dentro de un rango de []
a0=1;
% Primero se preguntará si el enrtenamiento ha de hacerse por lotes o de patron en patron
modo=get(handles.online,'value');
w0=0.002/f;
w1=0.1/f;
w2=0.5/f;
want1=0.8/f;
want2=0.2/f;
want0=0.3/f;
if modo==1 %Online
w=[w1 w2];
eprom=[1 1 1];
cont=0;
cont1=1;% Repeticiones
eq0=0;
eq1=0;
eq2=0;
y=zeros(f,3);
yf=zeros(f,3);
axes(handles.axes2); % se elige el axes 2
cla;
while ((eprom(1,1)>ed)||(eprom(1,2)>ed)||(eprom(1,3)>ed))
for j=1:f
%Multiplica los pesos por las entrada
y0=w0*a0;
y1=(A(j,1)*w(1,1));
y2=(A(j,2)*w(1,2));
y(j,:)=[y0 y1 y2];
yf(j,:)=(1-exp(-y(j,:)))/(1+exp(-y(j,:)));
e((j+(cont*f)),1)=yd(j,:)-yf(j,1);
e((j+(cont*f)),2)=yd(j,:)-yf(j,2);
e((j+(cont*f)),3)=yd(j,:)-yf(j,3);
% Error cuadrático
ex0=(e((j+(cont*f)),1))^2;
ex1=(e((j+(cont*f)),2))^2;
ex2=(e((j+(cont*f)),3))^2;
eq0=eq0+ex0;
eq1=eq1+ex1;
eq2=eq2+ex2;
eprom(1,1)=(1/(cont1))*(eq0);%Error promedio Gráfica 2
eprom(1,2)=(1/(cont1))*(eq1);%Error promedio Gráfica 2
eprom(1,3)=(1/(cont1))*(eq2)%Error promedio Gráfica 2
epromt=sqrt(eprom(1,1)^2+eprom(1,3)^2+eprom(1,3)^2);
%Posterior mente se calcula el nuevo peso W
%1. Se calcula la derivada de la función de activación dada por 1- phi^2
dev_phi_1=1-((yf(j,2))^2);
dev_phi_2=1-((yf(j,3))^2);
dev_phi_0=1-((yf(j,1))^2);
%plot(eprom,cont1)
wp3=w0;
w1=w(1,1)+(alpha*e((j+(cont*f)),2)*dev_phi_1*A(j,1))+ niu*(w(1,1)-want1)
w2=w(1,2)+(alpha*e((j+(cont*f)),3)*dev_phi_2*A(j,2))+ niu*(w(1,2)-want2)
w0=w0+(alpha*e((j+(cont*f)),1)*dev_phi_0*1)+ niu*(w0-want0)
want1=w(1,1);
want2=w(1,2);
want0=wp3;
w=[w1 w2];
end
cont=cont+1;
cont1=cont1+1;
if(cont==300000)
break;
end
plot(w1,w2,'*r');
%plot(cont1,epromt,'*r');
hold on
end
else %Por Lotes
eprom=[1 1 1];
dev_phi_1=zeros(f,1);
dev_phi_2=zeros(f,1);
dev_phi_0=zeros(f,1);
cont=0;
cont1=1;% Repeticiones
eq0=0;
eq1=0;
eq2=0;
e=zeros(f,3);
y=zeros(f,3);
y1=zeros(f,1);
y2=zeros(f,1);
yf=zeros(f,3);
w0=w0*ones(f,1);
w1=w1*ones(f,1);
w2=w2*ones(f,1);
want0=want0*ones(f,1);
want1=want1*ones(f,1);
want2=want2*ones(f,1);
eqprom=[0 0 0];
axes(handles.axes2); % se elige el axes 2
cla
while ((eprom(1,1)>ed)||(eprom(1,2)>ed)||(eprom(1,3)>ed))
%Multiplica los pesos por las entrada fx1*1xf
y0=a0*w0;
for i=1:f
y1(i,1)=(A(i,1)*(w1(i,1)));
y2(i,1)=(A(i,2)*(w2(i,1)));
end
y(:,1)= y0;
y(:,2)= y1;
y(:,3)= y2;
for i=1:f
for k=1:3
yf(i,k)=(1-exp(-y(i,k)))/(1+exp(-y(i,k)));
end
end
e(:,1)=yd-yf(:,1);
e(:,2)=yd-yf(:,2);
e(:,3)=yd-yf(:,3);
% Error cuadrático
for i=1:f
ex0=(e(i,1))^2;
ex1=(e(i,2))^2;
ex2=(e(i,3))^2;
eq0=eq0+ex0;
eq1=eq1+ex1;
eq2=eq2+ex2;
eq(cont1,1)=eq0;
eq(cont1,2)=eq1;
eq(cont1,3)=eq2;
end
eprom(1,1)=(1/(cont1))*(eq0);%Error promedio Gráfica 2
eprom(1,2)=(1/(cont1))*(eq1);%Error promedio Gráfica 2
eprom(1,3)=(1/(cont1))*(eq2)%Error promedio Gráfica 2
epromt=sqrt(eprom(1,1)^2+eprom(1,3)^2+eprom(1,3)^2);
%Posterior mente se calcula el nuevo peso W
%1. Se calcula la derivada de la función de activación dada por 1- phi^2
for i=1:f
dev_phi_1(i,1)=1-((yf(i,2))^2);
dev_phi_2(i,1)=1-((yf(i,3))^2);
dev_phi_0(i,1)=1-((yf(i,1))^2);
end
wp3=w0;
wp1=w1;
wp2=w2;
for i=1:f
w1(i,1)=w1(i,1)+(alpha*e(i,2)*dev_phi_1(i,1)*A(i,1))+ niu*(w1(i,1)-want1(i,1));
w2(i,1)=w2(i,1)+(alpha*e(i,3)*dev_phi_2(i,1)*A(i,2))+ niu*(w2(i,1)-want2(i,1));
w0(i,1)=w0(i,1)+(alpha*e(i,1)*dev_phi_0(i,1)*1)+ niu*(w0(i,1)-want0(i,1));
end
want1=wp1;
want2=wp2;
want0=wp3;
w=[w1 w2]
w0
cont=cont+1;
cont1=cont1+1;
if(cont==300000)
break;
end
plot(w1,w2,'+');
%plot(cont1,epromt,'+');
hold on
end
end
Bien como puedes ver yo defino el axes que voy a trabajar antes del while, y grafico w1 y w2 y tengo comentado cont1, epromt1 porque no puedo hacer que se grafiquen los dos datos al tiempo, como puedes ver tengo 300000 iteraciones y apenas se cumplan se para el proceso y ps todo se hace cuando pulso un boton