private ISymbolicExpressionTreeNode GenTreeShiftStdDist(string variable, double m_org, double s_org, double m_tar, double s_tar) { // x - m_org var substractionNode = new Subtraction().CreateTreeNode(); var xNode = CreateVariableTreeNode(variable, "x"); var m_orgNode = CreateConstantTreeNode("m_org", m_org); substractionNode.AddSubtree(xNode); substractionNode.AddSubtree(m_orgNode); // (x - m_org) / s_org var divisionNode = new Division().CreateTreeNode(); var s_orgNode = CreateConstantTreeNode("s_org", s_org); divisionNode.AddSubtree(substractionNode); divisionNode.AddSubtree(s_orgNode); // ((x - m_org) / s_org ) * s_tar var multiplicationNode = new Multiplication().CreateTreeNode(); var s_tarNode = CreateConstantTreeNode("s_tar", s_tar); multiplicationNode.AddSubtree(divisionNode); multiplicationNode.AddSubtree(s_tarNode); // ((x - m_org) / s_org ) * s_tar + m_tar var additionNode = new Addition().CreateTreeNode(); var m_tarNode = CreateConstantTreeNode("m_tar", m_tar); additionNode.AddSubtree(multiplicationNode); additionNode.AddSubtree(m_tarNode); return(additionNode); }
public static ISymbolicExpressionTree CreateTree(string[] variableNames, int[] lags, double[] coefficients, double @const = 0) { if (variableNames.Length == 0 || variableNames.Length != coefficients.Length || variableNames.Length != lags.Length) { throw new ArgumentException("The length of the variable names, lags, and coefficients vectors must match"); } ISymbolicExpressionTree tree = new SymbolicExpressionTree(new ProgramRootSymbol().CreateTreeNode()); ISymbolicExpressionTreeNode startNode = new StartSymbol().CreateTreeNode(); tree.Root.AddSubtree(startNode); ISymbolicExpressionTreeNode addition = new Addition().CreateTreeNode(); startNode.AddSubtree(addition); for (int i = 0; i < variableNames.Length; i++) { if (lags[i] == 0) { VariableTreeNode vNode = (VariableTreeNode) new Variable().CreateTreeNode(); vNode.VariableName = variableNames[i]; vNode.Weight = coefficients[i]; addition.AddSubtree(vNode); } else { LaggedVariableTreeNode vNode = (LaggedVariableTreeNode) new LaggedVariable().CreateTreeNode(); vNode.VariableName = variableNames[i]; vNode.Weight = coefficients[i]; vNode.Lag = lags[i]; addition.AddSubtree(vNode); } } if ([email protected](0.0)) { ConstantTreeNode cNode = (ConstantTreeNode) new Constant().CreateTreeNode(); cNode.Value = @const; addition.AddSubtree(cNode); } return(tree); }
// helper private ISymbolicExpressionTreeNode GenerateModelForLinearTransformation() { var linearTransformation = (LinearTransformation)transformation; var kValue = linearTransformation.Multiplier; var dValue = linearTransformation.Addend; // k * x var multiplicationNode = new Multiplication().CreateTreeNode(); var kNode = CreateConstantTreeNode("k", kValue); var xNode = CreateVariableTreeNode(column, "x"); multiplicationNode.AddSubtree(kNode); multiplicationNode.AddSubtree(xNode); // ( k * x ) + d var additionNode = new Addition().CreateTreeNode(); var dNode = CreateConstantTreeNode("d", dValue); additionNode.AddSubtree(multiplicationNode); additionNode.AddSubtree(dNode); return(additionNode); }
public static ISymbolicExpressionTree CreateTree(IEnumerable <KeyValuePair <string, IEnumerable <string> > > factors, double[] factorCoefficients, double @const = 0) { ISymbolicExpressionTree tree = new SymbolicExpressionTree(new ProgramRootSymbol().CreateTreeNode()); ISymbolicExpressionTreeNode startNode = new StartSymbol().CreateTreeNode(); tree.Root.AddSubtree(startNode); ISymbolicExpressionTreeNode addition = new Addition().CreateTreeNode(); startNode.AddSubtree(addition); int i = 0; foreach (var factor in factors) { var varName = factor.Key; foreach (var factorValue in factor.Value) { var node = (BinaryFactorVariableTreeNode) new BinaryFactorVariable().CreateTreeNode(); node.VariableValue = factorValue; node.VariableName = varName; node.Weight = factorCoefficients[i]; addition.AddSubtree(node); i++; } } if ([email protected](0.0)) { ConstantTreeNode cNode = (ConstantTreeNode) new Constant().CreateTreeNode(); cNode.Value = @const; addition.AddSubtree(cNode); } return(tree); }
private static ISymbolicRegressionSolution CreateSymbolicSolution(List<IRegressionModel> models, double nu, IRegressionProblemData problemData) { var symbModels = models.OfType<ISymbolicRegressionModel>(); var lowerLimit = symbModels.Min(m => m.LowerEstimationLimit); var upperLimit = symbModels.Max(m => m.UpperEstimationLimit); var interpreter = new SymbolicDataAnalysisExpressionTreeLinearInterpreter(); var progRootNode = new ProgramRootSymbol().CreateTreeNode(); var startNode = new StartSymbol().CreateTreeNode(); var addNode = new Addition().CreateTreeNode(); var mulNode = new Multiplication().CreateTreeNode(); var scaleNode = (ConstantTreeNode)new Constant().CreateTreeNode(); // all models are scaled using the same nu scaleNode.Value = nu; foreach (var m in symbModels) { var relevantPart = m.SymbolicExpressionTree.Root.GetSubtree(0).GetSubtree(0); // skip root and start addNode.AddSubtree((ISymbolicExpressionTreeNode)relevantPart.Clone()); } mulNode.AddSubtree(addNode); mulNode.AddSubtree(scaleNode); startNode.AddSubtree(mulNode); progRootNode.AddSubtree(startNode); var t = new SymbolicExpressionTree(progRootNode); var combinedModel = new SymbolicRegressionModel(problemData.TargetVariable, t, interpreter, lowerLimit, upperLimit); var sol = new SymbolicRegressionSolution(combinedModel, problemData); return sol; }