日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

机器学习知识点(九)BP神经网络Java实现

發布時間:2025/4/16 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习知识点(九)BP神经网络Java实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為深入理解機器學習中BP神經網絡算法,從網上找到的Java實現代碼。

1、BP神經網絡結構如下圖所示,最左邊的是輸入層,最右邊的是輸出層,中間是多個隱含層,隱含層和輸出層的每個神經節點,都是由上一層節點乘以其權重累加得到,標上“+1”的圓圈為截距項b(功能神經元結點的閾值),對輸入層外每個節點:Y=w0*x0+w1*x1+…+wn*xn+b,神經網絡相當于一個多層邏輯回歸的結構。


算法計算過程:輸入層開始,從左往右計算,逐層往前直到輸出層產生結果。如果結果值和目標值有差距,再從右往左算,逐層向后計算每個節點的誤差,并且調整每個節點的所有權重,反向到達輸入層后,又重新向前計算,重復迭代以上步驟,直到所有權重參數收斂到一個合理值。由于計算機程序求解方程參數和數學求法不一樣,一般是先隨機選取參數,然后不斷調整參數減少誤差直到逼近正確值,所以大部分的機器學習都是在不斷迭代訓練,下面我們從程序上詳細看看該過程實現就清楚了。

2、參考代碼:

package sk.ml;import java.util.Random; import java.util.Arrays;public class BpDeep {public double[][] layer;//神經網絡各層節點public double[][] layerErr;//神經網絡各節點誤差public double[][][] layer_weight;//各層節點權重public double[][][] layer_weight_delta;//各層節點權重動量public double mobp;//動量系數public double rate;//學習系數public BpDeep(int[] layernum, double rate, double mobp){this.mobp = mobp;this.rate = rate;layer = new double[layernum.length][];layerErr = new double[layernum.length][];layer_weight = new double[layernum.length][][];layer_weight_delta = new double[layernum.length][][];Random random = new Random();for(int l=0;l<layernum.length;l++){layer[l]=new double[layernum[l]];layerErr[l]=new double[layernum[l]];if(l+1<layernum.length){layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];for(int j=0;j<layernum[l]+1;j++)for(int i=0;i<layernum[l+1];i++)layer_weight[l][j][i]=random.nextDouble();//隨機初始化權重} }}//逐層向前計算輸出public double[] computeOut(double[] in){for(int l=1;l<layer.length;l++){for(int j=0;j<layer[l].length;j++){double z=layer_weight[l-1][layer[l-1].length][j];for(int i=0;i<layer[l-1].length;i++){layer[l-1][i]=l==1?in[i]:layer[l-1][i];z+=layer_weight[l-1][i][j]*layer[l-1][i];}layer[l][j]=1/(1+Math.exp(-z));//激活函數sigmoid}}return layer[layer.length-1];}//逐層反向計算誤差并修改權重public void updateWeight(double[] tar){int l=layer.length-1;for(int j=0;j<layerErr[l].length;j++)layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);while(l-->0){for(int j=0;j<layerErr[l].length;j++){double z = 0.0;for(int i=0;i<layerErr[l+1].length;i++){z=z+l>0?layerErr[l+1][i]*layer_weight[l][j][i]:0;layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隱含層動量調整layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隱含層權重調整if(j==layerErr[l].length-1){layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距動量調整layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距權重調整}}layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//記錄誤差}}}public void train(double[] in, double[] tar){double[] out = computeOut(in);updateWeight(tar);}public static void main(String[] args){//初始化神經網絡的基本配置//第一個參數是一個整型數組,表示神經網絡的層數和每層節點數,比如{3,10,10,10,10,2}表示輸入層是3個節點,輸出層是2個節點,中間有4層隱含層,每層10個節點//第二個參數是學習步長,第三個參數是動量系數BpDeep bp = new BpDeep(new int[]{2,10,2}, 0.15, 0.8);//設置樣本數據,對應4個二維坐標數據double[][] data = new double[][]{{1,2},{2,2},{1,1},{2,1}};//設置目標數據,對應4個坐標數據的分類double[][] target = new double[][]{{1,0},{0,1},{0,1},{1,0}};//迭代訓練5000次for(int n=0;n<5000;n++)for(int i=0;i<data.length;i++)bp.train(data[i], target[i]);//根據訓練結果來檢驗樣本數據for(int j=0;j<data.length;j++){double[] result = bp.computeOut(data[j]);System.out.println(Arrays.toString(data[j])+":"+Arrays.toString(result));}//根據訓練結果來預測一條新數據的分類double[] x = new double[]{3,1};double[] result = bp.computeOut(x);System.out.println(Arrays.toString(x)+":"+Arrays.toString(result));} }
執行結果:

[1.0, 2.0]:[0.9778071886179536, 0.022187459499041468] [2.0, 2.0]:[0.023368034603225344, 0.9769182145372335] [1.0, 1.0]:[0.017374300590125305, 0.9821152168609936] [2.0, 1.0]:[0.9784447508283497, 0.02175057450509929] [3.0, 1.0]:[0.9853953389964808, 0.01690955109770975]
參考網址:http://www.tuicool.com/articles/MfYjQfV


《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的机器学习知识点(九)BP神经网络Java实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。