如何用70行Java代碼實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)算法
創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計,偏關(guān)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:偏關(guān)等地區(qū)。偏關(guān)做網(wǎng)站價格咨詢:028-86922220
import java.util.Random;
public class BpDeep{
public double[][] layer;//神經(jīng)網(wǎng)絡(luò)各層節(jié)點(diǎn)
public double[][] layerErr;//神經(jīng)網(wǎng)絡(luò)各節(jié)點(diǎn)誤差
public double[][][] layer_weight;//各層節(jié)點(diǎn)權(quán)重
public double[][][] layer_weight_delta;//各層節(jié)點(diǎn)權(quán)重動量
public double mobp;//動量系數(shù)
public double rate;//學(xué)習(xí)系數(shù)
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;llayernum.length;l++){
layer[l]=new double[layernum[l]];
layerErr[l]=new double[layernum[l]];
if(l+1layernum.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;jlayernum[l]+1;j++)
for(int i=0;ilayernum[l+1];i++)
layer_weight[l][j][i]=random.nextDouble();//隨機(jī)初始化權(quán)重
}
}
}
//逐層向前計算輸出
public double[] computeOut(double[] in){
for(int l=1;llayer.length;l++){
for(int j=0;jlayer[l].length;j++){
double z=layer_weight[l-1][layer[l-1].length][j];
for(int i=0;ilayer[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));
}
}
return layer[layer.length-1];
}
//逐層反向計算誤差并修改權(quán)重
public void updateWeight(double[] tar){
int l=layer.length-1;
for(int j=0;jlayerErr[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;jlayerErr[l].length;j++){
double z = 0.0;
for(int i=0;ilayerErr[l+1].length;i++){
z=z+l0?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];//隱含層動量調(diào)整
layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隱含層權(quán)重調(diào)整
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];//截距動量調(diào)整
layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距權(quán)重調(diào)整
}
}
layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//記錄誤差
}
}
}
public void train(double[] in, double[] tar){
double[] out = computeOut(in);
updateWeight(tar);
}
}
見附件,一個基本的用java編寫的BP網(wǎng)絡(luò)代碼。
BP(Back Propagation)神經(jīng)網(wǎng)絡(luò)是86年由Rumelhart和McCelland為首的科學(xué)家小組提出,是一種按誤差逆?zhèn)鞑ニ惴ㄓ?xùn)練的多層前饋網(wǎng)絡(luò),是目前應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)模型之一。BP網(wǎng)絡(luò)能學(xué)習(xí)和存貯大量的輸入-輸出模式映射關(guān)系,而無需事前揭示描述這種映射關(guān)系的數(shù)學(xué)方程。它的學(xué)習(xí)規(guī)則是使用最速下降法,通過反向傳播來不斷調(diào)整網(wǎng)絡(luò)的權(quán)值和閾值,使網(wǎng)絡(luò)的誤差平方和最小。BP神經(jīng)網(wǎng)絡(luò)模型拓?fù)浣Y(jié)構(gòu)包括輸入層(input)、隱層(hidden layer)和輸出層(output layer)。
rbf神經(jīng)網(wǎng)絡(luò)有多種學(xué)習(xí)策略,首先選取中心,可以隨機(jī)選,也可采用K均值聚類,然后學(xué)習(xí)權(quán)值,可采用偽逆法(涉及矩陣的奇異值分解),也可以采用最小均方誤差法,或者進(jìn)化算法,上述方法中心是固定的,也可采用梯度下降法同時學(xué)習(xí)中心、寬度、權(quán)值,這個比較復(fù)雜。具體參考《神經(jīng)網(wǎng)絡(luò)原理》。
你用Java寫可以參考Weka,其完全開源,不過我沒有看過源碼,不知其用何種學(xué)習(xí)策略。最近用C++寫了一個簡單的rbf,即固定中心、最小均方誤差法學(xué)習(xí)權(quán)值,但我發(fā)現(xiàn)采用K均值聚類選中心跟隨機(jī)選沒有什么區(qū)別,不知二者有何區(qū)別?自己寫偽逆法對于我來說基本不可能,及其復(fù)雜,我看到過某人寫了個天書般的程序,一個函數(shù)500行。
希望對你有幫助,如果你有新發(fā)現(xiàn),歡迎與我探討,國內(nèi)估計沒多少人真正自己寫過RBF,都用MATLAB代入了事。
您好,這樣:
int add(int a, int b)
{
int s, c;
s = a ^ b;
c = a b;
while (c) {
c = 1;
a = s;
b = c;
s = a ^ b;
c = a b;
}
return s;
}
int main(int argc, char *argv[])
{
unsigned int seed;
int n;
int i;
seed = time(NULL);
srand(seed);
for (i = 0; i 100; i++) {
n = rand();
printf("%11d * 9 = %11d:%11d\n", n, add(n, n 3), n * 9);
}
return 0;
}
網(wǎng)頁標(biāo)題:神經(jīng)網(wǎng)絡(luò)算法java代碼 神經(jīng)網(wǎng)絡(luò)算法csdn
當(dāng)前鏈接:http://muchs.cn/article46/doedpeg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、域名注冊、網(wǎng)站設(shè)計公司、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)