この記事では、Javaの実装に基づいた単純な人工ニューラルネットワークアルゴリズムについて説明します。次のように、参照のために共有してください。
描いたアルゴリズム図を見てみましょう。
2。データカテゴリ
Import Java.util.arrays;パブリッククラスデータ{double [] vector; INT部門; intタイプ; public double [] getVector(){return vector; } public void setVector(double [] vector){this.vector = vector; } public int getDimention(){Return Division; } public void setdimention(int division){this.dimention = division; } public int getType(){return type; } public void setType(intタイプ){this.type = type; } public data(double [] vector、int dimentation、int type){super(); this.vector = vector; this.dentation = dimentation; this.type = type; } public data(){} @override public string toString(){return "data [vector =" + arrays.tostring(vector) + "、dimension =" + dimentation + "、type =" + type + "]"; }}3.単純な人工ニューラルネットワーク
パッケージcn.edu.hbut.chenjie; import java.util.arraylist; import java.util.list; import java.util.random; import org.jfree.chartfactory; import org.jfree.chart.chartframe; Import org.jfree.jfreechart; Import; org.jfree.data.xy.defaultxydataset; Import org.jfree.ui.ureeryutitivities; public class ann2 {private double eta; // Learning Rate private int n_iter; // Weight Vector W []トレーニング時間数プライベートリスト<データ>演習<データ> //トレーニングデータセットプライベートプライベートw0;重み; //重量ベクトル、その長さはトレーニングデータディメンション+1、この場合、データは2次元であるため、長さは3プライベートint testsum = 0; //テストデータの合計プライベートintエラー= 0; / ***同じタイプのデータをチャートに追加* @paramタイプタイプ* @param Aすべてのデータの最初のコンポーネント* @param bすべてのデータの2番目のコンポーネント*/ public void add(string type、double [] a、double [] [] {double [] [] data = new double [2] [a.length]; for(int i = 0; i <a.length; i ++){data [0] [i] = a [i];データ[1] [i] = b [i]; } xydataset.addseries(タイプ、データ); } / *** draw* / public void draw(){jfreechart jfreechart = chartfactory.createscatterplot( "Exercise"、 "x1"、 "x2"、xydataset); ChartFrame Frame = new Chartframe( "Training Data"、jfreechart); frame.pack(); refineryutilities.centerframeonscreen(frame); frame.setVisible(true); } public static void main(string [] args){ann2 ann2 = new ann2(0.001,100); //人工ニューラルネットワークリスト<data>演習= new arraylist <data>(); // 1,000トレーニングデータを作成します。 double x1 = rd.nextdouble(); //ランダム1つのコンポーネント生成ダブルx2 = rd.nextdouble(); //ランダム生成別のコンポーネントダブル[] da = {x1、x2} sum1 = 0; //レコードタイプ1 int sum2 = 0; //録音タイプ1トレーニングレコード番号else if(exercise.get(i).getType()== -1)sum2 ++; } double [] x1 = new double [sum1]; double [] y1 = new double [sum1]; double [] x2 = new double [sum2]; double [] y2 = new double [sum2]; int index1 = 0; int index2 = 0; for(int i = 0; i <exercise.size(); i ++){if(exercise.get(i).getType()== 1){x1 [index1] = exercise.get(i).vector [0]; y1 [index1 ++] = ecester.get(i).vector [1]; } else if(exercise.get(i).getType()== -1){x2 [index2] = ecester.get(i).vector [0]; y2 [index2 ++] = ecester.get(i).vector [1]; }} ann2.add( "1"、x1、y1); ann2.add( "-1"、x2、y2); ann2.draw(); ann2.input(exercise); //人工ニューラルネットワークにセットを入力しますann2.fit(); // train ann2.showweighths(); //重みベクトル// 1000のテストデータを手動で生成します(int i = 0; i <10000; i ++){random rd = new random(); double x1_ = rd.nextdouble(); double x2_ = rd.nextdouble(); double [] da = {x1_、x2_};データテスト=新しいデータ(DA、2、x2_> x1_+0.5?1:-1); ann2.predict(test); // test} system.out.println( "Total test" + ann2.testsum + "ビットデータ、" + ann2.error + "ビットエラー、エラー率:" + ann2.error * 1.0/ann2.testsum * 100 + "%"); } / ** * * @param eta学習率 * @param n_iter重量コンポーネント学習時間 * / public ann2(double eta、int n_iter){this.eta = eta; this.n_iter = n_iter; }/***人工ニューラルネットワークにトレーニングセットを入力します* @param Exercise*/private void input(list <data> exercise){this.exercise = exercise; //トレーニングセットの重量=新しいダブル[エクササイズ(0).demention + 1]; 1; i ++)重量; //残りのコンポーネントは0} for(Int i = 0; i <n_iter; i ++)//重量コンポーネントがn_iter times {for(int j = 0; j <acters); Exercise.get(j).type; // y int calculate_result = calculateresult(exercise.get(j)); // y 'double delta0 = eta *(real_result -calculate_result); // scalculate_result); Exercise.get(j).getDivision(); //ΔW=η*(y-y ')*x weights [k +1] += delta; // w = w+Δw}}}} private int calculateresult(data data){double z = w0 * x0; for(int i = 0; i <data.dimention; i ++)z+= data.vector [i] * weights [i+1]; //z=w0x0+w1x1+...+wmxm //アクティベーション関数(z> = 0)return 1;それ以外の場合は-1; } private void showweigths(){for(double w:weights)system.out.println(w); } private void predict(data data){int type = calculateresult(data); if(type == data.getType()){//system.out.println( "precaution recort"); } else {//system.out.println("precaution error ");エラー++; } testSum ++; }}実行結果:
-0.22000000000000000000017-0.44168439828154530.44244444202054685合計10,000データがテストされ、17エラー、エラー率:0.1699999999999999999999999999999998%
Javaアルゴリズムの詳細については、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの要約」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。