1BP神经网络实现(JAVA代码)
bp神经网络

bp神经网络BP神经网络(Backpropagation Network)是一种被广泛应用于分类、预测和优化问题中的人工神经网络模型。
BP神经网络具有简单易懂、易于理解和易于实现的特点,因此在工程实践中被广泛应用。
BP神经网络的基本思想是将信息通过一层层的神经元传递,然后反向调节神经元的权重和偏置,从而实现对模型参数的优化。
BP神经网络通常包含输入层、隐层和输出层三个层次。
其中输入层用于接收输入数据,隐层用于处理输入数据,输出层用于给出模型的预测结果。
BP神经网络通过不断反向传播误差信号来调整各层神经元之间的连接权重,从而实现对模型参数的逐步优化。
BP神经网络的训练过程通常分为前向传播和反向传播两个阶段。
在前向传播阶段,输入数据被输入到神经网络中,经过一系列计算后得到输出结果。
在反向传播阶段,将输出结果与真实值进行比较,计算误差信号,并通过反向传播算法将误差信号逐层传递回到输入层,从而实现对神经网络参数(权重和偏置)的不断调整。
通过多次迭代,直到神经网络的输出结果与真实值的误差达到一定的精度要求为止。
BP神经网络的优点在于可以处理非线性问题,并且可以自适应地调整模型参数。
然而,BP神经网络也存在一些缺点,例如容易陷入局部极小值,训练速度较慢,需要大量的训练数据等等。
在实际应用中,BP神经网络已经被广泛应用于分类、预测和优化等方面。
例如,BP神经网络可以用于识别手写数字、预测股票市场走势、自动驾驶和机器人控制等方面。
另外,BP 神经网络还可以与其他机器学习算法相结合,共同解决各种复杂问题。
总之,BP神经网络是一种简单实用的人工神经网络模型,具有广泛的应用前景。
在实际应用中,需要根据具体问题对模型进行适当的改进和优化,以提高其预测精度和鲁棒性。
BP神经网络-本科生毕业设计论文-小论文

基于智能计算的水质预测预警系统的设计与实现温子铭1,刘双印1(1.广东海洋大学信息学院,广东湛江524088)摘要:及时准确地掌握水质变化趋势是确保水产品健康养殖的关键,为此,本设计采用智能计算与现代Web开发技术有机结合,以软件工程为指导,按照面向对象程序设计的方法,构建5种基于智能计算的水质预测预警模型;采用J2EE为开发工具设计实现了B/S架构的水质预测预警系统。
该系统主要有水质数据管理、水质数据趋势展示、水质指标溶解氧浓度预测、水质预警管理等功能模块组成,用户界面友好,水质预测精度较高,能够满足水产养殖水质管理的需要。
该系统的研制为提前掌握水质未来发展趋势、水污染预警提供基础数据和手段,为应对突发水质事件、水质调节、水产养殖生产管理与规划提供科学的决策依据,有一定的实用价值。
关键词:水产养殖;水质趋势;J2EE;水质预测预警系统;智能计算;Design and Implementation of Water Quality Predicting and Early Warning SystemBase on Smart ComputingWen Ziming, Liu Shuangyin(1. Information Institute of Guangdong Ocean University, Zhanjiang,GuangDong 524088) Abstract:Have a good command of water quality trends in time and accurately is the key to assure health growth of the aquatic products. Therefore, this design is combined with intelligent computing and modern web development technology, on the guidance of software engineer, and also established five kinds of water quality predicting and early warning models based on intelligent technology according to the measure of Object-Oriented Programming; We adopted J2EE as development tool to achieve the water quality predicting and early warning system based on B/S framework. This system mainly included water quality data management module, water quality data trend module, dissolved oxygen prediction module and water quality early warning module. It’s useful for users and can meet the needs of aquatic water quality management. The establishment of this system provide the basic data and methods to handling the future water quality trend and water pollution early warning. And also provide the scientific decision for dealing with the water pollution events, water quality adjustment, aquaculture management and plans. It has practical value.Key words: Aquaculture, water quality trend, J2EE, water quality predicting and early warning system, intelligent computing.1引言我国是水产养殖大国,也是世界上唯一一个养殖产量超过捕捞产量的国家, 水产养殖为解决食品供给、粮食安全、改善民生,增加农民收入等方面发挥了重要作用。
bp神经网络代码

