Perceptron em Java

2 respostas
FabioSilva

Olá, esse é o primeiro post que faço aqui no GUJ, e tenho uma dúvida quando a um algoritmo Perceptron que tenho que fazer para a faculdade, por enquanto está mais ou menos assim:

public class Operacoes 

{
    
    public static void main(String []a)
    
    {
        
        double QT = 5, TR = 0, U, Erro, TxApr , Epoca;
        int N,K,L,M;
        double Y[] = new double [30];
        double W[] = new double [4];
        double WAnterior[] = new double [4];
        
        for(TR=1;TR<QT;TR++)
        {
           double X[][] = { {-1,0.012,1.456,2.456},{-1,5.752,4.223,0.123},
            {-1,4.785,0.056,12.111},{-1,7.236,4.654,1.336},{-1,4.782,5.233,0.321},
            {-1,9.456,2.222,3.001},{-1,5.612,3.336,4.622},{-1,2.321,4.969,1.997},
            {-1,5.664,3.221,6.456},{-1,7.223,5.112,},{-1,4.775,0.645,2.330},
            {-1,4.777,9.995,3.118},{-1,11.112,6.302,4.445},{-1,6.312,7.845,2.113},
            {-1,9.666,6.666,3.332},{-1,7.782,5.236,4.008},{-1,6.312,4.523,9.997},
            {-1,0.001,0.002,5.003},{-1,5.112,9.725,12.201},{-1,3.672,1.128,3.645},
            {-1,6.521,-2.324,},{-1,8.004,7.820,3.222},{-1,-4.035,6.301,7.232},
            {-1,8.222,-0.022,4.223},{-1,7.366,2.111,-4.555},{-1,3.606,7.565,2.221},
            {-1,3.662,1.118,-4.971},{-1,0.111,0.222,0.333},{-1,0.223,1.256,7.212},
            {-1,9.223,-4.502,1.164}};
           
           double D[] = {-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,
                   1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1};
           
           M = 30;
           N = 4;
          
           for(int i=0;i<N;i++)
           {
                 W[i] = (double) (Math.random()*1000);
                 WAnterior[i] = W[i];
           }
           
           Erro = 1;
           TxApr = 0.01;
           Epoca = 0;
           
           while(Erro ==1)
           {
               Erro = 0;
               for(L = 0; L<M ; L++)
               {
                  U = 0;
                  K = 0;
                  
                  for(K = 0;K<N; K++)
                  {
                      U = U + X[L][K] * W[K];
                  }
                 
                   if(U < 0)
                        Y[L] = 1;
                   else
                        Y[L] = -1;
                
                    if(D[L] != Y[L])
                    {
                        for(K=0;K<N;K++)
                        {
                            W[K] = W[K] + TxApr * (D[L]-Y[L]*X[L][K]);
                        }
                        
                        Erro = 1;
                    }
               }
               Epoca = Epoca + 1;
           }
           
        }              
     }
    
}

Sempre recebo a mensagem de erro: Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 4

Nesse caso o problema seria com alguma posição do vetor que não exista e que esteja tentando utilizar?
Não sei se ficou claro, mas caso possam me ajudar, agradeço desde já.

2 Respostas

L

Beleza, não faço a minima ideia do que o algoritmo faz :stuck_out_tongue: mas o local que ocorre o erro eh aqui

U = U + X[L][K] * W[K];

Pelo menos nesse codigo que vc colocou ai. A principio o erro ocorre porque essa sua matriz X esta errada:

posicao 9 = {-1,7.223,5.112,} falta o ultimo elemento
posicao 20 = {-1,6.521,-2.324,} falta o ultimo elemento

No caso deu ArrayIndexOfBould na posicao 3…

Depois de arrumar essas duas linhas o programa executou em um looping infinito.

Tipo, tah bem dificil de entender seu codigo, da uma olhada nisso:

http://www.tiexpert.net/ver.php?page=37

e tenta refatorar dando uns nomes mais elegantes a suas variaveis (iria ajudar bastante).

Fora que essas coisas

M = 30;  
            N = 4;

deveriam ser substituidas por algo mais dinamico (tipo, length do matriz).

