神经网络算法代码java 神经网络算法代码实现( 二 )


?
图片描述
我们可以运用逻辑回归算法来解决上面的分类问题 , 但是逻辑回归得到一个线性的直线做为分界线 , 可以看到上面的红线无论怎么摆放,总是有一个样本被错误地划分到不同类型中,所以对于上面的数据 , 仅仅一条直线不能很正确地划分他们的分类 , 如果我们运用神经网络算法,可以得到下图的分类效果,相当于多条直线求并集来划分空间 , 这样准确性更高 。
?
图片描述
简单粗暴,用作者的代码运行后 训练5000次。根据训练结果来预测一条新数据的分类(3,1)
【神经网络算法代码java 神经网络算法代码实现】?
预测值 (3,1)的结果跟(1,2)(2,1)属于一类 属于正方形
这时如果我们去掉 2个样本,则样本输入变成如下
//设置样本数据 , 对应上面的4个二维坐标数据
double[][] data = https://www.04ip.com/post/new double[][]{{1,2},{2,2}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1}};
1
2
3
4
1
2
3
4
?
?
则(3,1)结果变成了三角形 , 
如果你选前两个点 你会发现直接一条中间线就可以区分 这时候的你的结果跟之前4个点时有区别 so 你得增加样本 直到这些样本按照你所想要的方式分类  , 所以样本的多少 重要性体现在,样本得能反映所有的特征值(也就是输入值) ,样本多少或者特征(本例子指点的位置特征)决定的你的网络的训练结果,?。。≌馐?我们反推出来的结果。这里距离深度学习好像近了一步 。
另外,这个70行代码的神经网络没有保存你训练的网络 ,所以你每次运行都是重新训练的网络 。其实,在你训练过后 权值已经确定了下来,我们确定网络也就是根据权值,so只要把训练后的权值保存下来,将需要分类的数据按照这种权值带入网络,即可得到输出值,也就是一旦网络确定, 权值也就确定,一个输入对应一个固定的输出 , 不会再次改变!个人见解 。
最后附上作者的源码,作者的文章见开头链接
下面的实现程序BpDeep.java可以直接拿去使用,
import java.util.Random;
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;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();//随机初始化权重
}
}
}
//逐层向前计算输出
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];

推荐阅读