bp神经网络代码
BP神经网络代码,是一种用于训练深度学习模型的反向传播算法。
它使用一系列的步骤,以每次迭代的方式来调整神经网络中权重的大小,从而使得它能够更准确地识别数据集中的特征。
BP神经网络代码的基本步骤如下:
1. 初始化权重:首先,选择一组随机初始权重参数。
2. 输入数据:然后,将数据输入神经网络,并将输入与权重相乘以计算输出。
3. 计算错误:接下来,通过比较预期输出和实际输出,计算网络的误差。
4. 反向传播:使用反向传播算法,根据误差调整权重参数,以减少误差。
5. 重复步骤2-4:重复步骤2-4,直到误差低到满足要求为止。
BP神经网络算法程序

BP神经网络算法程序一、BP神经网络算法原理BP神经网络算法包括输入层、隐藏层和输出层三个层次。
每个层次的神经元节点与下一层次的神经元节点之间存在权重系数。
神经元节点通过输入信号经过激活函数的处理得到输出信号,并将输出信号传递给下一层次的神经元节点。
反向传播过程中,首先根据误差评估结果计算输出层的误差信号,再根据该误差信号分别计算隐藏层和输入层的误差信号。
然后根据误差信号的计算结果,逐层更新网络的权重系数。
二、BP神经网络算法步骤1.初始化网络权重:随机初始化网络各层次之间的权重系数。
2.设置学习率和最大迭代次数。
3.迭代训练网络:重复以下步骤直到满足停止条件为止。
a)根据当前样本的输入信号,通过前向传播算法计算输出结果。
c)根据误差信号,通过反向传播算法更新网络的权重系数。
4.测试网络:使用独立的测试数据集,通过前向传播算法计算网络的输出结果,评估网络的泛化能力。
三、BP神经网络算法示例程序下面给出一个简单的使用Python编写的BP神经网络算法示例程序。
```pythonimport numpy as npclass BPNeuralNetwork:def __init__(self, input_dim, hidden_dim, output_dim): self.input_dim = input_dimself.hidden_dim = hidden_dimself.output_dim = output_dimself.W1 = np.random.randn(input_dim, hidden_dim)self.W2 = np.random.randn(hidden_dim, output_dim)def sigmoid(self, x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(self, x):return x * (1 - x)def forward_propagation(self, X):self.z2 = np.dot(X, self.W1)self.a2 = self.sigmoid(self.z2)self.z3 = np.dot(self.a2, self.W2)self.y_hat = self.sigmoid(self.z3)return self.y_hatdef backward_propagation(self, X, y, lr):self.loss = y - self.y_hatdelta3 = self.loss * self.sigmoid_derivative(self.y_hat) dW2 = np.dot(self.a2.T, delta3)delta2 = np.dot(delta3, self.W2.T) *self.sigmoid_derivative(self.a2)dW1 = np.dot(X.T, delta2)self.W2 += lr * dW2self.W1 += lr * dW1def train(self, X, y, lr=0.1, epochs=1000):for i in range(epochs):y_hat = self.forward_propagation(X)self.backward_propagation(X, y, lr)def predict(self, X):return np.round(self.forward_propagation(X))#示例用法X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])y = np.array([[0], [1], [1], [0]])nn = BPNeuralNetwork(2, 2, 1)print("预测结果:")print(nn.predict(X))```以上是一个简单的BP神经网络算法示例程序,用于训练一个XOR逻辑门的分类模型。
bp神经网络算法步骤结合实例

