📄 annmod.java
字号:
/**
* <p>神经元网络模型</p>
*
* <p>BP算法</p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
//9-12-12-13-1
//9个输入,1个输出
import java.lang.*;
import java.util.*;
class AnnNode{
double yz;
double[] w;
int wLength;
double outNum =0;
double wuChaNum = 0;
AnnNode(int wNum)
{ wLength = wNum;
w = new double[wNum];
for(int i=0; i<wNum; i++)
w[i] = AnnMod.random();
yz = AnnMod.random();}
AnnNode()
{yz = 0;}
double out(double sample){
outNum = AnnMod.inspirit(sample - yz);
return outNum;}
double out(double[] outPre){
for(int i=0; i<wLength; i++){
outNum = outNum + w[i]*outPre[i];}
outNum = AnnMod.inspirit(outNum - yz);
return outNum;}
boolean setyz(double yzNew){
yz = yzNew;
return true;}
boolean setw(double[] wNew){
w = wNew;
return true;}
double getyz(){
return yz;}
double[] getw(){
return w;}
double wuChaBP(double qw){
wuChaNum = -2*(qw-outNum)*(outNum)*(1-outNum);
return wuChaNum;
}
double wuChaBP(AnnNode[] annLayPre,int j)
{ double ls =0;
for(int i=0; i<annLayPre.length; i++){
ls = ls + annLayPre[i].wuChaNum*annLayPre[i].w[j];}
wuChaNum = outNum*(1-outNum)*ls;
return wuChaNum;}
void changeBP(AnnNode[] annLayAft,double a,double b){
yz = yz + b* wuChaNum;
for(int j=0; j<w.length; j++){
w[j] = w[j] - a*wuChaNum*annLayAft[j].outNum; }}
public void showMyself(){
System.out.print("阈值"+yz+"(");
for(int i=0; i<wLength; i++)
System.out.print(w[i]+",");
System.out.print(")本节点输出"+outNum+"\n");}}
public class AnnMod {
int annLayNum;
int[] annLayNodeNum;
public static double E=2.7182818284590452354;
Vector annLayer;
Vector output;
double[][] sample ={ {0.0103,0.3369,0.5293,15260,6000,0.3932,0.42,0.08,32.15,42.77/1500},
{0.0308,0.4526,0.1519,11500,3000,0.2609,0.36,0.38,21.59,57.35/1500},{0.0306,0.2819,0.2723,17588,5500,0.3127,0.45,0.49,22.26,22.88/1500},{0.0306,0.2819,0.2723,10589,4000,0.3778,0.66,0.53,46.17,63.55/1500},
{0.0379,0.1911,0.3173,11600,3100,0.2672,0.36,0.11,31.06,35.24/1500},{0.0565,0.0617,0.5894,10500,5500,0.5238,0.54,0.02,31.29,40.37/1500},{-0.015,0.0142,0.1935,27000,8000,0.2963,0.57,0.9,33.23,28.45/1500},
{-0.009,-0.0045,0.0892,10000,2500,0.25,0.53,0.13,47.76,92/1500},{-0.009,-0.0045,0.0892,7286,3500,0.4804,0.33,0.14,15.31,35/1500},{0,0,0,0,0,0,0,0,0,0/1500},};
public AnnMod(int[] sjycNodeNum) {
annLayNodeNum = sjycNodeNum; annLayNum = annLayNodeNum.length;
annLayer = new Vector(annLayNum); double[] p = {0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01};
for(int j=0; j<annLayNum; j++)
{AnnNode [] annNodeArr = new AnnNode[annLayNodeNum[j]] ;
for(int i=0; i<annLayNodeNum[j]; i++)
{AnnNode annNode;
if(j == 0) annNode = new AnnNode();
else annNode = new AnnNode(annLayNodeNum[j-1]);
annNodeArr[i] = annNode;}
annLayer.add(j,annNodeArr); rdongI(p);} }
public void rdong1(double[] Maint){
int i,j;
for( j=0; j<9; j++)
for( i=0; i<9; i++)
sample[j][i] = Main.t[i]+ AnnMod.random()/10000000; }
public boolean trainBP()
{ int count = 0;
double a = 0.4, b =0.3;
double totalWuCha=0;
output = new Vector(annLayNum);
for(int i =0; i<annLayNum; i++)
{double[] out = new double[annLayNodeNum[i]]; output.add(i,out);
}
int sampleNum = 0;
while(count<3000){
computeOutput(output,sampleNum);
sampleNum = (sampleNum +1)%9;
for(int i=annLayNum-1; i>0; i--){
AnnNode[] annNodeArray = (AnnNode[])annLayer.elementAt(i);
for(int j=0; j<annNodeArray.length; j++){
count++; System.out.println("训练次数"+count);
if(i==annLayNum-1)annNodeArray[j].wuChaBP(sample[sampleNum][9]);
else annNodeArray[j].wuChaBP( (AnnNode[]) annLayer.elementAt(i+1),j);
annNodeArray[j].changeBP((AnnNode[]) annLayer.elementAt(i-1),a,b);}}
totalWuCha = 0;
for(int t=0; t<9; t++){
double ls = computeOutput(output,t);
totalWuCha = totalWuCha + 0.5*(sample[t][9]-ls) * (sample[t][9]-ls);}
if(totalWuCha < 0.0001) break;}
System.out.println("一共循环次数"+count);
return true;}
void yc(){
System.out.println("训练结束,开始预测");
System.out.println("baidu的股票预测是"+computeOutput(output,0)*1500+"美元");}
double computeOutput(Vector output,int sampleNum){
double[] out;
double outAll = 0;
int j=0;
for(int i=0; i<annLayNum; i++){
out = (double[]) output.elementAt(i);
for( j=0; j<annLayNodeNum[i]; j++){
AnnNode annNode =((AnnNode[]) annLayer.elementAt(i))[j];
if (i==0) out[j] = annNode.out(sample[sampleNum][j]);
else out[j] = annNode.out((double[] )output.elementAt(i-1));}
outAll = out[j-1];
} return outAll;}
public void rdongI(double[] Maint){
int i,j;
for( j=0; j<9; j++)
for( i=0; i<10; i++)
sample[j][i] = Main.t[i]+ AnnMod.random()/10000000;}
public static double inspirit(double x)
{return 1/(1+Math.pow(E,-x));}
public static double random()
{Random random = new Random();
double ran = random.nextDouble();
ran = (int)(ran * 1000);
ran = ran/1000.0;
if(random.nextDouble()<0.5)ran = ran * -1;
return ran;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -