Previous Next

8.1 Anexo 1. Código fuente de SOM

/**

* Metodo que ajusta pesos de vecinos

*/

public void Ajusta_pesos(int noutput, int ninput, int mradio, int nradio, int ciclos, int tipo_beta, float[] red, int t, int coordx, int coordy, float[] in_patt)

{

int i,j,k, IJ;

float tiempo;

int distx, disty, distxneg, distxpos, distyneg, distypos, dist;

float I, S, e, beta;

int startx, starty, endx, endy, radio;

radio = (int)(mradio * ((float)(ciclos -t)/ciclos) + 0.9999999);

if (radio < 1)

radio = 1 ;

startx = ( coordx - radio + noutput) % noutput;

starty = ( coordy - radio + noutput) % noutput;

endx = ( coordx + radio + 1 + noutput) % noutput;

endy = ( coordy + radio + 1 + noutput) % noutput;

dist=0;

beta=0;

// Tipo de funcion beta aplicada para ponderacion

switch(tipo_beta)

{

case 1: beta = 1/((float)t);

break;

 

case 2: beta = (float)0.2 * (1 -(float)t/10000);

break;

case 3: tiempo = (float)t /((float) ciclos);

I = ((float)0.08 + (float)0.5* tiempo);

S = ((float)0.32 - (float)nradio*(float)7.06)*tiempo + (float)nradio*(float)7.06;

e = (float) java.lang.Math.exp((-1*dist*dist)/ (2*S*S));

beta = I*e;

break;

case 4:

beta = (float)0.9*((float)1-(float)((float)t/(float)ciclos));

if (beta < (float)0.01)

beta = (float)0.01;

break;

} /* End del Switch */

for ( i = startx ; i != endx; i = (i + 1 + noutput) % noutput)

{

distxpos = java.lang.Math.abs(noutput + coordx - i) % noutput;

distxneg = java.lang.Math.abs(-noutput + coordx - i) % noutput;

 

if (distxpos > distxneg)

distx = distxneg;

else

distx = distxpos;

distx = coordx -i;

for ( j = starty ; j != endy ; j = (j + 1 + noutput) % noutput)

{

distypos = java.lang.Math.abs(noutput + coordy-j) % noutput;

distyneg = java.lang.Math.abs(-noutput+ coordy-j) % noutput;

if (distypos > distyneg)

disty = distyneg;

else

disty = distypos;

disty = coordy -j;

if ((distx <= radio ) && ( disty <= radio))

{

if (distx >= disty)

dist = distx;

else

dist = disty;

IJ = i*noutput*ninput + j*ninput + 1;

for ( k = 0 ; k < ninput; k ++)

red[IJ + k] += (beta *(in_patt[k]-red[IJ + k])*(1 - 0.5*(float)(dist/(1+radio))));

}

}

}

}/* End Ajusta_Pesos */

 

/**

* Calcula distancias entre puntos

*/

public int[] Calcula_Distancia(int ninput,int noutput,float[] R,float[] a, float[] red,int coordx, int coordy)

{

int i, j, h, k, IJ;

float dist, dismin, dismin2;

float[] dif=new float[ninput];

float mult;

int[] returner=new int[2];

dismin2 = 200;

dismin = (float)java.lang.Math.sqrt(dismin2);

 

for(i = 0; i < noutput ; i++)

for(j = 0; j < noutput ; j++)

{

IJ = i*noutput*ninput + j*ninput + 1;

dist = (float)0.0;

for(k = 0; k < ninput ;k++)

dif[k] = a[k] - red[IJ + k];

 

dist = (float)0.0;

for(k = 0; k < ninput; k++)

{

mult = (float)0.0;

for(h = 0; h < ninput; h++)

mult += dif[h] * R[ninput+h-k];

dist += dif[k] * mult;

if(dist > dismin)

break;

 

}

dist=(float)java.lang.Math.sqrt(dist);

if(dist < dismin)

{

dismin = dist;

dismin2 = dist*dist;

coordx = i;

coordy = j;

}

}

returner[0]=coordx;

returner[1]=coordy;

return returner;

}

 

 

 

 

 