bp神经网络算法步骤结合实例
BP神经网络算法步骤包括以下几个步骤:
1.输入层:将输入数据输入到神经网络中。
2.隐层:在输入层和输出层之间,通过一系列权值和偏置将输入数据进行处理,得到输出
数据。
3.输出层:将隐层的输出数据输出到输出层。
4.反向传播:通过反向传播算法来计算误差,并使用梯度下降法对权值和偏置进行调整,
以最小化误差。
5.训练:通过不断地进行输入、隐层处理、输出和反向传播的过程,来训练神经网络,使
其达到最优状态。
实例:
假设我们有一个BP神经网络,它的输入层有两个输入节点,隐层有三个节点,输出层有一个节点。
经过训练,我们得到了权值矩阵和偏置向量。
当我们给它输入一组数据时,它的工作流程如下:
1.输入层:将输入数据输入到神经网络中。
2.隐层:将输入数据与权值矩阵相乘,再加上偏置向量,得到输出数据。
3.输出层:将隐层的输出数据输出到输出层。
4.反向传播:使用反向传播算法计算误差,并使用梯度下降法调整权值和偏置向量,以最
小化误差。
5.训练:通过不断地输入、处理、输出和反向传播的过程,来训练神经网络,使其达到最
优状态。
这就是BP神经网络算法的基本流程。
在实际应用中,还需要考虑许多细节问题,如权值和偏置的初始值、学习率、激活函数等。
但是,上述流程是BP神经网络算法的基本框架。
bp神经网络算法原理

