PWB Predictor in C# with Encog 3.3

imageYes, I know that it is impossible to predict lottery results. But if the results would be predictable? Of course I know they are not, but just hypothetically for a play with Perceptron Neural Network and prediction algorithms I want to show you that in 245 lines of code you are able to play with prediction thanks to Encog 3.3 library. I bought recently 2 Jeff Heaton’s  books about neural networks and C# and his library. That inspired me to play with prediction, forecast, trends, classifications, regression and more… I do not want to bring you too much details and I wan to share that 245 lines of code. To make it working in Visual Studio you have to just download by NuGet encog-dotnet-core 3.3 library and include it to console application with that code, then last thing to prepare is recent results of power ball lottery let’s said from last year and safe that as the TXT file. But please remember, predicted values are correct in math but it is impossible to predict truly random lottery results which is Power Ball, but who can stop me from trying ;-). There is one more thing, having good results can take some time, sometimes few hours, so be patient when you run it. To make it faster I made it stop once 40% results are predicted correctly. Thanks for reading!

namespace PowerBallPredictor
{
    using System;
    using System.Collections.Generic;
    using System.Net;
    using System.IO;
    using Encog.Neural.Networks;
    using Encog.ML.Data.Basic;
    using Encog.Neural.Networks.Layers;
    using Encog.Engine.Network.Activation;
    using Encog.Neural.Networks.Training.Propagation.Resilient;
    class Result
    {
        public int V1 { get; private set; }
        public int V2 { get; private set; }
        public int V3 { get; private set; }
        public int V4 { get; private set; }
        public int V5 { get; private set; }
        public int V6 { get; private set; }
        public Result(int v1, int v2, int v3, int v4, int v5, int v6)
        {
            V1 = v1;
            V2 = v2;
            V3 = v3;
            V4 = v4;
            V5 = v5;
            V6 = v6;
        }
        public Result(double[] values)
        {
            V1 = (int)Math.Round(values[0]);
            V2 = (int)Math.Round(values[1]);
            V3 = (int)Math.Round(values[2]);
            V4 = (int)Math.Round(values[3]);
            V5 = (int)Math.Round(values[4]);
            V6 = (int)Math.Round(values[5]);
        }
        public bool IsValid()
        {
            return
            V1 >= 1 && V1 <= 69 &&
            V2 >= 1 && V2 <= 69 &&
            V3 >= 1 && V3 <= 69 &&
            V4 >= 1 && V4 <= 69 &&
            V5 >= 1 && V5 <= 69 &&
            V6 >= 1 && V6 <= 69 &&
            V1 != V2 &&
            V1 != V3 &&
            V1 != V4 &&
            V1 != V5 &&
            V1 != V6 &&
            V2 != V3 &&
            V2 != V4 &&
            V2 != V5 &&
            V2 != V6 &&
            V3 != V4 &&
            V3 != V5 &&
            V3 != V6 &&
            V4 != V5 &&
            V4 != V6 &&
            V5 != V6;
        }
        public bool IsOut()
        {
            return
            !(
            V1 >= 1 && V1 <= 69 &&
            V2 >= 1 && V2 <= 69 &&
            V3 >= 1 && V3 <= 69 &&
            V4 >= 1 && V4 <= 69 &&
            V5 >= 1 && V5 <= 69 &&
            V6 >= 1 && V6 <= 69);
        }
        public override string ToString()
        {
            return string.Format(
            "{0},{1},{2},{3},{4},{5}",
            V1, V2, V3, V4, V5, V6);
        }
    }
    class ListResults : List<Result> { }
    class Program
    {
        static void Main(string[] args)
        {
            var fileDB = @"C:\Projects\Predictor\db\winnums-text.txt";
            try
            {
                ListResults dbl = null;
                if (CreateDatabases(fileDB, out dbl))
                {
                    var deep = 27;
                    var network = new BasicNetwork();
                    network.AddLayer(
                    new BasicLayer(null, true, 6 * deep));
                    network.AddLayer(
                    new BasicLayer(
                    new ActivationSigmoid(), true, 5 * 6 * deep));
                    network.AddLayer(
                    new BasicLayer(
                    new ActivationSigmoid(), true, 5 * 6 * deep));
                    network.AddLayer(
                    new BasicLayer(
                    new ActivationLinear(), true, 6));
                    network.Structure.FinalizeStructure();
                    var learningInput = new double[deep][];
                    for (int i = 0; i < deep; ++i)
                    {
                        learningInput[i] = new double[deep * 6];
                        for (int j = 0, k = 0; j < deep; ++j)
                        {
                            var idx = 2 * deep - i - j;
                            var data = dbl[idx];
                            learningInput[i][k++] = (double)data.V1;
                            learningInput[i][k++] = (double)data.V2;
                            learningInput[i][k++] = (double)data.V3;
                            learningInput[i][k++] = (double)data.V4;
                            learningInput[i][k++] = (double)data.V5;
                            learningInput[i][k++] = (double)data.V6;
                        }
                    }
                    var learningOutput = new double[deep][];
                    for (int i = 0; i < deep; ++i)
                    {
                        var idx = deep - 1 - i;
                        var data = dbl[idx];
                        learningOutput[i] = new double[6]
                        {
                            (double)data.V1,
                            (double)data.V2,
                            (double)data.V3,
                            (double)data.V4,
                            (double)data.V5,
                            (double)data.V6
                        };
                    }
                    var trainingSet = new BasicMLDataSet(
                    learningInput,
                    learningOutput
                    );
                    var train = new ResilientPropagation(
                    network, trainingSet);
                    train.NumThreads = Environment.ProcessorCount;
                START:
                    network.Reset();
                RETRY:
                    var step = 0;
                    do
                    {
                        train.Iteration();
                        Console.WriteLine("Train Error: {0}", train.Error);
                        ++step;
                    }
                    while (train.Error > 0.001 && step < 20);
                    var passedCount = 0;
                    for (var i = 0; i < deep; ++i)
                    {
                        var should =
                        new Result(learningOutput[i]);
                        var inputn = new BasicMLData(6 * deep);
                        Array.Copy(
                        learningInput[i],
                        inputn.Data,
                        inputn.Data.Length);
                        var comput =
                        new Result(
                        ((BasicMLData)network.
                        Compute(inputn)).Data);
                        var passed = should.ToString() == comput.ToString();
                        if (passed)
                        {
                            Console.ForegroundColor = ConsoleColor.Green;
                            ++passedCount;
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                        }
                        Console.WriteLine("{0} {1} {2} {3}",
                        should.ToString().PadLeft(17, ' '),
                        passed ? "==" : "!=",
                        comput.ToString().PadRight(17, ' '),
                        passed ? "PASS" : "FAIL");
                        Console.ResetColor();
                    }
                    var input = new BasicMLData(6 * deep);
                    for (int i = 0, k = 0; i < deep; ++i)
                    {
                        var idx = deep - 1 - i;
                        var data = dbl[idx];
                        input.Data[k++] = (double)data.V1;
                        input.Data[k++] = (double)data.V2;
                        input.Data[k++] = (double)data.V3;
                        input.Data[k++] = (double)data.V4;
                        input.Data[k++] = (double)data.V5;
                        input.Data[k++] = (double)data.V6;
                    }
                    var perfect = dbl[0];
                    var predict = new Result(
                    ((BasicMLData)network.Compute(input)).Data);
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("Predict: {0}", predict);
                    Console.ResetColor();
                    if (predict.IsOut())
                        goto START;
                    if ((double)passedCount < (deep * (double)3 / (double)10) ||
                        !predict.IsValid())
                        goto RETRY;
                    Console.WriteLine("Press any key for close...");
                    Console.ReadKey(true);
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.ToString());
            }
        }
        static bool CreateDatabases(
        string fileDB,
        out ListResults dbl)
        {
            dbl = new ListResults();
            using (var reader = File.OpenText(fileDB))
            {
                var line = string.Empty;
                var separator = new string[] { "  " };
                while ((line = reader.ReadLine()) != null)
                {
                    if (line == "Draw Date   WB1 WB2 WB3 WB4 WB5 PB  PP") continue;
                    var values = line.Split(separator, StringSplitOptions.None);
                    var res = new Result(
                    int.Parse(values[1]),
                    int.Parse(values[2]),
                    int.Parse(values[3]),
                    int.Parse(values[4]),
                    int.Parse(values[5]),
                    int.Parse(values[6])
                    );
                    dbl.Add(res);
                }
            }
            return true;
        }
    }
}

p ;).

5 Replies to “PWB Predictor in C# with Encog 3.3”

  1. Hi. Thanks for the sharing. I have a question. What does variable deep is for in the code? and also what it should be to cover all lines? Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.