Este artículo describe un algoritmo de red neuronal artificial simple basado en la implementación de Java. Compártelo para su referencia, como sigue:
Echemos un vistazo al diagrama de algoritmo que he dibujado:
2. Categoría de datos
import java.util.Arrays; data de clase pública {double [] vector; División int; tipo int; public Double [] getVector () {return vector; } public void setVector (double [] vector) {this.vector = vector; } public int getDimention () {División de retorno; } public void setDimenter (int division) {this.dimention = division; } public int getType () {Tipo de retorno; } public void settype (int type) {this.type = type; } Datos públicos (doble [] vector, intdimentation, int type) {super (); this.vector = vector; this.dimentation = Dimentation; this.type = type; } public data () {} @Override public String toString () {return "data [vector =" + arrays.toString (vector) + ", dimension =" + dimentation + ", type =" + type + "]"; }}3. Red neuronal artificial simple
paquete cn.edu.hbut.chenjie; import java.util.arrayList; import java.util.list; import java.util.random; import og.jfree.chart.chartyor; import og.jfree.chartfartframe; import og.jfree.jfreechart; import org.jfree.data.xy.defaultxydataSet; import org.jfree.ui.refineryUtility; public class Ann2 {private Double eta; // tasa de aprendizaje private int n_iter; // vector de peso w [] Número de tiempos de capacitación Lista privada <Data> Ejercicio; // Capacitación DataSet Double W0 = 0; // Threshold Private Double X0 = 1 1; Pesos; // Vector de peso, cuya longitud es la dimensión de datos de entrenamiento +1, en este caso los datos son 2 dimensiones, por lo que la longitud es 3 privado int testSum = 0; // Total de datos de prueba Private int Error = 0; // Número de error DefaultxyDataSet xyDataSet = new DefaultXyDataSet (); / *** Agregue datos del mismo tipo al tipo de gráfico* @param Tipo de tipo* @param A El primer componente de todos los datos* @param B El segundo componente de todos los datos*/ public void add (tipo de cadena, doble [] a, double [] b) {double [] [] data = new Double [2] [a.length]; for (int i = 0; i <a.length; i ++) {data [0] [i] = a [i]; datos [1] [i] = b [i]; } xydataset.addseries (tipo, datos); } / *** Draw* / public void draw () {jfreechart jfreechart = ChartFactory.CreateScatterPlot ("Ejercicio", "x1", "x2", xydataSet); ChartFrame Frame = new ChartFrame ("Datos de entrenamiento", jfreeChart); Frame.pack (); Refineryutilities.centerFrameonScreen (marco); Frame.SetVisible (verdadero); } public static void main(String[] args) { ANN2 ann2 = new ANN2(0.001,100);//Construct an artificial neural network List<Data> exercise = new ArrayList<Data>();//Construct a training set//Manually simulate 1,000 training data, the dividing line is x2=x1+0.5 for(int i=0;i<1000000;i++) { Random rd = new Aleatorio(); double x1 = rd.nextDouble (); // Generar un componente aleatorio Double x2 = rd.nextDouble (); // Generar otro componente Double [] da = {x1, x2}; // Generar datos de vector d = Datos nuevos (DA, 2, x2> x1+0.5? 1: -1); // Datos Ejercicio. = 0; // registro tipo 1 int sum2 = 0; // registro tipo-1 número de registro de entrenamiento para (int i = 0; i <ejercicio.size (); i ++) {if (ejercicio.get (i) .gettype () == 1) sum1 ++; else if (ejercicio.get (i) .gettype () ==-1) sum2 ++; } double [] x1 = new Double [sum1]; doble [] y1 = nuevo doble [sum1]; double [] x2 = new Double [sum2]; doble [] y2 = new Double [sum2]; int index1 = 0; int index2 = 0; for (int i = 0; i <ejercicio.size (); i ++) {if (ejercicio.get (i) .gettype () == 1) {x1 [index1] = ejercicio.get (i) .vector [0]; y1 [index1 ++] = ejercicio.get (i) .vector [1]; } else if (ejercicio.get (i) .gettype () ==-1) {x2 [index2] = ejercicio.get (i) .vector [0]; y2 [index2 ++] = ejercicio.get (i) .vector [1]; }} ann2.Add ("1", x1, y1); ann2.Add ("-1", x2, y2); ann2.draw (); ann2.Input (ejercicio); // Ingrese el conjunto de entrenamiento en la red neuronal artificial ann2.fit (); // trenes ann2.showweigths (); // Muestra el vector de peso // Genere manualmente mil datos de prueba para (int i = 0; i <10000; i ++) {rd = new new aleator (); doble x1_ = rd.nextDouble (); doble x2_ = rd.nextDouble (); doble [] da = {x1_, x2_}; Data test = new Data (DA, 2, x2_> x1_+0.5? 1: -1); Ann2.Predict (test); // test} System.out.println ("Total Test" + Ann2.Testsum + "Datos de bits" + Ann2.Error + ", tasa de error:" + Ann2.Error * 1.0 /ann2.testsum * 100 + "%"); } / ** * * @param eta tasa de aprendizaje * @param n_iter weight component times * / public ann2 (doble eta, int n_iter) {this.eta = eta; this.n_iter = n_iter; }/*** Ingrese el conjunto de capacitación establecido en la red neuronal artificial* @param ejercicio*/private void entrada (list <sats> ejercicio) {this.exercise = ejercicio; // Guardar el conjunto de entrenamiento Pesos = new Double [ejercicio.get (0) .dimentil + 1]; // Inicializar el vector de peso, su longitud es la dimensión de datos de entrenamiento +1 pesos [0] = W0; = 1; ejercicio.get (j) .type; // y int calculate_result = calculateResult (ejercicio.get (j)); // y 'doble delta0 = eta * (real_result - calculate_result); // calcule el umbral actualizando w0 += delta0; // peso de actualización de actualización [0] = w0; // update w [0] para (int k = 0; k = 0; k = 0; k = 0; k = 0; k = 0; k = 0; k = 0; K = 0; ejercicio.get (j) .getDivision (); // ΔW = η*(y-y ')*x pesos [k +1] += delta; // w = w+ΔW}}}} private int calcululaterSult (datos datos) {doble z = w0 * x0; for (int i = 0; i <data.dimention; i ++) z+= data.vector [i] * pesos [i+1]; //z=w0x0+w1x1+...+wmxm // función de activación if (z> = 0) return 1; else return -1; } private void showweigths () {para (doble w: pesos) system.out.println (w); } private void predicto (datos de datos) {int type = calculateSult (data); if (type == data.gettype ()) {//system.out.println("precaution correcto "); } else {//system.out.println("precaution error "); error ++; } testSum ++; }}Resultados de ejecución:
-0.220000000000000000017-0.44168439828154530.4424444202054685 Se probaron un total de 10,000 datos, con 17 errores, tasa de error: 0.16999999999999999999999999999998% 6
Para obtener más información sobre los algoritmos de Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación de Java DOM", "Resumen de Java Archivo y TIPS de operación de directorio" y "Summary of Java Cache Operation Tips" TIPS ""
Espero que este artículo sea útil para la programación Java de todos.