Changeset 14887 for branches/RBFRegression/HeuristicLab.Algorithms.DataAnalysis/3.4/KernelRidgeRegression/KernelFunctions/KernelBase.cs
- Timestamp:
- 04/24/17 18:31:44 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/RBFRegression/HeuristicLab.Algorithms.DataAnalysis/3.4/KernelRidgeRegression/KernelFunctions/KernelBase.cs
r14872 r14887 21 21 22 22 using System; 23 using System.Collections;24 23 using System.Collections.Generic; 24 using System.Linq; 25 25 using HeuristicLab.Common; 26 26 using HeuristicLab.Core; 27 using HeuristicLab.Data;28 27 using HeuristicLab.Parameters; 29 28 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 30 29 31 namespace HeuristicLab.Algorithms.DataAnalysis {30 namespace HeuristicLab.Algorithms.DataAnalysis.KernelRidgeRegression { 32 31 [StorableClass] 33 public abstract class KernelBase : ParameterizedNamedItem, I CovarianceFunction{32 public abstract class KernelBase : ParameterizedNamedItem, IKernel { 34 33 35 34 #region Parameternames 36 35 private const string DistanceParameterName = "Distance"; 37 protected const string BetaParameterName = "Beta";38 36 #endregion 39 37 #region Parameterproperties … … 42 40 } 43 41 44 public IFixedValueParameter<DoubleValue> BetaParameter { 45 get { return Parameters[BetaParameterName] as FixedValueParameter<DoubleValue>; } 46 } 47 42 [Storable] 43 public double? Beta { get; set; } 48 44 #endregion 49 45 #region Properties 50 46 public IDistance Distance { 51 47 get { return DistanceParameter.Value; } 52 } 53 54 public double Beta { 55 get { return BetaParameter.Value.Value; } 48 set { DistanceParameter.Value = value; } 56 49 } 57 50 … … 64 57 65 58 protected KernelBase(KernelBase original, Cloner cloner) 66 : base(original, cloner) { } 59 : base(original, cloner) { 60 Beta = original.Beta; 61 } 67 62 68 63 protected KernelBase() { … … 78 73 79 74 public int GetNumberOfParameters(int numberOfVariables) { 80 return 1;75 return Beta.HasValue ? 0 : 1; 81 76 } 82 77 83 78 public void SetParameter(double[] p) { 84 if (p != null && p.Length == 1) Beta Parameter.Value.Value = p[0];79 if (p != null && p.Length == 1) Beta = new double?(p[0]); 85 80 } 86 81 87 82 public ParameterizedCovarianceFunction GetParameterizedCovarianceFunction(double[] p, int[] columnIndices) { 88 if (p == null || p.Length != 1) throw new ArgumentException("Illegal parametrization");83 if (p.Length != GetNumberOfParameters(columnIndices.Length)) throw new ArgumentException("Illegal parametrization"); 89 84 var myClone = (KernelBase)Clone(new Cloner()); 90 myClone. BetaParameter.Value.Value = p[0];85 myClone.SetParameter(p); 91 86 var cov = new ParameterizedCovarianceFunction { 92 87 Covariance = (x, i, j) => myClone.Get(GetNorm(x, x, i, j, columnIndices)), … … 102 97 var dist = Distance as IDistance<IEnumerable<double>>; 103 98 if (dist == null) throw new ArgumentException("The distance needs to apply to double vectors"); 104 var r1 = new IndexedEnumerable(x, i, columnIndices);105 var r2 = new IndexedEnumerable(xt, j, columnIndices);99 var r1 = columnIndices.Select(c => x[i, c]); 100 var r2 = columnIndices.Select(c => xt[j, c]); 106 101 return dist.Get(r1, r2); 107 }108 internal class IndexedEnumerable : IEnumerable<double> {109 private readonly double[,] data;110 private readonly int row;111 private readonly int[] columnIndices;112 113 public IndexedEnumerable(double[,] data, int row, int[] columnIndices) {114 this.data = data;115 this.row = row;116 this.columnIndices = columnIndices;117 }118 119 public IEnumerator<double> GetEnumerator() {120 return new IndexedEnumerator(data, row, columnIndices);121 }122 123 IEnumerator IEnumerable.GetEnumerator() {124 return new IndexedEnumerator(data, row, columnIndices);125 }126 }127 internal class IndexedEnumerator : IEnumerator<double> {128 private readonly IEnumerator<int> column;129 private readonly double[,] data;130 private readonly int row;131 132 public IndexedEnumerator(double[,] data, int row, int[] columnIndices) {133 this.data = data;134 this.row = row;135 column = ((IEnumerable<int>)columnIndices).GetEnumerator();136 }137 138 public double Current {139 get { return data[row, column.Current]; }140 }141 142 object IEnumerator.Current {143 get {144 return data[row, column.Current];145 }146 }147 148 public void Dispose() { }149 150 public bool MoveNext() {151 return column.MoveNext();152 }153 154 public void Reset() {155 column.Reset();156 }157 102 } 158 103 }
Note: See TracChangeset
for help on using the changeset viewer.