/**

* Metodo utilizado para entrenar red de kohonen

*/

public void entrenaKohonen(String nombre, int ciclos, int mradio, int nradio, int tipo_beta, float[] red,int ninput,int noutput)

{

float[] a =new float[ninput];

float[] R =new float[2*ninput];

float salta;

int coordx=0;

int coordy=0;

Integer datos;

boolean eof=false;

try {

FileReader reader=new FileReader(nombre);

StreamTokenizer st=new StreamTokenizer(reader);

st.nextToken();

 

for (int t = 0 ; t < ciclos ; t++)

{

if ((t % 5) == 0) ;

//PrintWeight(red, ninput, noutput,t);

matrixnum=0;

while (st.ttype!=st.TT_EOF)

{

 

for(int i = 0 ; i < ninput ; i++)

{

a[i]=(float)st.nval;

st.nextToken();

String s=new String();

}

 

for(int i = 0 ; i < ninput ; i++)

{

R[ninput+i]=(float)st.nval;

st.nextToken();

R[ninput-i] = R[ninput+i];

}

salta=(float)st.nval;

String s2=new String();

int[] tempint=new int[2];

tempint=Calcula_Distancia(ninput,noutput,R,a, red,coordx, coordy);

 

coordx=tempint[0];

coordy=tempint[1];

 

Ajusta_pesos(noutput, ninput, mradio, nradio, ciclos, tipo_beta, red, t, coordx, coordy,a);

}

}

 

/* del for para t */

/* Seleccion final de los centroides */

FileReader reader2=new FileReader(nombre);

StreamTokenizer st2=new StreamTokenizer(reader2);

st2.nextToken();

File outputFile = new File("model.obj");

FileWriter out = new FileWriter(outputFile);

 

matrix1=new int[noutput+1][noutput+1];

for (int p=0;p<=noutput;p++)

for (int k=0;k<=noutput;k++)

matrix1[p][k]=0;

matrix1=new int[noutput+1][noutput+1];

while (st2.ttype!=st2.TT_EOF)

{

/* Leemos los patrones a y R */

for(int i = 0 ; i < ninput ; i++)

{

a[i]=(float)st2.nval;

st2.nextToken();

String s=new String();

}

for(int i = 0 ; i < ninput ; i++)

{

R[ninput+i]=(float)st2.nval;

st2.nextToken();

R[ninput-i] = R[ninput+i];

}

salta=(float)st2.nval;

 

int[] tempint=new int[2];

tempint=Calcula_Distancia(ninput,noutput,R,a, red,coordx, coordy);

matrixnum=matrixnum+1;

coordx=tempint[0];

coordy=tempint[1];

matrix1[coordx][coordy]+=1;

 

int IJ = coordx*noutput*ninput + coordy*ninput + 1;

for(int i = 0 ; i < ninput; i++)

red[IJ + i] = a[i] ;

}

String s=new String();

String s1=new String();

String s2=new String();

int i=0;

/* Se encarga de escribir archivo que utilizara parte grafica */

for (int k=0;k<noutput;k++)

for (int p=0;p<noutput;p++)

{

out.write("v "+s.valueOf(k)+" "+s.valueOf(p)+" "+s.valueOf(matrix1[k][p])+"\n");

}

for (int k=1;k<noutput*noutput-1;k++)

{

if (k%noutput!=0)

out.write("l "+s.valueOf(k)+" "+s.valueOf(k+1)+"\n");

}

for (int k=1;k<noutput*noutput-noutput;k++)

{

out.write("l "+s.valueOf(k)+" "+s.valueOf(k+noutput)+"\n");

}

out.close();

}

catch (Exception e) /* Manejo de Excepciones de Manera General */

{

ivjTextArea1.append("Error : "+ e.getMessage() +"\n");

}

}


Previous Next

 

Copyright Nelson Flores 2001.

Departamento de Ciencias de la Computacion, Universidad de Chile.