Changeset 3531 for trunk/sources
- Timestamp:
- 04/26/10 11:05:28 (15 years ago)
- Location:
- trunk/sources
- Files:
-
- 3 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/HeuristicLab.Problems.DataAnalysis.Regression-3.3.csproj
r3442 r3531 103 103 </ItemGroup> 104 104 <ItemGroup> 105 <ProjectReference Include="..\..\HeuristicLab.Analysis\3.3\HeuristicLab.Analysis-3.3.csproj"> 106 <Project>{887425B4-4348-49ED-A457-B7D2C26DDBF9}</Project> 107 <Name>HeuristicLab.Analysis-3.3</Name> 108 </ProjectReference> 105 109 <ProjectReference Include="..\..\HeuristicLab.Collections\3.3\HeuristicLab.Collections-3.3.csproj"> 106 110 <Project>{958B43BC-CC5C-4FA2-8628-2B3B01D890B6}</Project> -
trunk/sources/HeuristicLab.Problems.DataAnalysis.Regression/3.3/Symbolic/BestValidationSymbolicRegressionSolutionVisualizer.cs
r3513 r3531 31 31 using HeuristicLab.Problems.DataAnalysis.Evaluators; 32 32 using HeuristicLab.Problems.DataAnalysis.Symbolic; 33 using System.Collections.Generic; 34 using HeuristicLab.Analysis; 33 35 34 36 namespace HeuristicLab.Problems.DataAnalysis.Regression.Symbolic { … … 49 51 private const string QualityParameterName = "Quality"; 50 52 private const string ResultsParameterName = "Results"; 53 private const string VariableFrequenciesParameterName = "VariableFrequencies"; 51 54 52 55 #region parameter properties … … 87 90 get { return (ILookupParameter<ResultCollection>)Parameters[ResultsParameterName]; } 88 91 } 92 public ILookupParameter<DataTable> VariableFrequenciesParameter { 93 get { return (ILookupParameter<DataTable>)Parameters[VariableFrequenciesParameterName]; } 94 } 95 89 96 #endregion 90 97 … … 104 111 public IntValue ValidationSamplesEnd { 105 112 get { return ValidationSamplesEndParameter.ActualValue; } 113 } 114 public DataTable VariableFrequencies { 115 get { return VariableFrequenciesParameter.ActualValue; } 116 set { VariableFrequenciesParameter.ActualValue = value; } 106 117 } 107 118 #endregion … … 118 129 Parameters.Add(new ValueLookupParameter<IntValue>(ValidationSamplesEndParameterName, "The end index of the validation partition (part of the training partition).")); 119 130 Parameters.Add(new LookupParameter<SymbolicRegressionSolution>(BestValidationSolutionParameterName, "The best symbolic expression tree based on the validation data for the symbolic regression problem.")); 131 Parameters.Add(new LookupParameter<DataTable>(VariableFrequenciesParameterName, "The relative variable reference frequencies aggregated over the whole population.")); 120 132 Parameters.Add(new LookupParameter<ResultCollection>(ResultsParameterName, "The result collection of the algorithm.")); 121 133 } … … 124 136 ItemArray<SymbolicExpressionTree> expressions = SymbolicExpressionTreeParameter.ActualValue; 125 137 DataAnalysisProblemData problemData = DataAnalysisProblemDataParameter.ActualValue; 126 138 #region update variable frequencies 139 var inputVariables = problemData.InputVariables.Select(x => x.Value); 140 if (VariableFrequencies == null) { 141 VariableFrequencies = new DataTable("Variable Frequencies", "Relative frequency of variable references aggregated over the whole population."); 142 AddResult("VariableFrequencies", VariableFrequencies); 143 // add a data row for each input variable 144 foreach (var inputVariable in inputVariables) 145 VariableFrequencies.Rows.Add(new DataRow(inputVariable)); 146 } 147 foreach (var pair in VariableFrequencyAnalyser.CalculateVariableFrequencies(expressions, inputVariables)) { 148 VariableFrequencies.Rows[pair.Key].Values.Add(pair.Value); 149 } 150 #endregion 151 152 #region determination of validation-best solution 127 153 int validationSamplesStart = ValidationSamplesStart.Value; 128 154 int validationSamplesEnd = ValidationSamplesEnd.Value; … … 142 168 143 169 SymbolicRegressionSolution bestOfRunSolution = BestValidationSolutionParameter.ActualValue; 170 #endregion 171 #region update of validation-best solution 144 172 if (bestOfRunSolution == null) { 145 173 // no best of run solution yet -> make a solution from the currentBestExpression … … 153 181 } 154 182 } 155 156 183 #endregion 157 184 return base.Apply(); 158 185 } -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/HeuristicLab.Problems.DataAnalysis-3.3.csproj
r3462 r3531 112 112 <Compile Include="Symbolic\Symbols\Variable.cs" /> 113 113 <Compile Include="Symbolic\Symbols\VariableTreeNode.cs" /> 114 <Compile Include="Symbolic\VariableFrequencyAnalyser.cs" /> 114 115 </ItemGroup> 115 116 <ItemGroup> -
trunk/sources/HeuristicLab.Problems.DataAnalysis/3.3/Symbolic/VariableFrequencyAnalyser.cs
r3529 r3531 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-20 08Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 24 24 using HeuristicLab.Core; 25 25 using HeuristicLab.Data; 26 using HeuristicLab.GP.Interfaces;27 26 using System; 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 28 using HeuristicLab.Operators; 29 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 30 using HeuristicLab.Parameters; 31 using HeuristicLab.Problems.DataAnalysis.Symbolic.Symbols; 28 32 29 namespace HeuristicLab.GP.StructureIdentification { 30 /// <summary> 31 /// Creates accumulated frequencies of variable-symbols over the whole population. 32 /// </summary> 33 public class VariableFrequencyAnalyser : OperatorBase { 34 public override string Description { 35 get { 36 return @"Creates accumulated frequencies of variable-symbols over the whole population."; 37 } 33 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { 34 [Item("VariableFrequencyAnalyser", "Calculates the accumulated frequencies of variable-symbols over the whole population.")] 35 [StorableClass] 36 public abstract class VariableFrequencyAnalyser : SingleSuccessorOperator { 37 private const string SymbolicExpressionTreeParameterName = "SymbolicExpressionTree"; 38 private const string DataAnalysisProblemDataParameterName = "DataAnalysisProblemData"; 39 private const string VariableFrequenciesParameterName = "VariableFrequencies"; 40 41 #region parameter properties 42 public ILookupParameter<DataAnalysisProblemData> DataAnalysisProblemDataParameter { 43 get { return (ILookupParameter<DataAnalysisProblemData>)Parameters[DataAnalysisProblemDataParameterName]; } 38 44 } 45 public ILookupParameter<ItemArray<SymbolicExpressionTree>> SymbolicExpressionTreeParameter { 46 get { return (ILookupParameter<ItemArray<SymbolicExpressionTree>>)Parameters[SymbolicExpressionTreeParameterName]; } 47 } 48 public ILookupParameter<DoubleMatrix> VariableFrequenciesParameter { 49 get { return (ILookupParameter<DoubleMatrix>)Parameters[VariableFrequenciesParameterName]; } 50 } 51 #endregion 52 #region properties 53 public DataAnalysisProblemData DataAnalysisProblemData { 54 get { return DataAnalysisProblemDataParameter.ActualValue; } 55 } 56 public ItemArray<SymbolicExpressionTree> SymbolicExpressionTrees { 57 get { return SymbolicExpressionTreeParameter.ActualValue; } 58 } 59 public DoubleMatrix VariableFrequencies { 60 get { return VariableFrequenciesParameter.ActualValue; } 61 set { VariableFrequenciesParameter.ActualValue = value; } 62 } 63 #endregion 39 64 public VariableFrequencyAnalyser() 40 65 : base() { 41 AddVariableInfo(new VariableInfo("InputVariables", "The input variables", typeof(ItemList), VariableKind.In));42 AddVariableInfo(new VariableInfo("FunctionTree", "The tree to analyse", typeof(IGeneticProgrammingModel), VariableKind.In));43 AddVariableInfo(new VariableInfo("VariableFrequency", "The accumulated variable-frequencies over the whole population.", typeof(ItemList<ItemList>), VariableKind.New | VariableKind.Out));66 Parameters.Add(new SubScopesLookupParameter<SymbolicExpressionTree>(SymbolicExpressionTreeParameterName, "The symbolic expression trees that should be analyzed.")); 67 Parameters.Add(new LookupParameter<DataAnalysisProblemData>(DataAnalysisProblemDataParameterName, "The problem data on which the for which the symbolic expression tree is a solution.")); 68 Parameters.Add(new LookupParameter<DoubleMatrix>(VariableFrequenciesParameterName, "The relative variable reference frequencies aggregated over the whole population.")); 44 69 } 45 70 46 public override IOperation Apply(IScope scope) { 47 ItemList<ItemList> frequenciesList = GetVariableValue<ItemList<ItemList>>("VariableFrequency", scope, false, false); 48 ItemList inputVariables = GetVariableValue<ItemList>("InputVariables", scope, true); 49 if (frequenciesList == null) { 50 frequenciesList = new ItemList<ItemList>(); 51 // first line should contain a list of variables 52 ItemList varList = new ItemList(); 53 foreach (var inputVariable in inputVariables) { 54 varList.Add(inputVariable); 55 } 56 frequenciesList.Add(varList); 57 IVariableInfo info = GetVariableInfo("VariableFrequency"); 58 if (info.Local) 59 AddVariable(new HeuristicLab.Core.Variable(info.ActualName, frequenciesList)); 60 else 61 scope.AddVariable(new HeuristicLab.Core.Variable(scope.TranslateName(info.FormalName), frequenciesList)); 71 public override IOperation Apply() { 72 var inputVariables = DataAnalysisProblemData.InputVariables.Select(x => x.Value); 73 if (VariableFrequencies == null) { 74 VariableFrequencies = new DoubleMatrix(0, 1, inputVariables); 62 75 } 63 double[] frequencySum = new double[inputVariables.Count()]; 64 int variableNodesSum = 0; 65 foreach (var subScope in scope.SubScopes) { 66 IGeneticProgrammingModel gpModel = GetVariableValue<IGeneticProgrammingModel>("FunctionTree", subScope, false); 67 var subScopeFrequencies = GetFrequencies(gpModel.FunctionTree, inputVariables); 68 if (subScopeFrequencies.Count() != frequencySum.Length) throw new InvalidProgramException(); 69 int i = 0; 70 foreach (var freq in subScopeFrequencies) { 71 frequencySum[i++] += freq; 72 } 73 variableNodesSum += CountVariableNodes(gpModel.FunctionTree); 76 ((IStringConvertibleMatrix)VariableFrequencies).Rows = VariableFrequencies.Rows + 1; 77 int lastRowIndex = VariableFrequencies.Rows - 1; 78 var columnNames = VariableFrequencies.ColumnNames.ToList(); 79 foreach (var pair in CalculateVariableFrequencies(SymbolicExpressionTrees, inputVariables)) { 80 int columnIndex = columnNames.IndexOf(pair.Key); 81 VariableFrequencies[lastRowIndex, columnIndex] = pair.Value; 74 82 } 75 ItemList freqList = new ItemList();76 for (int i = 0; i < frequencySum.Length; i++) {77 freqList.Add(new DoubleData(frequencySum[i] / variableNodesSum));78 }79 frequenciesList.Add(freqList);80 83 return null; 81 84 } 82 85 83 private int CountVariableNodes(IFunctionTree tree) { 84 return (from x in FunctionTreeIterator.IteratePostfix(tree) 85 where x is VariableFunctionTree 86 select 1).Sum(); 86 public static IEnumerable<KeyValuePair<string, double>> CalculateVariableFrequencies(IEnumerable<SymbolicExpressionTree> trees, IEnumerable<string> inputVariables) { 87 int totalVariableReferences = 0; 88 Dictionary<string, double> variableReferencesSum = new Dictionary<string, double>(); 89 foreach (var inputVariable in inputVariables) 90 variableReferencesSum[inputVariable] = 0.0; 91 foreach (var tree in trees) { 92 var variableReferences = GetVariableReferenceCount(tree, inputVariables); 93 foreach (var pair in variableReferences) { 94 variableReferencesSum[pair.Key] += pair.Value; 95 } 96 totalVariableReferences += GetTotalVariableReferencesCount(tree); 97 } 98 foreach (string inputVariable in inputVariables) { 99 double relFreq = variableReferencesSum[inputVariable] / (double)totalVariableReferences; 100 yield return new KeyValuePair<string, double>(inputVariable, relFreq); 101 } 87 102 } 88 103 89 private static IEnumerable<double> GetFrequencies(IFunctionTree tree, ItemList inputVariables) { 90 var groupedFuns = (from node in FunctionTreeIterator.IteratePostfix(tree) 91 let varNode = node as VariableFunctionTree 92 where varNode != null 93 select varNode.VariableName).GroupBy(x => x); 104 private static int GetTotalVariableReferencesCount(SymbolicExpressionTree tree) { 105 return tree.IterateNodesPrefix().OfType<VariableTreeNode>().Count(); 106 } 94 107 95 foreach (var inputVariable in inputVariables.Cast<StringData>()) { 108 private static IEnumerable<KeyValuePair<string, int>> GetVariableReferenceCount(SymbolicExpressionTree tree, IEnumerable<string> inputVariables) { 109 var groupedFuns = (from node in tree.IterateNodesPrefix().OfType<VariableTreeNode>() 110 select node.VariableName).GroupBy(x => x); 111 112 foreach (var inputVariable in inputVariables) { 96 113 var matchingFuns = from g in groupedFuns 97 where g.Key == inputVariable .Data114 where g.Key == inputVariable 98 115 select g.Count(); 99 if (matchingFuns.Count() == 0) yield return 0.0;116 if (matchingFuns.Count() == 0) yield return new KeyValuePair<string, int>(inputVariable, 0); 100 117 else { 101 yield return matchingFuns.Single(); // / (double)gpModel.Size;118 yield return new KeyValuePair<string, int>(inputVariable, matchingFuns.Single()); 102 119 } 103 120 }
Note: See TracChangeset
for help on using the changeset viewer.