Ah, quando vc obter o ArrayIndexOfBound ele vai te dizer a linha do programa que deu o erro… isso pode te ajudar.

FabioSilva

Certo, ficou mais ou menos assim, sem erros desta vez:

public class Perceptron

{
    
    public static void main(String []a)
    
    {
        
        double QtdTreino = 5, NumTreino = 0, ValorTreino, Erro, TaxaAprendizado , Epoca;
        int Col,Line;
        double ValorSaida[] = new double [30];
        double PesosAjustados[] = new double [4];
        double PesosIniciais[] = new double [4];
        
        for(NumTreino=0;NumTreino<QtdTreino;NumTreino++)
        {
           double ConjuntoTreino[][] = { {-1,0.012,1.456,2.456},{-1,5.752,4.223,0.123},
            {-1,4.785,0.056,12.111},{-1,7.236,4.654,1.336},{-1,4.782,5.233,0.321},
            {-1,9.456,2.222,3.001},{-1,5.612,3.336,4.622},{-1,2.321,4.969,1.997},
            {-1,5.664,3.221,6.456},{-1,7.223,5.112,0.222},{-1,4.775,0.645,2.330},
            {-1,4.777,9.995,3.118},{-1,11.112,6.302,4.445},{-1,6.312,7.845,2.113},
            {-1,9.666,6.666,3.332},{-1,7.782,5.236,4.008},{-1,6.312,4.523,9.997},
            {-1,0.001,0.002,5.003},{-1,5.112,9.725,12.201},{-1,3.672,1.128,3.645},
            {-1,6.521,-2.324,1.111},{-1,8.004,7.820,3.222},{-1,-4.035,6.301,7.232},
            {-1,8.222,-0.022,4.223},{-1,7.366,2.111,-4.555},{-1,3.606,7.565,2.221},
            {-1,3.662,1.118,-4.971},{-1,0.111,0.222,0.333},{-1,0.223,1.256,7.212},
            {-1,9.223,-4.502,1.164}};
           
           double ValorDesejado[] = {-1,-1,1,1,-1,1,-1,-1,1,1,-1,1,1,1,
                   1,1,-1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,-1};
           
            
           
          
           for(int i=0;i<4;i++)
           {
                 PesosAjustados[i] = (double) (Math.random()*10);
                 PesosIniciais[i] = PesosAjustados[i];
           }
           
           Erro = 1;
           TaxaAprendizado = 0.01;
           Epoca = 0;
           
           while(Erro == 1)
           {
               Erro = 0;
               for(Line = 0; Line<ValorSaida.length; Line++)
               {
                  ValorTreino = 0;
                  
                  for(Col = 0;Col<PesosAjustados.length; Col++)
                  {
                      ValorTreino= ValorTreino + ConjuntoTreino[Line][Col] * PesosAjustados[Col];
                  }
                 
                   if(ValorTreino > 0)
                        ValorSaida[Line] = 1;
                   else
                        ValorSaida[Line] = -1;
                
                    if(ValorDesejado[Line] != ValorSaida[Line])
                    {
                        for(Col=0;Col<PesosAjustados.length;Col++)
                        {
                            PesosAjustados[Col] = PesosAjustados[Col] + TaxaAprendizado *
                                    (ValorDesejado[Line]-ValorSaida[Line]*ConjuntoTreino[Line][Col]);
                        }
                        
                        Erro=1;
                    }
               }
               Epoca = Epoca + 1;
           }

           for(Line=0;Line<ValorSaida.length;Line++)
           {
               for(Col=0;Col<PesosAjustados.length;Col++)
               {
                   System.out.print(""+ ConjuntoTreino[Line][Col]);
               }
           }
        }              
     }
    
}

Agora a questão é o looping infinito, ele está acontecendo por causa do Erro=1 sempre ser alcançado já que o ValorDesejado é sempre diferente do ValorSaida
Se puderem me dizer qual o problema aqui tb, seria ótimo.

Obrigado pelas informações anteriores, falha minha ter esquecido de alguns números da matriz...

Criado 5 de maio de 2009
Ultima resposta 5 de mai. de 2009
Respostas 2
Participantes 2