Time Series Parameter learning in C#
// --------------------------------------------------------------------------------------------------------------------
// <copyright file="ParameterLearningTemporal.cs" company="Bayes Server">
// Copyright (C) Bayes Server. All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
namespace BayesServer.HelpSamples
{
using System;
using System.Data.SqlClient;
using BayesServer.Data;
using BayesServer.Inference.RelevanceTree;
using BayesServer.Learning.Parameters;
public static class ParameterLearningTemporal
{
public static void Main()
{
// we manually construct the network here, but it could be loaded from a file
var network = CreateNetworkStructure();
var x1 = network.Variables["X1"];
var x2 = network.Variables["X2"];
// now learn the parameters from the data in Walkthrough 3 - Time Series network
// This example uses Sql Server as the data source and assumes the data has been copied to
// a table called TimeSeriesWalkthrough
// We will use the RelevanceTree algorithm here, as it is optimized for parameter learning
var learning = new ParameterLearning(network, new RelevanceTreeInferenceFactory());
var learningOptions = new ParameterLearningOptions();
learningOptions.TimeSeriesMode = TimeSeriesMode.Rolling;
// sql server connection string
string sqlServer = @"localhost\sqlexpress"; // change this to your sql server instance name
string database = "BayesServer"; // change this to your database name
string connectionString = string.Format(
@"Data Source={0};Initial Catalog={1};Integrated Security=True;", sqlServer, database);
IDataReaderCommand temporalDataReaderCommand = new DatabaseDataReaderCommand(
SqlClientFactory.Instance,
connectionString,
"Select [Case], Time, X1, X2 From TimeSeriesWalkthrough ORDER BY [Case], Time");
bool cacheDataInMemory = true; // set this to false for large data sets
if (cacheDataInMemory)
{
temporalDataReaderCommand = new DataTableDataReaderCommand(temporalDataReaderCommand.ExecuteReader());
}
var temporalReaderOptions = new TemporalReaderOptions("Case", "Time", TimeValueType.Index);
// here we map variables to database columns
// in this case the variables and database columns have the same name
var temporalVariableReferences = new VariableReference[]
{
new VariableReference(x1, ColumnValueType.Value, x1.Name),
new VariableReference(x2, ColumnValueType.Value, x2.Name)
};
// note that although this example only has temporal data
// we could have included additional non temporal variables and data
var evidenceReaderCommand = new EvidenceReaderCommand(
temporalDataReaderCommand,
temporalVariableReferences,
temporalReaderOptions);
var result = learning.Learn(evidenceReaderCommand, learningOptions);
Console.WriteLine("Log likelihood = {0}", result.LogLikelihood.Value);
}
private static Network CreateNetworkStructure()
{
var network = new Network();
var x1 = new Variable("X1", VariableValueType.Continuous);
var x2 = new Variable("X2", VariableValueType.Continuous);
// add a temporal (time series) node, with two continuous variables
var nodeX = new Node("X", new Variable[] { x1, x2 })
{
TemporalType = BayesServer.TemporalType.Temporal
};
network.Nodes.Add(nodeX);
// add temporal links
for (int order = 1; order <= 4; order++)
{
network.Links.Add(new Link(nodeX, nodeX, order));
}
// at this point the Dynamic Bayesian network structure is fully specified
return network;
}
}
}