bp神经网络算法原理BP神经网络算法(Backpropagation algorithm)是一种监督学习的神经网络算法,其目的是通过调整神经网络的权重和偏置来实现误差的最小化。
BP神经网络算法基于梯度下降和链式法则,在网络的前向传播和反向传播过程中进行参数的更新。
在前向传播过程中,输入样本通过网络的各个神经元计算,直到达到输出层。
每个神经元都会对上一层的输入进行加权求和,并经过一个非线性激活函数得到输出。
前向传播的结果即为网络的输出。
在反向传播过程中,首先需要计算网络的输出误差。
误差是实际输出与期望输出的差异。
然后,从输出层开始,沿着网络的反方向,通过链式法则计算每个神经元的误差贡献,并将误差从输出层反向传播到输入层。
每个神经元根据自身的误差贡献,对权重和偏置进行调整。
这一过程可以看作是通过梯度下降来调整网络参数,以最小化误差。
具体而言,对于每个样本,BP神经网络算法通过以下步骤来更新网络的参数:1. 前向传播:将输入样本通过网络,计算得到网络的输出。
2. 计算误差:将网络的输出与期望输出进行比较,计算得到输出误差。
3. 反向传播:从输出层开始,根据链式法则计算每个神经元的误差贡献,并将误差沿着网络反向传播到输入层。
4. 参数更新:根据每个神经元的误差贡献,使用梯度下降方法更新神经元的权重和偏置。
5. 重复以上步骤,直到达到预设的训练停止条件,例如达到最大迭代次数或误差小于某个阈值。
总的来说,BP神经网络算法通过计算输出误差和通过反向传播调整网络参数的方式,实现对神经网络的训练。
通过不断迭代优化网络的权重和偏置,使得网络能够更准确地进行分类、回归等任务。
用Python实现BP神经网络(附代码)
⽤Python实现BP神经⽹络(附代码)⽤Python实现出来的机器学习算法都是什么样⼦呢?前两期线性回归及逻辑回归项⽬已发布(见⽂末链接),今天来讲讲BP神经⽹络。
BP神经⽹络全部代码https:///lawlite19/MachineLearning_Python/blob/master/NeuralNetwok/NeuralNetwork.py神经⽹络model先介绍个三层的神经⽹络,如下图所⽰输⼊层(input layer)有三个units(为补上的bias,通常设为1)表⽰第j层的第i个激励,也称为为单元unit为第j层到第j+1层映射的权重矩阵,就是每条边的权重所以可以得到:隐含层:输出层,其中,S型函数,也成为激励函数可以看出为3x4的矩阵,为1x4的矩阵==》j+1的单元数x(j层的单元数+1)代价函数假设最后输出的,即代表输出层有K个单元,其中,代表第i个单元输出与逻辑回归的代价函数差不多,就是累加上每个输出(共有K个输出)正则化L-->所有层的个数-->第l层unit的个数正则化后的代价函数为共有L-1层,然后是累加对应每⼀层的theta矩阵,注意不包含加上偏置项对应的theta(0)正则化后的代价函数实现代码:# 代价函数def nnCostFunction(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambda):length = nn_params.shape[0] # theta的中长度# 还原theta1和theta2Theta1 = nn_params[0:hidden_layer_size*(input_layer_size+1)].reshape(hidden_layer_size,input_layer_size+1)Theta2 = nn_params[hidden_layer_size*(input_layer_size+1):length].reshape(num_labels,hidden_layer_size+1)# np.savetxt("Theta1.csv",Theta1,delimiter=',')m = X.shape[0]class_y = np.zeros((m,num_labels)) # 数据的y对应0-9,需要映射为0/1的关系# 映射yfor i in range(num_labels):class_y[:,i] = np.int32(y==i).reshape(1,-1) # 注意reshape(1,-1)才可以赋值'''去掉theta1和theta2的第⼀列,因为正则化时从1开始'''Theta1_colCount = Theta1.shape[1]Theta1_x = Theta1[:,1:Theta1_colCount]Theta2_colCount = Theta2.shape[1]Theta2_x = Theta2[:,1:Theta2_colCount]# 正则化向theta^2term = np.dot(np.transpose(np.vstack((Theta1_x.reshape(-1,1),Theta2_x.reshape(-1,1)))),np.vstack((Theta1_x.reshape(-1,1),Theta2_x.reshape(-1,1))))'''正向传播,每次需要补上⼀列1的偏置bias'''a1 = np.hstack((np.ones((m,1)),X))z2 = np.dot(a1,np.transpose(Theta1))a2 = sigmoid(z2)a2 = np.hstack((np.ones((m,1)),a2))z3 = np.dot(a2,np.transpose(Theta2))h = sigmoid(z3)'''代价'''J = -(np.dot(np.transpose(class_y.reshape(-1,1)),np.log(h.reshape(-1,1)))+np.dot(np.transpose(1-class_y.reshape(-1,1)),np.log(1-h.reshape(-1,1)))-Lambda*term/2)/mreturn np.ravel(J)反向传播BP上⾯正向传播可以计算得到J(θ),使⽤梯度下降法还需要求它的梯度BP反向传播的⽬的就是求代价函数的梯度假设4层的神经⽹络,记为-->l层第j个单元的误差《===》(向量化)没有,因为对于输⼊没有误差因为S型函数的倒数为:,所以上⾯的和可以在前向传播中计算出来反向传播计算梯度的过程为:(是⼤写的)for i=1-m:--正向传播计算(l=2,3,4...L)-反向计算、...;--最后,即得到代价函数的梯度实现代码:# 梯度def nnGradient(nn_params,input_layer_size,hidden_layer_size,num_labels,X,y,Lambda):length = nn_params.shape[0]Theta1 = nn_params[0:hidden_layer_size*(input_layer_size+1)].reshape(hidden_layer_size,input_layer_size+1) Theta2 = nn_params[hidden_layer_size*(input_layer_size+1):length].reshape(num_labels,hidden_layer_size+1) m = X.shape[0]class_y = np.zeros((m,num_labels)) # 数据的y对应0-9,需要映射为0/1的关系# 映射yfor i in range(num_labels):class_y[:,i] = np.int32(y==i).reshape(1,-1) # 注意reshape(1,-1)才可以赋值'''去掉theta1和theta2的第⼀列,因为正则化时从1开始'''Theta1_colCount = Theta1.shape[1]Theta1_x = Theta1[:,1:Theta1_colCount]Theta2_colCount = Theta2.shape[1]Theta2_x = Theta2[:,1:Theta2_colCount]Theta1_grad = np.zeros((Theta1.shape)) #第⼀层到第⼆层的权重Theta2_grad = np.zeros((Theta2.shape)) #第⼆层到第三层的权重Theta1[:,0] = 0;Theta2[:,0] = 0;'''正向传播,每次需要补上⼀列1的偏置bias'''a1 = np.hstack((np.ones((m,1)),X))z2 = np.dot(a1,np.transpose(Theta1))a2 = sigmoid(z2)a2 = np.hstack((np.ones((m,1)),a2))z3 = np.dot(a2,np.transpose(Theta2))h = sigmoid(z3)'''反向传播,delta为误差,'''delta3 = np.zeros((m,num_labels))delta2 = np.zeros((m,hidden_layer_size))for i in range(m):delta3[i,:] = h[i,:]-class_y[i,:]Theta2_grad = Theta2_grad+np.dot(np.transpose(delta3[i,:].reshape(1,-1)),a2[i,:].reshape(1,-1))delta2[i,:] = np.dot(delta3[i,:].reshape(1,-1),Theta2_x)*sigmoidGradient(z2[i,:])Theta1_grad = Theta1_grad+np.dot(np.transpose(delta2[i,:].reshape(1,-1)),a1[i,:].reshape(1,-1))'''梯度'''grad = (np.vstack((Theta1_grad.reshape(-1,1),Theta2_grad.reshape(-1,1)))+Lambda*np.vstack((Theta1.reshape(-1,1),Theta2.reshape(-1,1))))/mreturn np.ravel(grad)BP可以求梯度的原因实际是利⽤了链式求导法则因为下⼀层的单元利⽤上⼀层的单元作为输⼊进⾏计算⼤体的推导过程如下,最终我们是想预测函数与已知的y⾮常接近,求均⽅差的梯度沿着此梯度⽅向可使代价函数最⼩化。
BP神经网络详细代码
运用BP神经网络进行预测代码如下:clcclear allclose all%bp神经网络预测%输入输出赋值p=[493 372 445;372 445 176;445 176 235;176 235 378;235 378 429;378 429 561;429 561 651;561 651 467;651 467 527;467 527 668;527 668 841; 668 841 526;841 526 480;526 480 567;480 567 685]';t=[176 235 378 429 561 651 467 527 668 841 526 480 567 685 507];%数据归一化[p1ps]=mapminmax(p);[t1ts]=mapminmax(t);%数据集分配[trainsample.pvalsample.ptestsample.p] =dividerand(p0.70.150.15);[alsample.ttestsample.t] =dividerand(t0.70.150.15);%建立BP神经网络TF1='tansig';TF2='purelin';net=newff(minmax(p)[101]{TF1 TF2}'traingdm');%网络参数的设置net.trainParam.epochs=10000;%训练次数设置net.trainParam.goal=1e-7;%训练目标设置net.trainParam.lr=0.01;%学习率设置net.trainParam.mc=0.9;%动量因子的设置net.trainParam.show=25;%显示的间隔次数% 指定训练参数net.trainFcn='trainlm';[nettr]=train(nettrainsample.ptrainsample.t);%计算仿真[normtrainoutputtrainPerf]=sim(nettrainsample.p[][]trainsample.t);%训练数据,经BP得到的结果[normvalidateoutputvalidatePerf]=sim(netvalsample.p[][]valsample.t);%验证数据,经BP得到的结果[normtestoutputtestPerf]=sim(nettestsample.p[][]testsample.t);%测试数据,经BP得到的结果%计算结果反归一化,得到拟合数据trainoutput=mapminmax('reverse'normtrainoutputts);validateoutput=mapminmax('reverse'normvalidateoutputts);testoutput=mapminmax('reverse'normtestoutputts);%输入数据反归一化,得到正式值trainvalue=mapminmax('reverse'trainsample.tts);%正式的训练数据validatevalue=mapminmax('reverse'valsample.tts);%正式的验证数据testvalue=mapminmax('reverse'testsample.tts);%正式的测试数据%输入要预测的数据pnewpnew=[313256239]';pnewn=mapminmax(pnew);anewn=sim(netpnewn);anew=mapminmax('reverse'anewnts);%绝对误差的计算errors=trainvalue-trainoutput;%plotregression拟合图figureplotregression(trainvaluetrainoutput)%误差变化图figureplot(1:length(errors)errors'-b')title('误差变化图')%误差值的正态性的检验figurehist(errors);%频数直方图figurenormplot(errors);%Q-Q图[muhatsigmahatmucisigmaci]=normfit(errors);%参数估计均值方差均值的0.95置信区间方差的0.95置信区间[h1sigci]= ttest(errorsmuhat);%假设检验figure ploterrcorr(errors);%绘制误差的自相关图figure parcorr(errors);%绘制偏相关图。
BP神经网络算法原理
BP神经网络算法原理BP神经网络(Back-Propagation Neural Network)是一种常见的人工神经网络,被广泛应用于模式识别、数据处理、逼近函数、分类问题等许多领域。
BP神经网络通过学习和调整神经元的连接权重,实现从输入到输出的映射。
BP神经网络由输入层、隐藏层和输出层组成,输入层接收外部输入样本的信号,并将其传递给隐藏层。
隐藏层通过对输入的处理对不同属性进行特征提取,得到一组新的特征。
最后,输出层将经过隐藏层处理的特征映射到输出值,完成预测或分类任务。
BP神经网络的学习过程可以分为两个阶段:前向传播和反向传播。
在前向传播过程中,输入样本在网络中的输入层经过各个层的处理,最终得到输出层的结果。
在反向传播过程中,通过计算输出层的误差来调整每个神经元的连接权重,从而降低误差。
具体而言,BP神经网络的学习过程如下:1.权重初始化:初始化输入层与隐藏层之间、隐藏层与输出层之间的连接权重。
通常采用小的随机数进行初始化。
2.前向传播:将输入样本从输入层传递到输出层,计算每个神经元的输出值。
3.误差计算:计算输出层的误差,通常使用均方误差作为误差函数。
4.反向传播:将误差从输出层传递到输入层,根据输出层的误差调整每个神经元的连接权重。
这一步是BP算法的核心,通过梯度下降法不断更新权重,使得网络的输出与样本的实际输出更加接近。
5.权重更新:根据反向传播得到的调整量,更新每个连接权重。
6.重复上述步骤:不断重复前向传播和反向传播过程,直到达到预设的停止条件,比如误差小于一些阈值或达到预设的最大迭代次数。
通过多次迭代学习样本集,BP神经网络能够逐渐优化权重,提高模型的拟合能力和泛化能力。
在实际应用中,为了克服过拟合问题,可以采用正则化和交叉验证等方法进行改进。
总结来说,BP神经网络是一种通过反向传播算法来学习和调整神经元之间连接权重的人工神经网络。
它通过多次迭代优化权重,从而实现从输入到输出的映射,广泛应用于模式识别、数据处理和分类问题等领域。
神经网络编程实战:Java语言实现(原书第2版)
2 神经网 络学习
2.4 学习算法示例
2.4.1 δ规则
2.4.6 学 习机
01 06
05
2.4.5 另一种学习算 法——Hebbian学习
2.4.2 学习率
02
03
2.4.3 实 现δ规则
04
2.4.4 δ规则学习的核 心——train和
calcNewWeight方法
2 神经网络学习
2.2.1 监督 学习
1
2.2.2 无监 督学习
2
2.2 学习模式
2.3.1 寻找损失函 数最优下降方向
2.3.3 计算损失函 数
01
03
02
04
2.3.2 在学习过程 中更新权重
2.3.4 一般误差和 总体误差
2.3.5 神经网络的 迭代学习什么时候
停止比较好
05
2 神经网络学习
07
Part One
6 疾病分类识别
6 疾病分类识别
6.1 分类问题的 基础
6.2 逻辑回归
6.3 分类神经网 络
6.4 用神经网络 进行疾病识别
6.5 本章小结
6 疾病分类识别
01
6.1.1 分 类数据
02
6.1.2 处 理分类
数据
6.1 分类问题的基础
6 疾病分类识别
6.2.1 多分类 与二分类
1.2.5 额外参数——偏置
1 神经网络入门
1.2 人工神经网络
1.2.2 基本元素——人工神 经元
1.2.4 可变参数——权重
1.2.6 由部分到整体——层
1 神经网络入门
0
0
1
2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BP神经网络实现(Java代码)神经网络的原理虽然理解起来不难,但是要是想实现它,还是需要做一些工作的,并且有很多细节性的东西需要注意。
通过参阅各种相关资料,以及参考网络上已有的资源,自己写了一个含有一个隐含层,且只能有一个输出单元的简单的BP网络,经过测试,达到了预期的效果。
需要说明的是,神经网络的每个输入都在[0,1]中,输出也在[0,1]中,在使用神经网络解决实际问题的时候,还需要对实际问题的输入输出进行归一化处理。
另外,尽量不要使得神经网络的输入或输出接近于0或1,这样会影响拟合效果。
我用正弦函数进行了一次测试,效果如图所示:以下是相关的代码:1.神经网络代码[java]view plaincopy1.package pkg1;2.3.import java.util.Scanner;4.5./*6.*7.*/8.public class TestNeuro{9.10.private int INPUT_DIM=1;11.private int HIDDEN_DIM=20;12.private double LEARNING_RATE=0.05;13.double[][]input_hidden_weights=new double[INPUT_DIM][HIDDEN_DIM];14.double[]hidden_output_weights=new double[HIDDEN_DIM];15.double[]hidden_thresholds=new double[HIDDEN_DIM];16.double output_threshold;17.18.public static void main(String[]args){19.Scanner in=new Scanner(System.in);20.TestNeuro neuro=new TestNeuro(1,5);21.neuro.initialize();22.for(int i=0;i<10000;i++){23.double[]input=new double[1];24.input[0]=Math.random();25.double expectedOutput=input[0]*input[0];26.//System.out.println("input:"+input[0]+"\t\texpectedOutput:"+expectedOutput);27.//System.out.println("predict before training:"+neuro.predict(input));28.neuro.trainOnce(input,expectedOutput);29.//System.out.println("predict after training:"+neuro.predict(input));30.//in.next();31.}32.while(true){33.//neuro.printLinks();34.double[]input=new double[1];35.input[0]=in.nextDouble();36.double expectedOutput=in.nextDouble();37.System.out.println("predict before training:"+neuro.predict(input));38.neuro.trainOnce(input,expectedOutput);39.System.out.println("predict after training:"+neuro.predict(input));40.41.}42.}43.44.public TestNeuro(int input_dimension,int hidden_dimension){45.this.INPUT_DIM=input_dimension;46.this.HIDDEN_DIM=hidden_dimension;47.this.initialize();48.}49.50.51./**52.*打印出本神经元网络各层之间的连接权重,以及各个神经元上的阈值的信息。
53.*/54.void print(){55.System.out.println("隐含层阈值:");56.for(int i=0;i<HIDDEN_DIM;i++){57.System.out.print(hidden_thresholds[i]+"");58.}System.out.println();59.System.out.println("输出层阈值:");60.System.out.println(output_threshold);61.62.System.out.println("连接权重:*********************");63.System.out.println("输入层与隐含层的连接");64.for(int i=0;i<INPUT_DIM;i++){65.for(int j=0;j<HIDDEN_DIM;j++){66.System.out.print(input_hidden_weights[i][j]+"");67.}System.out.println();68.}69.System.out.println("隐含层到输出层的连接");70.for(int i=0;i<HIDDEN_DIM;i++){71.System.out.print(hidden_output_weights[i]+"");72.}System.out.println();73.System.out.println("*********************************");74.}75.76./**77.*初始化,对所有的权值产生一个(0,1)之间的随机double型值78.*/79.void initialize(){80.81.//输入层到隐含层的连接权重82.for(int i=0;i<INPUT_DIM;i++){83.for(int j=0;j<HIDDEN_DIM;j++){84.input_hidden_weights[i][j]=Math.random();85.}86.}87.//隐含层到输出层的连接权重88.for(int i=0;i<HIDDEN_DIM;i++){89.hidden_output_weights[i]=Math.random();90.}91.//隐含层的阈值92.for(int i=0;i<HIDDEN_DIM;i++){93.hidden_thresholds[i]=Math.random();94.}95.//输出层的阈值96.output_threshold=Math.random();97.}98.99./**100.*激励函数101.*@param x102.*@return103.*/104.double function(double x){105.return1/(1+Math.pow(Math.E,-x));106.}107.108./**109.*给定一个输入,进行预测110.*@param input111.*@return112.*/113.double predict(double[]input){114.double[]hiddenValues=new double[HIDDEN_DIM]; 115.for(int i=0;i<hiddenValues.length;i++){116.double sum=0;117.for(int j=0;j<input.length;j++){118.sum+=input[j]*input_hidden_weights[j][i]; 119.}120.sum+=hidden_thresholds[i];//再加上本神经元的阈值121.hiddenValues[i]=function(sum);122.}123.124.125.double sum=0;126.for(int i=0;i<HIDDEN_DIM;i++){127.sum+=hiddenValues[i]*hidden_output_weights[i]; 128.}129.sum+=output_threshold;//输出层神经元的阈值130.return function(sum);131.}132.133./**134.*进行一次训练135.*@param input136.*@param expectedOutput137.*/138.void trainOnce(double[]input,double expectedOutput){139.double[]hiddenValues=new double[HIDDEN_DIM];140.double[]hiddenParams=new double[HIDDEN_DIM];141.142.for(int i=0;i<hiddenValues.length;i++){143.double sum=0;144.for(int j=0;j<input.length;j++){145.sum+=input[j]*input_hidden_weights[j][i];146.}147.sum+=hidden_thresholds[i];//148.hiddenValues[i]=function(sum);149.hiddenParams[i]=sum;150.}151.152.double sum=0;153.for(int i=0;i<HIDDEN_DIM;i++){154.sum+=hiddenValues[i]*hidden_output_weights[i];155.}156.sum+=output_threshold;//157.double outputValue=function(sum);158.double outputParam=sum;159.//System.out.println("实际输出");160.161./*162.*调整权值和阈值163.*/164.165.for(int i=0;i<input.length;i++){166.double factor=(expectedOutput-outputValue)*outputValue*(1-outpu tValue)*LEARNING_RATE*input[i];167.for(int j=0;j<HIDDEN_DIM;j++){168.double delta=factor*hidden_output_weights[j]*hiddenValues[j] *(1-hiddenValues[j]);169.//System.out.println("输入层到隐含层连接的权重调整:delta="+delta+"\t\t weight="+input_hidden_weights[i][j]);170.input_hidden_weights[i][j]+=delta;171.}172.}173.double factor=(expectedOutput-outputValue)*outputValue*(1-outputVal ue)*LEARNING_RATE;174.for(int i=0;i<hidden_thresholds.length;i++){175.double delta=factor*hidden_output_weights[i]*hiddenValues[i]*(1 -hiddenValues[i]);176.hidden_thresholds[i]+=delta;177.}178.179.//System.out.println("hidden_output_weights:"+hidden_output_weigh ts.length);180.for(int i=0;i<hidden_output_weights.length;i++){181.//w+=(exp-act)*df/dw182.//df/dw=x(1-x)*hiddenj183.double delta=factor*hiddenValues[i];184.//System.out.println("隐含层到输出层连接的权值调整:delta="+delta+"\t\t weight="+hidden_output_weights[i]);185.hidden_output_weights[i]+=delta;186.187.}188.double delta=(expectedOutput-outputValue)*outputValue*(1-outputValue)*LEARNING_RATE;189.output_threshold+=delta;190.if(Math.abs(outputValue-expectedOutput)>0.1){191.//System.out.println(input[0]+"\t\t"+outputValue+"\t\t"+expecte dOutput);192.}193.194.195.196.}197.198.}2.测试代码[java]view plaincopy1.package pkg1;2.3.import java.awt.Graphics;4.import java.util.Scanner;5.6.import javax.swing.JFrame;7.8.public class DisplayNeuro extends javax.swing.JPanel{9.10.public static final int SIDE_LENGTH=200;11.12.TestNeuro neuro;//=new TestNeuro();13./**14.*@param args15.*/16.public static void main(String[]args){17.//TODO Auto-generated method stub18.DisplayNeuro dn=new DisplayNeuro();19.JFrame jFrame=new JFrame();20.jFrame.setBounds(100,100,300,300);21.jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);22.jFrame.add(dn);23.jFrame.setVisible(true);24.25.TestNeuro neuro=new TestNeuro(1,20);26.dn.neuro=neuro;27.Scanner in=new Scanner(System.in);28.dn.repaint();29.for(int i=0;i<100000000;i++){30.double[]input=new double[1];31.input[0]=Math.random()/2+0.25;32.double expectedOutput=(Math.sin(3.14*(input[0]-0.25)*2*4)+1)/8*3+0.125;33.//System.out.println("input:"+input[0]+"\t\texpectedOutput:"+expectedOutput);34.//System.out.println("predict before training:"+neuro.predict(input));35.neuro.trainOnce(input,expectedOutput);36.//System.out.println("predict after training:"+neuro.predict(input));37.38.if(i%100000==0){39.40.System.out.println("input please");41.//in.next();42.//neuro.initialize();43.dn.repaint();44.}45.46.}47.}48.49.50.@Override51.public void paint(Graphics arg0){52.//TODO Auto-generated method stub53.super.paint(arg0);54.55.for(double x=0.25;x<0.75;x+=0.005){56.double[]input=new double[1];57.input[0]=x;58.double y=neuro.predict(input);59.arg0.fillRect((int)(x*SIDE_LENGTH),(int)((1-y)*SIDE_LENGTH),1,1);60.}61.62.63.}64.65.66.}。