Cet article décrit un algorithme de réseau neuronal artificiel simple basé sur la mise en œuvre de Java. Partagez-le pour votre référence, comme suit:
Jetons un coup d'œil au diagramme de l'algorithme que j'ai dessiné:
2. Catégorie de données
Importer java.util.arrays; public class data {double [] vector; Division int; int type; public double [] getvector () {return vector; } public void setvector (double [] vector) {this.vector = vector; } public int getDimenger () {division de retour; } public void setDimenger (int division) {this.dimentention = division; } public int getType () {return type; } public void setType (int type) {this.type = type; } Données publiques (Vector Double [], int Dimation, 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. Réseau de neurones artificiels simple
Package cn.edu.hbut.chenjie; import java.util.arraylist; import java.util.list; import java.util.random; import org.jfree.chart.chartfactory; import org.jfree.chart.chartframe; import org.jfree.chart.jfreechart; import; org.jfree.data.xy.defaultxydataset; import org.jfree.ui.refineryutilities; classe publique Ann2 {Double privé eta; // Taux d'apprentissage privé int n_iter; poids; // vecteur de poids, dont la longueur est la dimension de données de formation +1, dans ce cas, les données sont de 2 dimensions, donc la longueur est 3 private int testsum = 0; // Nombre total de données de test private intror = 0; // nombre d'erreur defauftxyDataset xydataset = new defAftfaulxyDataset (); / ** * Ajouter des données du même type au graphique * @param type type * @param a le premier composant de toutes les données * @param b le deuxième composant de toutes les données * / public void add (type de chaîne, double [] a, double [] b) {double [] [] data = new double [2] [a.length]; for (int i = 0; i <a.length; i ++) {data [0] [i] = a [i]; data [1] [i] = b [i]; } xydataset.addseries (type, données); } / ** * Draw * / public void Draw () {jfreechart jfreechart = chartfactory.createSterplot ("exercice", "x1", "x2", xydataset); Chartframe frame = new ChartFrame ("Données de formation", jfreechart); frame.pack (); Raffineryutiability.CenterFrameOnScreen (cadre); frame.setVisible (true); } public static void main (String [] args) {ann2 ann2 = new Ann2 (0,001,100); // construire une liste de réseaux de neurones artificiels <sata> exercice = new ArrayList <NATA> (); // Construire un ensemble de formation // simule manuellement 1000 données de formation, la ligne de division est x2 = x1 + 0,5 pour (int i = 0; i <1000000; i ++) {aléatoire pour (int i = 0; i <1000000; i ++) {aléatoire pour (int i = 0; i <1000000; i ++) {Random = Random ();); double x1 = rd.nextDouble (); // Random Générez un composant double x2 = rd.nextDouble (); // générer un autre composant double [] da = {x1, x2}; // générer des données de vecteur d = nouvelles données (da, 2, x2> x1 + 0,5? 1: -1); // Construire des données d'exercice.addd (d); SUM1 = 0; // Record Type 1 int sum2 = 0; // Record Type-1 Numéro d'enregistrement de formation pour (int i = 0; i <exercice.size (); i ++) {if (exercice.get (i) .getType () == 1) sum1 ++; else if (exercice.get (i) .getType () == - 1) sum2 ++; } double [] x1 = nouveau double [sum1]; double [] y1 = nouveau double [sum1]; double [] x2 = nouveau double [sum2]; double [] y2 = nouveau double [sum2]; int index1 = 0; int index2 = 0; pour (int i = 0; i <exercice.size (); i ++) {if (exercice.get (i) .getType () == 1) {x1 [index1] = exercice.get (i) .vector [0]; y1 [index1 ++] = exercice.get (i) .vector [1]; } else if (exercice.get (i) .getType () == - 1) {x2 [index2] = exercice.get (i) .vector [0]; y2 [index2 ++] = exercice.get (i) .vector [1]; }} ann2.add ("1", x1, y1); ann2.add ("- 1", x2, y2); Ann2.Draw (); ann2.input (exercice); // entre dans l'ensemble de formation dans le réseau neuronal artificiel Ann2.fit (); // Train Ann2.showweigths (); // montre le vecteur de poids // générer manuellement mille données de test pour (int i = 0; i <10000; i ++) {Random rd = new random (); double x1_ = rd.nextDouble (); double x2_ = rd.nextDouble (); double [] da = {x1_, x2_}; Test de données = nouvelles données (da, 2, x2_> x1_ + 0,5? 1: -1); ann2.predict (test); // test} system.out.println ("Total test" + ann2.testSum + "Bit Data, avec" + Ann2.Error + "Bit Erreur, taux d'erreur:" + Ann2.Error * 1.0 /ann2.tssum * 100 + "%"); } / ** * * @param eta Taux d'apprentissage * @param n_iter Poids Composant Times d'apprentissage * / public Ann2 (Double Eta, int n_iter) {this.eta = eta; this.n_iter = n_iter; } / ** * Entrez l'ensemble de formation sur le réseau de neurones artificiels * @param exercice * / Private Void Intarning (list <sat> exercice) {this.exercise = exercice; // Save the Training Set Weights = New Double [exercice.get (0) .dimentewing. = 1; i <weats.length; i ++) pondérations [i] = 0; // exercice.get (j) .type; // y int calcul_result = calculateResult (exercice.get (j)); // y 'double delta0 = eta * (real_result - calcul_result); // Calculer la mise à jour de threshol exercice.get (j) .getdivision (); k ++) // Mettez à jour les autres composants du vecteur de poids {double delta = eta * (real_result - calcul_result) * exercice.get (j) .vector [k]; // Δw = η * (y-y ') * x poids [k + 1] + = delta; // w = w + Δw}}}} private int calculateResult (données de données) {double z = w0 * x0; pour (int i = 0; i <data.dimension; i ++) z + = data.vector [i] * poids [i + 1]; //z=w0x0+w1x1+...+wmxm // fonction d'activation if (z> = 0) return 1; else return -1; } private void showweigths () {for (double w: poids) System.out.println (w); } private void prédite (données de données) {int type = calculateResult (data); if (type == data.getType ()) {//system.out.println("precaution correct "); } else {//system.out.println("precaution error "); error ++; } testsum ++; }}Résultats en cours:
-0.2200000000000000017-0.44168439828154530.4424442054685 Un total de 10 000 données ont été testées, avec 17 erreurs, taux d'erreur: 0,169999999999999999999999999999998%%
Pour plus d'informations sur les algorithmes Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Structure de données Java et tutoriel d'algorithme", "Résumé des conseils de nœud de Dom Operation Java", "Résumé du fichier Java et des conseils d'opération de répertoire" et "Résumé des conseils d'opération Java Cache"
J'espère que cet article sera utile à la programmation Java de tous.