⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layer.java

📁 Single-layer neural networks can be trained using various learning algorithms. The best-known algori
💻 JAVA
字号:
import java.util.*;class Layer{    Vector neurons;    int size;    // for the pocket algorithm    double p1,p2,p3;    int Rp;    int Rw;	static ArrayList points;	//static double threshold = 0;		//static double z[] = new double[2]; // z[0] = z_minus; z[1] = z_plus    public Layer(String l,int s)    {		String label;		size    = s;		neurons = new Vector();		for(int i = 0; i < s; i++)		{			label = new String(l) + String.valueOf(i);			neurons.addElement(new Neuron(label));		}		initPocket();    }	    public Neuron getNeuron(int i)    {		int         j=0;		boolean     found=false;		Neuron      neuron=null;		Enumeration e = neurons.elements();		while(e.hasMoreElements())	    {		neuron = (Neuron)e.nextElement();		if (i==j)		    {			found = true;			break;		    } else j++;	    }	if (found==false) neuron = null;	return neuron;    }	    public void computeOutputs(Sample sample)    {		Neuron neuron;		Enumeration e = neurons.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.computeOutput(sample);	    }    }	    public void computeAdaline(Vector s)    {	Neuron neuron;	Synapse synapse;	Enumeration syn;	Enumeration e = neurons.elements();	Enumeration d = s.elements();	while(e.hasMoreElements())	    {		neuron = (Neuron)e.nextElement();		neuron.computeAdalineDelta(((Double)d.nextElement()).doubleValue());		syn = neuron.inlinks.elements();		while(syn.hasMoreElements())		    {			synapse = (Synapse)syn.nextElement();			synapse.weight += Neuron.learningRate *			    synapse.from.output * neuron.delta;			// (neuron.delta - 0.5);		    }	    }    }	    public void computePerceptron(Vector s)    {		Neuron neuron;		Synapse synapse;		Enumeration syn;		Enumeration e = neurons.elements();		Enumeration d = s.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.computePerceptronDelta(((Double)d.nextElement()).doubleValue());			syn = neuron.inlinks.elements();			if (Math.abs(neuron.delta) >= 0.5) // misclassified pattern		    while(syn.hasMoreElements())			{			    synapse = (Synapse)syn.nextElement();			    synapse.weight += neuron.delta * Neuron.learningRate *				synapse.from.output;			}	    }    }		public void initOptimal() {			}		public void computeOptimal(Sample s, boolean last_sample)	{		//System.out.println("computeOptimal");		Neuron neuron;		Synapse synapse;		Enumeration syn;		Enumeration e =  neurons.elements();		//Enumeration d = s.out.elements();		boolean supportvector;		Perceptron.threshold_neuron.output = -1.0;		int i = 0;				while(e.hasMoreElements()) {			neuron = (Neuron)e.nextElement();			double t_out = s.o_out;			//System.out.println("t_out:" + t_out);			double gamma = t_out * neuron.output; 			//System.out.println("gamma:" + gamma + " output:" + neuron.output);			double delta_alpha = Neuron.learningRate * (1 - gamma);			//System.out.println("delta_alpha: " + delta_alpha);			if (0 > s.alpha + delta_alpha) {				s.alpha = 0.0;				supportvector = false;			}			else {				//System.out.println("s.alpha vorher:" + s.alpha);				s.alpha = s.alpha + delta_alpha;				//System.out.println("s.alpha nachher:" + s.alpha);				//if (2 < s.alpha) {s.alpha = 2;}				supportvector = true;			}			//System.out.println("alpha:" + s.alpha);			syn = neuron.inlinks.elements();						if (supportvector)				for (int j = 0; 2 > j; j++) {					synapse = (Synapse)syn.nextElement();				    //synapse.weight += s.alpha * delta_alpha * t_out * synapse.from.output;					synapse.weight += delta_alpha * t_out * synapse.from.output;					//System.out.println("sfo:" + synapse.from.output + " Weight:" + synapse.weight);						/*neuron.delta * Neuron.learningRate *					synapse.from.output;*/			}			//Enumeration in = Perceptron.inputSamples.elements();			//Enumeration out = Perceptron.outputSamples.elements();			boolean[] i_z = new boolean[2];			i_z[0] = true;			i_z[1] = true;			double[] z = new double[2];			Enumeration tns = Perceptron.threshold_neuron.outlinks.elements();			Synapse tnsyn = (Synapse)tns.nextElement();			Enumeration samples = InputSpaceCanvas.points.elements();			while (samples.hasMoreElements()) {				/*				Vector v_in = (Vector) in.nextElement();				Enumeration e_v_in = v_in.elements();								syn = neuron.inlinks.elements();				double sum = 0;				while (syn.hasMoreElements()) {					synapse = (Synapse)syn.nextElement();					sum += synapse.from.getOutput() * synapse.getWeight();; 				}*/				Sample sample = (Sample) samples.nextElement();				double v_out = sample.out;				//Enumeration e_v_out = v_out.elements();								Vector output =  SimplePerceptronApplet.perceptron.recognize(sample);				double d_output = ((Double) output.get(0)).doubleValue() + tnsyn.weight;				//int to = ((Double) e_v_out.nextElement()).intValue(); 				switch ((int) sample.o_out) {				case -1:					if (i_z[0]) {						i_z[0] = false;						z[0] = d_output;					}					else {						z[0] = Math.max(z[0], d_output);					}					break;				case 1:					if (i_z[1]) {						i_z[1] = false;						z[1] = d_output;					}					else {						z[1] = Math.min(z[1], d_output);					}					break;				default:					System.out.println("to");					break;				}			}			//System.out.println("th0:" + Perceptron.threshold_neuron.output);			//System.out.println("z0:" + z[0] + " z1:" + z[1]);			//System.out.println("z0 + z1:" + (z[0] + z[1]));			//Perceptron.threshold = (z[0] + z[1]) / 2;			//Perceptron.threshold_neuron.output = - Perceptron.threshold;			/*			if (last_sample) {				if ((z[0] > z[1]) && (Math.abs((z[1] - z[0])/(z[1] + z[0])) > Perceptron.z_temp) && (0.0 != Perceptron.z_temp)) {					SimplePerceptronApplet.notSeparable.show();				}				Perceptron.z_temp = Math.abs((z[1] - z[0])/(z[1] + z[0]));				System.out.println("z_temp:" + Perceptron.z_temp);				tnsyn.weight = (z[0] + z[1])/2;				System.out.println("tnsyn:" + tnsyn.weight);			}			*/			tnsyn.weight = (z[0] + z[1])/2;			//System.out.println("tnsyn:" + tnsyn.weight);			i++;		}	}		public void computeSVM(Sample s) {		Neuron neuron;		Synapse synapse;		Enumeration syn;		Enumeration e = neurons.elements();		double z_my;		Enumeration tns = Perceptron.threshold_neuron.outlinks.elements();		Synapse threshold = (Synapse)tns.nextElement();		neuron = (Neuron)e.nextElement();		Enumeration samples = InputSpaceCanvas.points.elements();		z_my = z(s);		double gamma = s.o_out * z_my; 		double delta_alpha = Neuron.learningRate * (1 - gamma);		if (0 > s.alpha + delta_alpha) {			s.alpha = 0.0;		}		else {			s.alpha += delta_alpha;		}		syn = neuron.inlinks.elements();		double[] z = svm_get_z_min_max();		threshold.weight += (z[0] + z[1])/2;		System.out.println("th:" + threshold.weight + " z0:" + z[0] + " z1:" + z[1]);		for (int j = 0; 2 > j; j++) {			synapse = (Synapse)syn.nextElement();			synapse.weight = svm_weight(j);		}	}		public double[] svm_get_z_min_max() {		boolean[] i_z = new boolean[2];		i_z[0] = true;		i_z[1] = true;		double[] z = new double[2];		Enumeration samples = InputSpaceCanvas.points.elements();				while (samples.hasMoreElements()) {			Sample sample = (Sample) samples.nextElement();			double z_t = z(sample); 			switch ((int) sample.o_out) {			case -1:				if (i_z[0]) {					i_z[0] = false;					z[0] = z_t;				}				else {					z[0] = Math.max(z[0], z_t);				}				break;			case 1:				if (i_z[1]) {					i_z[1] = false;					z[1] = z_t;				}				else {					z[1] = Math.min(z[1], z_t);				}				break;			default:				System.out.println("to");				break;			}		}		return z;	}		public double svm_weight(int j) {		double weight = 0;		Enumeration samples = InputSpaceCanvas.points.elements();		while (samples.hasMoreElements()) {			Sample sample = (Sample) samples.nextElement();			weight += sample.alpha * sample.o_out * sample.in[j];		}		return weight;	}		public static double K(double[] a, double[] b) {		double K = 0;		switch (Perceptron.kernel) {		case Perceptron.POLY: 			K = Math.pow((a[0] * b[0] + a[1] * b[1] + Perceptron.C), Perceptron.P);			break;		case Perceptron.GAUSS:			double diff_x = a[0] - b[0];			double diff_y = a[1] - b[1];			double zaehler = diff_x * diff_x + diff_y * diff_y;			double nenner = 2 * Perceptron.S * Perceptron.S;			K = Math.exp(-zaehler/nenner);			break;		}				return K;	}		public double z (Sample my) {		double z_my = 0;		Enumeration tns = Perceptron.threshold_neuron.outlinks.elements();		Synapse tnsyn = (Synapse)tns.nextElement();		Enumeration samples = InputSpaceCanvas.points.elements();		while (samples.hasMoreElements()){			Sample sample = (Sample) samples.nextElement();			z_my += sample.alpha * sample.o_out * K(sample.in, my.in);		}		z_my -= tnsyn.weight;		return z_my;	}	    public void computePocket(Vector s) // works only for 2 in / 1 out    {		boolean change = false;			Neuron neuron;		Synapse synapse;		Enumeration syn;		Enumeration e = neurons.elements();		Enumeration d = s.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.computePerceptronDelta(((Double)d.nextElement()).doubleValue());			if (Math.abs(neuron.delta) < 0.5) // well classified pattern		    {				Rw++;				if (Rw > Rp)			    {					syn = neuron.inlinks.elements();  // save weights					synapse = (Synapse)syn.nextElement();					p1 = synapse.weight;					synapse = (Synapse)syn.nextElement();					p2 = synapse.weight;					synapse = (Synapse)syn.nextElement();					p3 = synapse.weight;					Rp = Rw;			    }		    }			else		    {				syn = neuron.inlinks.elements();				while(syn.hasMoreElements())			    {					synapse = (Synapse)syn.nextElement();					synapse.weight += neuron.delta * 				    Neuron.learningRate * synapse.from.output;			    }				Rw = 0;		    }	    }    }	    public void initPocket()    {		Rw = 0;		Rp = 0;		p1 = 0.0;		p3 = 0.0;		p2 = 0.0;    }	    public void restorePocket()	{		Neuron neuron;		Synapse synapse;		Enumeration syn;			Enumeration e = neurons.elements();		neuron = (Neuron)e.nextElement();		syn = neuron.inlinks.elements();		synapse = (Synapse)syn.nextElement();		synapse.weight = p1;		synapse = (Synapse)syn.nextElement();		synapse.weight = p2;		synapse = (Synapse)syn.nextElement();		synapse.weight = p3;    }	    public void computeBackpropDeltas(Vector s) // for output neurons    {		Neuron neuron;		Enumeration e = neurons.elements();		Enumeration d = s.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.computeBackpropDelta(((Double)d.nextElement()).doubleValue());	    }    }	    public void computeBackpropDeltas() // for hidden neurons    {		Neuron neuron;		Enumeration e = neurons.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.computeBackpropDelta();	    }    }	    public void computeWeights()    {		Neuron neuron;		Enumeration e = neurons.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.computeWeight();	    }    }	    public void print()    {		Neuron neuron;		Enumeration e = neurons.elements();		while(e.hasMoreElements())	    {			neuron = (Neuron)e.nextElement();			neuron.print();	    }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -