@@ -4,10 +4,12 @@ public class NormalOptimizer<T> : IOptimizationAlgorithm<T>
4
4
{
5
5
private readonly Random _random = new ( ) ;
6
6
private readonly INumericOperations < T > _numOps ;
7
+ private readonly OptimizationAlgorithmOptions _optimizationOptions ;
7
8
8
- public NormalOptimizer ( INumericOperations < T > ? numericOperations = null )
9
+ public NormalOptimizer ( OptimizationAlgorithmOptions ? optimizationOptions = null )
9
10
{
10
- _numOps = numericOperations ?? MathHelper . GetNumericOperations < T > ( ) ;
11
+ _numOps = MathHelper . GetNumericOperations < T > ( ) ;
12
+ _optimizationOptions = optimizationOptions ?? new OptimizationAlgorithmOptions ( ) ;
11
13
}
12
14
13
15
public OptimizationResult < T > Optimize (
@@ -18,7 +20,6 @@ public OptimizationResult<T> Optimize(
18
20
Matrix < T > XTest ,
19
21
Vector < T > yTest ,
20
22
PredictionModelOptions modelOptions ,
21
- OptimizationAlgorithmOptions optimizationOptions ,
22
23
IRegression < T > regressionMethod ,
23
24
IRegularization < T > regularization ,
24
25
INormalizer < T > normalizer ,
@@ -28,7 +29,7 @@ public OptimizationResult<T> Optimize(
28
29
{
29
30
var bestSolution = new Vector < T > ( XTrain . Columns , _numOps ) ;
30
31
var bestIntercept = _numOps . Zero ;
31
- T bestFitness = optimizationOptions . MaximizeFitness ? _numOps . MinValue : _numOps . MaxValue ;
32
+ T bestFitness = _optimizationOptions . MaximizeFitness ? _numOps . MinValue : _numOps . MaxValue ;
32
33
var fitnessHistory = new List < T > ( ) ;
33
34
var iterationHistory = new List < OptimizationIterationInfo < T > > ( ) ;
34
35
var bestSelectedFeatures = new List < Vector < T > > ( ) ;
@@ -52,7 +53,7 @@ public OptimizationResult<T> Optimize(
52
53
PredictionStats < T > ? bestValidationPredictionStats = null ;
53
54
PredictionStats < T > ? bestTestPredictionStats = null ;
54
55
55
- for ( int iteration = 0 ; iteration < optimizationOptions . MaxIterations ; iteration ++ )
56
+ for ( int iteration = 0 ; iteration < _optimizationOptions . MaxIterations ; iteration ++ )
56
57
{
57
58
// Randomly select features
58
59
var selectedFeatures = RandomlySelectFeatures ( XTrain . Columns , modelOptions . MinimumFeatures , modelOptions . MaximumFeatures ) ;
@@ -87,9 +88,9 @@ public OptimizationResult<T> Optimize(
87
88
var testActualBasicStats = new BasicStats < T > ( yTest ) ;
88
89
var testPredictedBasicStats = new BasicStats < T > ( testPredictions ) ;
89
90
90
- var trainingPredictionStats = new PredictionStats < T > ( yTrain , trainingPredictions , featureCount , _numOps . FromDouble ( optimizationOptions . ConfidenceLevel ) , _numOps ) ;
91
- var validationPredictionStats = new PredictionStats < T > ( yVal , validationPredictions , featureCount , _numOps . FromDouble ( optimizationOptions . ConfidenceLevel ) , _numOps ) ;
92
- var testPredictionStats = new PredictionStats < T > ( yTest , testPredictions , featureCount , _numOps . FromDouble ( optimizationOptions . ConfidenceLevel ) , _numOps ) ;
91
+ var trainingPredictionStats = new PredictionStats < T > ( yTrain , trainingPredictions , featureCount , _numOps . FromDouble ( _optimizationOptions . ConfidenceLevel ) , _numOps ) ;
92
+ var validationPredictionStats = new PredictionStats < T > ( yVal , validationPredictions , featureCount , _numOps . FromDouble ( _optimizationOptions . ConfidenceLevel ) , _numOps ) ;
93
+ var testPredictionStats = new PredictionStats < T > ( yTest , testPredictions , featureCount , _numOps . FromDouble ( _optimizationOptions . ConfidenceLevel ) , _numOps ) ;
93
94
94
95
// Detect fit type
95
96
var fitDetectionResult = fitDetector . DetectFit (
@@ -141,7 +142,7 @@ public OptimizationResult<T> Optimize(
141
142
} ) ;
142
143
143
144
// Check for early stopping
144
- if ( optimizationOptions . UseEarlyStopping && ShouldEarlyStop ( iterationHistory , optimizationOptions , fitnessCalculator ) )
145
+ if ( _optimizationOptions . UseEarlyStopping && ShouldEarlyStop ( iterationHistory , fitnessCalculator ) )
145
146
{
146
147
break ;
147
148
}
@@ -194,14 +195,14 @@ public OptimizationResult<T> Optimize(
194
195
} ;
195
196
}
196
197
197
- public bool ShouldEarlyStop ( List < OptimizationIterationInfo < T > > iterationHistory , OptimizationAlgorithmOptions options , IFitnessCalculator < T > fitnessCalculator )
198
+ public bool ShouldEarlyStop ( List < OptimizationIterationInfo < T > > iterationHistory , IFitnessCalculator < T > fitnessCalculator )
198
199
{
199
- if ( iterationHistory . Count < options . EarlyStoppingPatience )
200
+ if ( iterationHistory . Count < _optimizationOptions . EarlyStoppingPatience )
200
201
{
201
202
return false ;
202
203
}
203
204
204
- var recentIterations = iterationHistory . Skip ( Math . Max ( 0 , iterationHistory . Count - options . EarlyStoppingPatience ) ) . ToList ( ) ;
205
+ var recentIterations = iterationHistory . Skip ( Math . Max ( 0 , iterationHistory . Count - _optimizationOptions . EarlyStoppingPatience ) ) . ToList ( ) ;
205
206
206
207
// Find the best fitness score
207
208
T bestFitness = iterationHistory [ 0 ] . Fitness ;
@@ -238,7 +239,7 @@ public bool ShouldEarlyStop(List<OptimizationIterationInfo<T>> iterationHistory,
238
239
}
239
240
}
240
241
241
- return noImprovement || consecutiveBadFits >= options . BadFitPatience ;
242
+ return noImprovement || consecutiveBadFits >= _optimizationOptions . BadFitPatience ;
242
243
}
243
244
244
245
private List < int > RandomlySelectFeatures ( int totalFeatures , int minFeatures , int maxFeatures )
0 commit comments