From 3a44ee7ddeb6ba473a00b16fafe7817831c006da Mon Sep 17 00:00:00 2001 From: Ilya Gyrdymov Date: Tue, 12 Feb 2019 01:12:17 +0200 Subject: [PATCH] changelog and pubspec --- CHANGELOG.md | 4 + lib/src/classifier/linear_classifier.dart | 7 +- lib/src/classifier/softmax_regressor.dart | 153 ---------------------- pubspec.yaml | 2 +- 4 files changed, 6 insertions(+), 160 deletions(-) delete mode 100644 lib/src/classifier/softmax_regressor.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index fece0103..d2b769bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 6.1.0 +- `LinkFunction` renamed to `ScoreToProbMapper` +- `ScoreToProbMapper` accepts vector and returns vector instead of a scalar + ## 6.0.6 - Pedantic package integration added - Some linter issues fixed diff --git a/lib/src/classifier/linear_classifier.dart b/lib/src/classifier/linear_classifier.dart index 59fe1488..f0813f58 100644 --- a/lib/src/classifier/linear_classifier.dart +++ b/lib/src/classifier/linear_classifier.dart @@ -2,7 +2,6 @@ import 'package:ml_algo/gradient_type.dart'; import 'package:ml_algo/learning_rate_type.dart'; import 'package:ml_algo/src/classifier/classifier.dart'; import 'package:ml_algo/src/classifier/logistic_regressor.dart'; -import 'package:ml_algo/src/classifier/softmax_regressor.dart'; import 'package:ml_algo/src/optimizer/optimizer_type.dart'; /// A factory for all the linear classifiers @@ -71,11 +70,7 @@ abstract class LinearClassifier implements Classifier { Type dtype, }) = LogisticRegressor; - /** - * Creates a softmax regression classifier - */ - factory LinearClassifier.softMaxRegressor() = SoftMaxRegressor; - + factory LinearClassifier.softMaxRegressor() => throw UnimplementedError(); factory LinearClassifier.SVM() => throw UnimplementedError(); factory LinearClassifier.naiveBayes() => throw UnimplementedError(); } diff --git a/lib/src/classifier/softmax_regressor.dart b/lib/src/classifier/softmax_regressor.dart deleted file mode 100644 index bf9058cc..00000000 --- a/lib/src/classifier/softmax_regressor.dart +++ /dev/null @@ -1,153 +0,0 @@ -import 'package:ml_algo/gradient_type.dart'; -import 'package:ml_algo/learning_rate_type.dart'; -import 'package:ml_algo/src/classifier/labels_processor/labels_processor.dart'; -import 'package:ml_algo/src/classifier/labels_processor/labels_processor_factory.dart'; -import 'package:ml_algo/src/classifier/labels_processor/labels_processor_factory_impl.dart'; -import 'package:ml_algo/src/classifier/linear_classifier.dart'; -import 'package:ml_algo/src/cost_function/cost_function_type.dart'; -import 'package:ml_algo/src/data_preprocessing/intercept_preprocessor/intercept_preprocessor.dart'; -import 'package:ml_algo/src/data_preprocessing/intercept_preprocessor/intercept_preprocessor_factory.dart'; -import 'package:ml_algo/src/data_preprocessing/intercept_preprocessor/intercept_preprocessor_factory_impl.dart'; -import 'package:ml_algo/src/default_parameter_values.dart'; -import 'package:ml_algo/src/metric/factory.dart'; -import 'package:ml_algo/src/metric/metric_type.dart'; -import 'package:ml_algo/src/optimizer/gradient/batch_size_calculator/batch_size_calculator.dart'; -import 'package:ml_algo/src/optimizer/gradient/batch_size_calculator/batch_size_calculator_impl.dart'; -import 'package:ml_algo/src/optimizer/initial_weights_generator/initial_weights_type.dart'; -import 'package:ml_algo/src/optimizer/optimizer.dart'; -import 'package:ml_algo/src/optimizer/optimizer_factory.dart'; -import 'package:ml_algo/src/optimizer/optimizer_factory_impl.dart'; -import 'package:ml_algo/src/optimizer/optimizer_type.dart'; -import 'package:ml_algo/src/score_to_prob_mapper/score_to_prob_mapper.dart'; -import 'package:ml_algo/src/score_to_prob_mapper/score_to_prob_mapper_factory.dart'; -import 'package:ml_algo/src/score_to_prob_mapper/score_to_prob_mapper_factory_impl.dart'; -import 'package:ml_algo/src/score_to_prob_mapper/score_to_prob_mapper_type.dart'; -import 'package:ml_linalg/matrix.dart'; -import 'package:ml_linalg/vector.dart'; - -class SoftMaxRegressor implements LinearClassifier { - final Type dtype; - final Optimizer optimizer; - final InterceptPreprocessor interceptPreprocessor; - final LabelsProcessor labelsProcessor; - final ScoreToProbMapper scoreToProbMapper; - - SoftMaxRegressor({ - // public arguments - int iterationsLimit = DefaultParameterValues.iterationsLimit, - double initialLearningRate = DefaultParameterValues.initialLearningRate, - double minWeightsUpdate = DefaultParameterValues.minWeightsUpdate, - double lambda, - int randomSeed, - int batchSize = 1, - bool fitIntercept = false, - double interceptScale = 1.0, - OptimizerType optimizer = OptimizerType.gradientDescent, - GradientType gradientType = GradientType.stochastic, - LearningRateType learningRateType = LearningRateType.constant, - InitialWeightsType initialWeightsType = InitialWeightsType.zeroes, - ScoreToProbMapperType scoreToProbMapperType = ScoreToProbMapperType.logit, - this.dtype = DefaultParameterValues.dtype, - - // private arguments - LabelsProcessorFactory labelsProcessorFactory = - const LabelsProcessorFactoryImpl(), - InterceptPreprocessorFactory interceptPreprocessorFactory = - const InterceptPreprocessorFactoryImpl(), - ScoreToProbMapperFactory scoreToProbMapperFactory = - const ScoreToProbMapperFactoryImpl(), - OptimizerFactory optimizerFactory = const OptimizerFactoryImpl(), - BatchSizeCalculator batchSizeCalculator = const BatchSizeCalculatorImpl(), - }) : labelsProcessor = labelsProcessorFactory.create(dtype), - interceptPreprocessor = interceptPreprocessorFactory.create(dtype, - scale: fitIntercept ? interceptScale : 0.0), - scoreToProbMapper = - scoreToProbMapperFactory.fromType(scoreToProbMapperType, dtype), - optimizer = optimizerFactory.fromType( - optimizer, - dtype: dtype, - costFunctionType: CostFunctionType.logLikelihood, - scoreToProbMapperType: scoreToProbMapperType, - learningRateType: learningRateType, - initialWeightsType: initialWeightsType, - initialLearningRate: initialLearningRate, - minCoefficientsUpdate: minWeightsUpdate, - iterationLimit: iterationsLimit, - lambda: lambda, - batchSize: gradientType != null - ? batchSizeCalculator.calculate(gradientType, batchSize) - : null, - randomSeed: randomSeed, - ); - - @override - MLVector get weights => null; - - @override - Map get weightsByClasses => _weightsByClasses; - Map _weightsByClasses; - - @override - List get classLabels => _classLabels; - List _classLabels; - - @override - void fit(MLMatrix features, MLVector labels, - {MLVector initialWeights, bool isDataNormalized = false}) { - _classLabels = labels.unique().toList(); - final labelsAsList = _classLabels.toList(); - final processedFeatures = interceptPreprocessor.addIntercept(features); - _weightsByClasses = Map.fromIterable( - labelsAsList, - key: (dynamic label) => label as double, - value: (dynamic label) => _fitBinaryClassifier(processedFeatures, labels, - label as double, initialWeights, isDataNormalized), - ); - } - - @override - double test(MLMatrix features, MLVector origLabels, MetricType metricType) { - final evaluator = MetricFactory.createByType(metricType); - final prediction = predictClasses(features); - return evaluator.getError(prediction, origLabels); - } - - @override - MLMatrix predictProbabilities(MLMatrix features) { - final processedFeatures = interceptPreprocessor.addIntercept(features); - return _predictProbabilities(processedFeatures); - } - - @override - MLVector predictClasses(MLMatrix features) { - final processedFeatures = interceptPreprocessor.addIntercept(features); - final distributions = _predictProbabilities(processedFeatures); - final classes = List(processedFeatures.rowsNum); - for (int i = 0; i < distributions.rowsNum; i++) { - final probabilities = distributions.getRow(i); - classes[i] = probabilities.toList().indexOf(probabilities.max()) * 1.0; - } - return MLVector.from(classes, dtype: dtype); - } - - MLMatrix _predictProbabilities(MLMatrix processedFeatures) { - final numOfObservations = _weightsByClasses.length; - final distributions = List(numOfObservations); - int i = 0; - _weightsByClasses.forEach((double label, MLVector weights) { - final scores = (processedFeatures * weights).toVector(); - distributions[i++] = scoreToProbMapper.linkScoresToProbs(scores); - }); - return MLMatrix.columns(distributions, dtype: dtype); - } - - MLVector _fitBinaryClassifier(MLMatrix features, MLVector labels, - double targetLabel, MLVector initialWeights, bool arePointsNormalized) { - final binaryLabels = - labelsProcessor.makeLabelsOneVsAll(labels, targetLabel); - return optimizer.findExtrema(features, binaryLabels, - initialWeights: initialWeights, - arePointsNormalized: arePointsNormalized, - isMinimizingObjective: false); - } -} diff --git a/pubspec.yaml b/pubspec.yaml index 5009bda7..f80dd599 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: ml_algo description: Machine learning algorithms written with native dart (without bindings to any popular ML libraries, just pure Dart implementation) -version: 6.0.6 +version: 6.1.0 author: Ilia Gyrdymov homepage: https://github.com/gyrdym/ml_algo