首页 > 代码库 > BP神经网络在双色球彩票上的预测实验及实现
BP神经网络在双色球彩票上的预测实验及实现
人工智能和人工神经网络,提到这些可能有很多人都觉得很高深,很高级。但其实也有简单的,比如BP神经网络,就目前的人工神经网络发展看,除了深度学习算法的人工神经网络以外,应用最广泛的就是BP神经网络,BP神经网络能够快速发现并学习具备线性回归特征的问题。相信也有很多人想把它用在彩票分析上,处于爱好和玩的原因,我就来做一个实现。
BP神经网络的关键参数一般有3个,输入节点个数,隐藏节点个数,输出节点个数。双色球,自然输入输出都是7了。基本想法是,根据前一期的号码,推算下一期的号码。这样训练样本也很丰富,历史的中奖号码按照出奖顺序,依次传入作为训练样本即可。比较容易操作。
接下来,就是组织数据格式,要符合BP网络的算法要求了,BP神经网络训练时,只能接受小数作为输入,也就是输入数据的单向必须小于1.这好办,只需要将双色球的中奖号码除以100,形成一个2位小数,输出结果也是2位小数。甚至不需要乘100的操作,想必也能直接看懂结果
说动手就动手,先搞个BP神经网络的实现。如下:
package ghost.writer.logic; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class BPFactory { /** * BP神经网络元 */ private static BP bp; /** * 初始化一个全新的bp神经网络 * @param inputSize * @param hiddenSize * @param outputSize */ public static void initialization(int inputSize,int hiddenSize,int outputSize) { bp=new BP(inputSize, hiddenSize, outputSize); } /** * 从文件数据中读取bp神经网络 * @param file * @throws IOException * @throws ClassNotFoundException */ public static void initialization(File file) throws IOException, ClassNotFoundException { FileInputStream fi = new FileInputStream(file); ObjectInputStream si = new ObjectInputStream(fi); bp = (BP) si.readObject(); si.close(); } /** * 将目前的神经网络储存在指定文件 * @param file * @throws IOException */ public static void save(File file) throws IOException { FileOutputStream fo = new FileOutputStream(file); ObjectOutputStream so = new ObjectOutputStream(fo); so.writeObject(bp); so.close(); } /** * 训练BP神经网络 * @param trainData * @param target */ public static void train(double[] trainData, double[] target) { bp.train(trainData, target); } /** * 要求bp神经网络返回预测值 * @param inData * @return */ public static double[] test(double[] inData) { return bp.test(inData); } }
聪明的同学可能已经发现了,上面只是个工厂类,我们继续:
package ghost.writer.logic; import java.io.Serializable; import java.util.Random; /** * BPNN. * * @author RenaQiu * */ public class BP implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * input vector. */ private final double[] input; /** * hidden layer. */ private final double[] hidden; /** * output layer. */ private final double[] output; /** * target. */ private final double[] target; /** * delta vector of the hidden layer . */ private final double[] hidDelta; /** * output layer of the output layer. */ private final double[] optDelta; /** * learning rate. */ private final double eta; /** * momentum. */ private final double momentum; /** * weight matrix from input layer to hidden layer. */ private final double[][] iptHidWeights; /** * weight matrix from hidden layer to output layer. */ private final double[][] hidOptWeights; /** * previous weight update. */ private final double[][] iptHidPrevUptWeights; /** * previous weight update. */ private final double[][] hidOptPrevUptWeights; public double optErrSum = 0d; public double hidErrSum = 0d; private final Random random; /** * Constructor. * <p> * <strong>Note:</strong> The capacity of each layer will be the parameter * plus 1. The additional unit is used for smoothness. * </p> * * @param inputSize * @param hiddenSize * @param outputSize * @param eta * @param momentum * @param epoch */ public BP(int inputSize, int hiddenSize, int outputSize, double eta, double momentum) { input = new double[inputSize + 1]; hidden = new double[hiddenSize + 1]; output = new double[outputSize + 1]; target = new double[outputSize + 1]; hidDelta = new double[hiddenSize + 1]; optDelta = new double[outputSize + 1]; iptHidWeights = new double[inputSize + 1][hiddenSize + 1]; hidOptWeights = new double[hiddenSize + 1][outputSize + 1]; random = new Random(20140106); randomizeWeights(iptHidWeights); randomizeWeights(hidOptWeights); iptHidPrevUptWeights = new double[inputSize + 1][hiddenSize + 1]; hidOptPrevUptWeights = new double[hiddenSize + 1][outputSize + 1]; this.eta = eta; this.momentum = momentum; } private void randomizeWeights(double[][] matrix) { for (int i = 0, len = matrix.length; i != len; i++) for (int j = 0, len2 = matrix[i].length; j != len2; j++) { double real = random.nextDouble(); matrix[i][j] = random.nextDouble() > 0.5 ? real : -real; } } /** * Constructor with default eta = 0.25 and momentum = 0.3. * * @param inputSize * @param hiddenSize * @param outputSize * @param epoch */ public BP(int inputSize, int hiddenSize, int outputSize) { this(inputSize, hiddenSize, outputSize, 0.998, 0.001); } /** * Entry method. The train data should be a one-dim vector. * * @param trainData * @param target */ public void train(double[] trainData, double[] target) { loadInput(trainData); loadTarget(target); forward(); calculateDelta(); adjustWeight(); } /** * Test the BPNN. * * @param inData * @return */ public double[] test(double[] inData) { if (inData.length != input.length - 1) { throw new IllegalArgumentException("Size Do Not Match."); } System.arraycopy(inData, 0, input, 1, inData.length); forward(); return getNetworkOutput(); } /** * Return the output layer. * * @return */ private double[] getNetworkOutput() { int len = output.length; double[] temp = new double[len - 1]; for (int i = 1; i != len; i++) temp[i - 1] = output[i]; return temp; } /** * Load the target data. * * @param arg */ private void loadTarget(double[] arg) { if (arg.length != target.length - 1) { throw new IllegalArgumentException("Size Do Not Match."); } System.arraycopy(arg, 0, target, 1, arg.length); } /** * Load the training data. * * @param inData */ private void loadInput(double[] inData) { if (inData.length != input.length - 1) { throw new IllegalArgumentException("Size Do Not Match."); } System.arraycopy(inData, 0, input, 1, inData.length); } /** * Forward. * * @param layer0 * @param layer1 * @param weight */ private void forward(double[] layer0, double[] layer1, double[][] weight) { // threshold unit. layer0[0] = 1.0; for (int j = 1, len = layer1.length; j != len; ++j) { double sum = 0; for (int i = 0, len2 = layer0.length; i != len2; ++i) sum += weight[i][j] * layer0[i]; layer1[j] = sigmoid(sum); // layer1[j] = tansig(sum); } } /** * Forward. */ private void forward() { forward(input, hidden, iptHidWeights); forward(hidden, output, hidOptWeights); } /** * Calculate output error. */ private void outputErr() { double errSum = 0; for (int idx = 1, len = optDelta.length; idx != len; ++idx) { double o = output[idx]; optDelta[idx] = o * (1d - o) * (target[idx] - o); errSum += Math.abs(optDelta[idx]); } optErrSum = errSum; } /** * Calculate hidden errors. */ private void hiddenErr() { double errSum = 0; for (int j = 1, len = hidDelta.length; j != len; ++j) { double o = hidden[j]; double sum = 0; for (int k = 1, len2 = optDelta.length; k != len2; ++k) sum += hidOptWeights[j][k] * optDelta[k]; hidDelta[j] = o * (1d - o) * sum; errSum += Math.abs(hidDelta[j]); } hidErrSum = errSum; } /** * Calculate errors of all layers. */ private void calculateDelta() { outputErr(); hiddenErr(); } /** * Adjust the weight matrix. * * @param delta * @param layer * @param weight * @param prevWeight */ private void adjustWeight(double[] delta, double[] layer, double[][] weight, double[][] prevWeight) { layer[0] = 1; for (int i = 1, len = delta.length; i != len; ++i) { for (int j = 0, len2 = layer.length; j != len2; ++j) { double newVal = momentum * prevWeight[j][i] + eta * delta[i] * layer[j]; weight[j][i] += newVal; prevWeight[j][i] = newVal; } } } /** * Adjust all weight matrices. */ private void adjustWeight() { adjustWeight(optDelta, hidden, hidOptWeights, hidOptPrevUptWeights); adjustWeight(hidDelta, input, iptHidWeights, iptHidPrevUptWeights); } /** * Sigmoid. * * @param val * @return */ private double sigmoid(double val) { return 1d / (1d + Math.exp(-val)); } private double tansig(double val) { return 2d / (1d + Math.exp(-2 * val)) - 1; } }
上面就是BP神经网络的核心实现类了,看上去很简单吧。注意哦,它可是有线性学习能力的!工具有了,还是先把训练数据准备好吧,读数据库什么的太隐晦,先用个数组做简单点,即使要改以后也很容易。毕竟是做实验嘛,如果成功了,中了个二等奖,精度不够,要更进一步训练,我想也就不用俺多说了~~~
package ghost.writer.data; public class Data { public static double[][] trainData_89feibo = { { 0.10, 0.13, 0.17, 0.28, 0.30, 0.32, 0.04 }, { 0.10, 0.13, 0.14, 0.16, 0.21, 0.32, 0.14 }, { 0.03, 0.07, 0.13, 0.18, 0.22, 0.25, 0.03 }, { 0.08, 0.12, 0.15, 0.19, 0.28, 0.29, 0.02 }, { 0.06, 0.07, 0.14, 0.21, 0.22, 0.24, 0.13 }, { 0.03, 0.12, 0.13, 0.22, 0.30, 0.33, 0.14 }, { 0.03, 0.04, 0.08, 0.14, 0.21, 0.28, 0.14 }, { 0.08, 0.18, 0.19, 0.22, 0.27, 0.32, 0.06 }, { 0.03, 0.12, 0.25, 0.26, 0.28, 0.29, 0.16 }, { 0.13, 0.16, 0.19, 0.23, 0.26, 0.28, 0.05 }, { 0.08, 0.11, 0.17, 0.21, 0.23, 0.24, 0.05 }, { 0.03, 0.10, 0.18, 0.24, 0.27, 0.29, 0.09 }, { 0.05, 0.07, 0.10, 0.13, 0.19, 0.20, 0.15 }, { 0.05, 0.06, 0.07, 0.12, 0.13, 0.18, 0.12 }, { 0.01, 0.06, 0.07, 0.19, 0.22, 0.27, 0.02 }, { 0.10, 0.15, 0.18, 0.20, 0.23, 0.31, 0.12 }, { 0.01, 0.09, 0.13, 0.22, 0.25, 0.32, 0.12 }, { 0.07, 0.18, 0.19, 0.23, 0.29, 0.30, 0.02 }, { 0.01, 0.03, 0.16, 0.17, 0.20, 0.32, 0.07 }, { 0.01, 0.04, 0.09, 0.15, 0.22, 0.30, 0.06 }, { 0.02, 0.07, 0.13, 0.20, 0.25, 0.27, 0.06 }, { 0.07, 0.16, 0.17, 0.18, 0.30, 0.33, 0.06 }, { 0.02, 0.03, 0.09, 0.10, 0.28, 0.30, 0.06 }, { 0.05, 0.12, 0.21, 0.23, 0.26, 0.28, 0.09 }, { 0.02, 0.08, 0.11, 0.14, 0.19, 0.33, 0.09 }, { 0.02, 0.09, 0.13, 0.17, 0.20, 0.28, 0.11 }, { 0.03, 0.06, 0.08, 0.14, 0.19, 0.32, 0.03 }, { 0.04, 0.06, 0.09, 0.25, 0.30, 0.33, 0.14 }, { 0.14, 0.23, 0.24, 0.26, 0.29, 0.30, 0.03 }, { 0.09, 0.14, 0.23, 0.24, 0.26, 0.29, 0.03 }, { 0.03, 0.05, 0.17, 0.18, 0.26, 0.27, 0.15 }, { 0.07, 0.13, 0.17, 0.19, 0.22, 0.26, 0.13 }, { 0.10, 0.11, 0.12, 0.23, 0.28, 0.32, 0.16 }, { 0.01, 0.04, 0.10, 0.13, 0.21, 0.31, 0.13 }, { 0.04, 0.13, 0.14, 0.20, 0.22, 0.30, 0.06 }, { 0.05, 0.06, 0.12, 0.14, 0.19, 0.23, 0.09 }, { 0.05, 0.07, 0.09, 0.11, 0.20, 0.21, 0.03 }, { 0.02, 0.08, 0.12, 0.14, 0.16, 0.32, 0.16 }, { 0.02, 0.04, 0.11, 0.13, 0.16, 0.26, 0.11 }, { 0.02, 0.13, 0.19, 0.23, 0.24, 0.28, 0.05 }, { 0.09, 0.15, 0.20, 0.21, 0.22, 0.24, 0.14 }, { 0.04, 0.08, 0.12, 0.19, 0.21, 0.25, 0.13 }, { 0.02, 0.05, 0.11, 0.23, 0.24, 0.29, 0.08 }, { 0.04, 0.14, 0.24, 0.25, 0.28, 0.31, 0.10 }, { 0.07, 0.11, 0.15, 0.21, 0.26, 0.31, 0.06 }, { 0.01, 0.02, 0.08, 0.26, 0.29, 0.31, 0.14 }, { 0.02, 0.04, 0.14, 0.18, 0.20, 0.22, 0.07 }, { 0.01, 0.06, 0.15, 0.19, 0.28, 0.29, 0.10 }, { 0.01, 0.02, 0.22, 0.28, 0.29, 0.30, 0.15 }, { 0.05, 0.14, 0.17, 0.22, 0.23, 0.25, 0.07 }, { 0.07, 0.15, 0.18, 0.19, 0.20, 0.26, 0.14 }, { 0.05, 0.11, 0.20, 0.21, 0.26, 0.31, 0.03 }, { 0.04, 0.08, 0.11, 0.14, 0.16, 0.20, 0.11 }, { 0.05, 0.07, 0.09, 0.23, 0.27, 0.32, 0.01 }, { 0.02, 0.04, 0.05, 0.06, 0.08, 0.16, 0.03 }, { 0.02, 0.04, 0.09, 0.13, 0.18, 0.20, 0.07 }, { 0.01, 0.02, 0.04, 0.15, 0.17, 0.28, 0.11 }, { 0.01, 0.11, 0.23, 0.27, 0.31, 0.32, 0.09 }, { 0.09, 0.11, 0.23, 0.30, 0.31, 0.32, 0.06 }, { 0.07, 0.09, 0.11, 0.17, 0.28, 0.31, 0.11 }, { 0.16, 0.21, 0.22, 0.28, 0.31, 0.32, 0.05 }, { 0.09, 0.23, 0.24, 0.27, 0.29, 0.32, 0.08 }, { 0.15, 0.17, 0.18, 0.21, 0.29, 0.32, 0.13 }, { 0.01, 0.02, 0.03, 0.06, 0.08, 0.33, 0.13 }, { 0.01, 0.06, 0.12, 0.13, 0.22, 0.31, 0.07 }, { 0.04, 0.07, 0.11, 0.17, 0.24, 0.33, 0.09 }, { 0.04, 0.06, 0.17, 0.21, 0.23, 0.33, 0.07 }, { 0.03, 0.12, 0.16, 0.17, 0.18, 0.27, 0.08 }, { 0.12, 0.15, 0.21, 0.26, 0.32, 0.33, 0.07 }, { 0.04, 0.17, 0.19, 0.23, 0.24, 0.27, 0.10 }, { 0.04, 0.15, 0.16, 0.24, 0.27, 0.28, 0.03 }, { 0.07, 0.08, 0.11, 0.13, 0.21, 0.27, 0.08 }, { 0.01, 0.05, 0.12, 0.13, 0.21, 0.22, 0.10 }, { 0.03, 0.04, 0.05, 0.25, 0.30, 0.31, 0.04 }, { 0.11, 0.12, 0.14, 0.20, 0.22, 0.29, 0.14 }, { 0.12, 0.18, 0.21, 0.22, 0.27, 0.32, 0.11 }, { 0.05, 0.07, 0.12, 0.19, 0.27, 0.31, 0.02 }, { 0.06, 0.10, 0.13, 0.16, 0.23, 0.24, 0.15 }, { 0.08, 0.20, 0.25, 0.30, 0.32, 0.33, 0.01 }, { 0.02, 0.15, 0.16, 0.17, 0.19, 0.30, 0.08 }, { 0.06, 0.11, 0.12, 0.14, 0.17, 0.22, 0.01 }, { 0.09, 0.18, 0.25, 0.26, 0.30, 0.32, 0.11 }, { 0.01, 0.15, 0.16, 0.25, 0.26, 0.29, 0.10 }, { 0.03, 0.09, 0.10, 0.19, 0.28, 0.33, 0.09 }, { 0.04, 0.06, 0.14, 0.16, 0.18, 0.29, 0.05 }, { 0.08, 0.11, 0.13, 0.18, 0.28, 0.33, 0.10 }, { 0.07, 0.11, 0.14, 0.19, 0.24, 0.29, 0.05 }, { 0.03, 0.09, 0.15, 0.20, 0.27, 0.29, 0.01 }, { 0.04, 0.21, 0.23, 0.31, 0.32, 0.33, 0.04 }, { 0.06, 0.10, 0.11, 0.28, 0.30, 0.33, 0.12 }, { 0.01, 0.04, 0.19, 0.22, 0.24, 0.25, 0.15 }, { 0.15, 0.18, 0.23, 0.27, 0.32, 0.33, 0.04 }, { 0.03, 0.04, 0.07, 0.17, 0.21, 0.27, 0.14 }, { 0.08, 0.10, 0.12, 0.14, 0.18, 0.28, 0.14 }, { 0.05, 0.14, 0.16, 0.21, 0.29, 0.30, 0.12 }, { 0.08, 0.09, 0.19, 0.20, 0.25, 0.32, 0.16 }, { 0.05, 0.07, 0.08, 0.20, 0.31, 0.33, 0.11 }, { 0.09, 0.10, 0.13, 0.14, 0.21, 0.32, 0.02 }, { 0.01, 0.08, 0.11, 0.19, 0.21, 0.24, 0.08 }, { 0.05, 0.09, 0.13, 0.15, 0.17, 0.21, 0.13 }, { 0.04, 0.09, 0.19, 0.22, 0.25, 0.29, 0.15 } }; public static double[][] target_89feibo = { { 0.10, 0.13, 0.14, 0.16, 0.21, 0.32, 0.14 }, { 0.03, 0.07, 0.13, 0.18, 0.22, 0.25, 0.03 }, { 0.08, 0.12, 0.15, 0.19, 0.28, 0.29, 0.02 }, { 0.06, 0.07, 0.14, 0.21, 0.22, 0.24, 0.13 }, { 0.03, 0.12, 0.13, 0.22, 0.30, 0.33, 0.14 }, { 0.03, 0.04, 0.08, 0.14, 0.21, 0.28, 0.14 }, { 0.08, 0.18, 0.19, 0.22, 0.27, 0.32, 0.06 }, { 0.03, 0.12, 0.25, 0.26, 0.28, 0.29, 0.16 }, { 0.13, 0.16, 0.19, 0.23, 0.26, 0.28, 0.05 }, { 0.08, 0.11, 0.17, 0.21, 0.23, 0.24, 0.05 }, { 0.03, 0.10, 0.18, 0.24, 0.27, 0.29, 0.09 }, { 0.05, 0.07, 0.10, 0.13, 0.19, 0.20, 0.15 }, { 0.05, 0.06, 0.07, 0.12, 0.13, 0.18, 0.12 }, { 0.01, 0.06, 0.07, 0.19, 0.22, 0.27, 0.02 }, { 0.10, 0.15, 0.18, 0.20, 0.23, 0.31, 0.12 }, { 0.01, 0.09, 0.13, 0.22, 0.25, 0.32, 0.12 }, { 0.07, 0.18, 0.19, 0.23, 0.29, 0.30, 0.02 }, { 0.01, 0.03, 0.16, 0.17, 0.20, 0.32, 0.07 }, { 0.01, 0.04, 0.09, 0.15, 0.22, 0.30, 0.06 }, { 0.02, 0.07, 0.13, 0.20, 0.25, 0.27, 0.06 }, { 0.07, 0.16, 0.17, 0.18, 0.30, 0.33, 0.06 }, { 0.02, 0.03, 0.09, 0.10, 0.28, 0.30, 0.06 }, { 0.05, 0.12, 0.21, 0.23, 0.26, 0.28, 0.09 }, { 0.02, 0.08, 0.11, 0.14, 0.19, 0.33, 0.09 }, { 0.02, 0.09, 0.13, 0.17, 0.20, 0.28, 0.11 }, { 0.03, 0.06, 0.08, 0.14, 0.19, 0.32, 0.03 }, { 0.04, 0.06, 0.09, 0.25, 0.30, 0.33, 0.14 }, { 0.14, 0.23, 0.24, 0.26, 0.29, 0.30, 0.03 }, { 0.09, 0.14, 0.23, 0.24, 0.26, 0.29, 0.03 }, { 0.03, 0.05, 0.17, 0.18, 0.26, 0.27, 0.15 }, { 0.07, 0.13, 0.17, 0.19, 0.22, 0.26, 0.13 }, { 0.10, 0.11, 0.12, 0.23, 0.28, 0.32, 0.16 }, { 0.01, 0.04, 0.10, 0.13, 0.21, 0.31, 0.13 }, { 0.04, 0.13, 0.14, 0.20, 0.22, 0.30, 0.06 }, { 0.05, 0.06, 0.12, 0.14, 0.19, 0.23, 0.09 }, { 0.05, 0.07, 0.09, 0.11, 0.20, 0.21, 0.03 }, { 0.02, 0.08, 0.12, 0.14, 0.16, 0.32, 0.16 }, { 0.02, 0.04, 0.11, 0.13, 0.16, 0.26, 0.11 }, { 0.02, 0.13, 0.19, 0.23, 0.24, 0.28, 0.05 }, { 0.09, 0.15, 0.20, 0.21, 0.22, 0.24, 0.14 }, { 0.04, 0.08, 0.12, 0.19, 0.21, 0.25, 0.13 }, { 0.02, 0.05, 0.11, 0.23, 0.24, 0.29, 0.08 }, { 0.04, 0.14, 0.24, 0.25, 0.28, 0.31, 0.10 }, { 0.07, 0.11, 0.15, 0.21, 0.26, 0.31, 0.06 }, { 0.01, 0.02, 0.08, 0.26, 0.29, 0.31, 0.14 }, { 0.02, 0.04, 0.14, 0.18, 0.20, 0.22, 0.07 }, { 0.01, 0.06, 0.15, 0.19, 0.28, 0.29, 0.10 }, { 0.01, 0.02, 0.22, 0.28, 0.29, 0.30, 0.15 }, { 0.05, 0.14, 0.17, 0.22, 0.23, 0.25, 0.07 }, { 0.07, 0.15, 0.18, 0.19, 0.20, 0.26, 0.14 }, { 0.05, 0.11, 0.20, 0.21, 0.26, 0.31, 0.03 }, { 0.04, 0.08, 0.11, 0.14, 0.16, 0.20, 0.11 }, { 0.05, 0.07, 0.09, 0.23, 0.27, 0.32, 0.01 }, { 0.02, 0.04, 0.05, 0.06, 0.08, 0.16, 0.03 }, { 0.02, 0.04, 0.09, 0.13, 0.18, 0.20, 0.07 }, { 0.01, 0.02, 0.04, 0.15, 0.17, 0.28, 0.11 }, { 0.01, 0.11, 0.23, 0.27, 0.31, 0.32, 0.09 }, { 0.09, 0.11, 0.23, 0.30, 0.31, 0.32, 0.06 }, { 0.07, 0.09, 0.11, 0.17, 0.28, 0.31, 0.11 }, { 0.16, 0.21, 0.22, 0.28, 0.31, 0.32, 0.05 }, { 0.09, 0.23, 0.24, 0.27, 0.29, 0.32, 0.08 }, { 0.15, 0.17, 0.18, 0.21, 0.29, 0.32, 0.13 }, { 0.01, 0.02, 0.03, 0.06, 0.08, 0.33, 0.13 }, { 0.01, 0.06, 0.12, 0.13, 0.22, 0.31, 0.07 }, { 0.04, 0.07, 0.11, 0.17, 0.24, 0.33, 0.09 }, { 0.04, 0.06, 0.17, 0.21, 0.23, 0.33, 0.07 }, { 0.03, 0.12, 0.16, 0.17, 0.18, 0.27, 0.08 }, { 0.12, 0.15, 0.21, 0.26, 0.32, 0.33, 0.07 }, { 0.04, 0.17, 0.19, 0.23, 0.24, 0.27, 0.10 }, { 0.04, 0.15, 0.16, 0.24, 0.27, 0.28, 0.03 }, { 0.07, 0.08, 0.11, 0.13, 0.21, 0.27, 0.08 }, { 0.01, 0.05, 0.12, 0.13, 0.21, 0.22, 0.10 }, { 0.03, 0.04, 0.05, 0.25, 0.30, 0.31, 0.04 }, { 0.11, 0.12, 0.14, 0.20, 0.22, 0.29, 0.14 }, { 0.12, 0.18, 0.21, 0.22, 0.27, 0.32, 0.11 }, { 0.05, 0.07, 0.12, 0.19, 0.27, 0.31, 0.02 }, { 0.06, 0.10, 0.13, 0.16, 0.23, 0.24, 0.15 }, { 0.08, 0.20, 0.25, 0.30, 0.32, 0.33, 0.01 }, { 0.02, 0.15, 0.16, 0.17, 0.19, 0.30, 0.08 }, { 0.06, 0.11, 0.12, 0.14, 0.17, 0.22, 0.01 }, { 0.09, 0.18, 0.25, 0.26, 0.30, 0.32, 0.11 }, { 0.01, 0.15, 0.16, 0.25, 0.26, 0.29, 0.10 }, { 0.03, 0.09, 0.10, 0.19, 0.28, 0.33, 0.09 }, { 0.04, 0.06, 0.14, 0.16, 0.18, 0.29, 0.05 }, { 0.08, 0.11, 0.13, 0.18, 0.28, 0.33, 0.10 }, { 0.07, 0.11, 0.14, 0.19, 0.24, 0.29, 0.05 }, { 0.03, 0.09, 0.15, 0.20, 0.27, 0.29, 0.01 }, { 0.04, 0.21, 0.23, 0.31, 0.32, 0.33, 0.04 }, { 0.06, 0.10, 0.11, 0.28, 0.30, 0.33, 0.12 }, { 0.01, 0.04, 0.19, 0.22, 0.24, 0.25, 0.15 }, { 0.15, 0.18, 0.23, 0.27, 0.32, 0.33, 0.04 }, { 0.03, 0.04, 0.07, 0.17, 0.21, 0.27, 0.14 }, { 0.08, 0.10, 0.12, 0.14, 0.18, 0.28, 0.14 }, { 0.05, 0.14, 0.16, 0.21, 0.29, 0.30, 0.12 }, { 0.08, 0.09, 0.19, 0.20, 0.25, 0.32, 0.16 }, { 0.05, 0.07, 0.08, 0.20, 0.31, 0.33, 0.11 }, { 0.09, 0.10, 0.13, 0.14, 0.21, 0.32, 0.02 }, { 0.01, 0.08, 0.11, 0.19, 0.21, 0.24, 0.08 }, { 0.05, 0.09, 0.13, 0.15, 0.17, 0.21, 0.13 }, { 0.04, 0.09, 0.19, 0.22, 0.25, 0.29, 0.15 }, { 0.02, 0.11, 0.19, 0.30, 0.32, 0.33, 0.09 }}; // 输入1期,输出1期,输入参数7个,减少输入的期数,长期无趋势短期也许会有 public static double[][] trainData_5num = { { 0.09, 0.18, 0.25, 0.26, 0.30, 0.32, 0.11 }, { 0.01, 0.15, 0.16, 0.25, 0.26, 0.29, 0.10 }, { 0.03, 0.09, 0.10, 0.19, 0.28, 0.33, 0.09 }, { 0.04, 0.06, 0.14, 0.16, 0.18, 0.29, 0.05 }, { 0.08, 0.11, 0.13, 0.18, 0.28, 0.33, 0.10 }, { 0.07, 0.11, 0.14, 0.19, 0.24, 0.29, 0.05 }, { 0.03, 0.09, 0.15, 0.20, 0.27, 0.29, 0.01 }, { 0.04, 0.21, 0.23, 0.31, 0.32, 0.33, 0.04 } }; // 输入1期,输出1期,输出参数7个 public static double[][] target_5num = { { 0.01, 0.15, 0.16, 0.25, 0.26, 0.29, 0.10 }, { 0.03, 0.09, 0.10, 0.19, 0.28, 0.33, 0.09 }, { 0.04, 0.06, 0.14, 0.16, 0.18, 0.29, 0.05 }, { 0.08, 0.11, 0.13, 0.18, 0.28, 0.33, 0.10 }, { 0.07, 0.11, 0.14, 0.19, 0.24, 0.29, 0.05 }, { 0.03, 0.09, 0.15, 0.20, 0.27, 0.29, 0.01 }, { 0.04, 0.21, 0.23, 0.31, 0.32, 0.33, 0.04 }, { 0.06, 0.10, 0.11, 0.28, 0.30, 0.33, 0.12 } }; // 输入1期,输出1期,输入参数7个 public static double[][] trainData = http://www.mamicode.com/{>
试验数据准备完毕,开始写个主类调用一下!看看是不是就发了,哈哈:package ghost.writer.start; import ghost.writer.data.Data; import ghost.writer.logic.BPFactory; public class TestBP { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // 7,18,7 BPFactory.initialization(7, 55, 7); double[][] trainData = http://www.mamicode.com/Data.trainData_89feibo;>
运行此类,效果明显啊!1156次样本训练之后,test里的号码,如果是训练数据中出现过的,其test结果直接就是其后一期中出号码!这就是要发财的节奏啊!不过!各位也看到了,本博还在写博客,还在因为工作原因研究hadoop!本博对BP神经网络进行一番研究之后,发现隐层节点基本上将训练样本数据完全“记忆”了下来,因此在用训练样本数据做测试时,可以基本达到100%出现后一期号码。而当出现训练样本最后一条记录作为输入时,问题发生了。BP网络其实本身计算出了整个样本的各各输出的“平均”数,之后他将此数输出了出来。之所以发现这个规律,是连续2次跟进买号之后,发现每次输出的结果基本都一样。因为新产生的一注号码,毕竟对往届历史的N个号码影响很小。因此BP网络输出的看上去一直是一个均值。
游戏做完了,BP网络也熟悉了。随机事件规律发现的问题,还需要进一步的去探索,而创造一个人工智能来帮助人们发现未知的规律,那才是真真有趣的!~~最后希望结交更多的人工智能实现方面的人,一起找乐子。用彩票数据来训练,纯属一种玩乐的心态,学习是一件有趣的事,不要太当真。
BP神经网络在双色球彩票上的预测实验及实现