#region License Information /* HeuristicLab * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using System.Collections.Generic; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Problems.DataAnalysis; namespace HeuristicLab.Algorithms.DataAnalysis { [StorableClass] internal class ComponentReducedLinearModel : RegressionModel, IConfidenceRegressionModel { [Storable] private IConfidenceRegressionModel Model; [Storable] private PrincipleComponentTransformation Pca; [StorableConstructor] private ComponentReducedLinearModel(bool deserializing) : base(deserializing) { } private ComponentReducedLinearModel(ComponentReducedLinearModel original, Cloner cloner) : base(original, cloner) { Model = cloner.Clone(original.Model); Pca = cloner.Clone(original.Pca); } public ComponentReducedLinearModel(string targetVariable, IConfidenceRegressionModel model, PrincipleComponentTransformation pca) : base(targetVariable) { Model = model; Pca = pca; } public override IDeepCloneable Clone(Cloner cloner) { return new ComponentReducedLinearModel(this, cloner); } public override IEnumerable VariablesUsedForPrediction { get { return Model.VariablesUsedForPrediction; } } public override IEnumerable GetEstimatedValues(IDataset dataset, IEnumerable rows) { var data = ReduceDataset(dataset, rows.ToArray()); return Model.GetEstimatedValues(Pca.TransformDataset(data), Enumerable.Range(0, data.Rows)); } public override IRegressionSolution CreateRegressionSolution(IRegressionProblemData problemData) { return new ConfidenceRegressionSolution(this, problemData); } public IEnumerable GetEstimatedVariances(IDataset dataset, IEnumerable rows) { var data = ReduceDataset(dataset, rows.ToArray()); return Model.GetEstimatedVariances(Pca.TransformDataset(data), Enumerable.Range(0, data.Rows)); } private IDataset ReduceDataset(IDataset data, IReadOnlyList rows) { return new Dataset(data.DoubleVariables, data.DoubleVariables.Select(v => data.GetDoubleValues(v, rows).ToList())); } } }