nlptoolkit-classification 1.0.8 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Attribute/Attribute.js +6 -16
- package/dist/Attribute/Attribute.js.map +1 -1
- package/dist/Attribute/AttributeType.js +22 -32
- package/dist/Attribute/AttributeType.js.map +1 -1
- package/dist/Attribute/BinaryAttribute.js +14 -24
- package/dist/Attribute/BinaryAttribute.js.map +1 -1
- package/dist/Attribute/ContinuousAttribute.js +46 -55
- package/dist/Attribute/ContinuousAttribute.js.map +1 -1
- package/dist/Attribute/DiscreteAttribute.js +38 -48
- package/dist/Attribute/DiscreteAttribute.js.map +1 -1
- package/dist/Attribute/DiscreteIndexedAttribute.js +47 -55
- package/dist/Attribute/DiscreteIndexedAttribute.js.map +1 -1
- package/dist/DataSet/DataDefinition.js +115 -123
- package/dist/DataSet/DataDefinition.js.map +1 -1
- package/dist/DataSet/DataSet.js +268 -245
- package/dist/DataSet/DataSet.js.map +1 -1
- package/dist/DistanceMetric/DistanceMetric.js +2 -12
- package/dist/DistanceMetric/EuclidianDistance.js +27 -37
- package/dist/DistanceMetric/EuclidianDistance.js.map +1 -1
- package/dist/DistanceMetric/MahalanobisDistance.js +27 -36
- package/dist/DistanceMetric/MahalanobisDistance.js.map +1 -1
- package/dist/Experiment/BootstrapRun.js +31 -40
- package/dist/Experiment/BootstrapRun.js.map +1 -1
- package/dist/Experiment/Experiment.js +46 -53
- package/dist/Experiment/Experiment.js.map +1 -1
- package/dist/Experiment/KFoldRun.js +45 -54
- package/dist/Experiment/KFoldRun.js.map +1 -1
- package/dist/Experiment/KFoldRunSeparateTest.js +48 -58
- package/dist/Experiment/KFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/MultipleRun.js +2 -12
- package/dist/Experiment/MxKFoldRun.js +31 -40
- package/dist/Experiment/MxKFoldRun.js.map +1 -1
- package/dist/Experiment/MxKFoldRunSeparateTest.js +35 -44
- package/dist/Experiment/MxKFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/SingleRun.js +2 -12
- package/dist/Experiment/SingleRunWithK.js +39 -48
- package/dist/Experiment/SingleRunWithK.js.map +1 -1
- package/dist/Experiment/StratifiedKFoldRun.js +26 -36
- package/dist/Experiment/StratifiedKFoldRun.js.map +1 -1
- package/dist/Experiment/StratifiedKFoldRunSeparateTest.js +30 -40
- package/dist/Experiment/StratifiedKFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/StratifiedMxKFoldRun.js +29 -39
- package/dist/Experiment/StratifiedMxKFoldRun.js.map +1 -1
- package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.js +34 -43
- package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.js.map +1 -1
- package/dist/Experiment/StratifiedSingleRunWithK.js +27 -36
- package/dist/Experiment/StratifiedSingleRunWithK.js.map +1 -1
- package/dist/FeatureSelection/BackwardSelection.js +26 -36
- package/dist/FeatureSelection/BackwardSelection.js.map +1 -1
- package/dist/FeatureSelection/FeatureSubSet.js +72 -82
- package/dist/FeatureSelection/FeatureSubSet.js.map +1 -1
- package/dist/FeatureSelection/FloatingSelection.js +25 -35
- package/dist/FeatureSelection/FloatingSelection.js.map +1 -1
- package/dist/FeatureSelection/ForwardSelection.js +25 -35
- package/dist/FeatureSelection/ForwardSelection.js.map +1 -1
- package/dist/FeatureSelection/SubSetSelection.js +69 -78
- package/dist/FeatureSelection/SubSetSelection.js.map +1 -1
- package/dist/Filter/DiscreteToContinuous.js +50 -60
- package/dist/Filter/DiscreteToContinuous.js.map +1 -1
- package/dist/Filter/DiscreteToIndexed.js +40 -50
- package/dist/Filter/DiscreteToIndexed.js.map +1 -1
- package/dist/Filter/FeatureFilter.js +23 -32
- package/dist/Filter/FeatureFilter.js.map +1 -1
- package/dist/Filter/LaryFilter.js +46 -55
- package/dist/Filter/LaryFilter.js.map +1 -1
- package/dist/Filter/LaryToBinary.js +48 -58
- package/dist/Filter/LaryToBinary.js.map +1 -1
- package/dist/Filter/Normalize.js +33 -41
- package/dist/Filter/Normalize.js.map +1 -1
- package/dist/Filter/Pca.js +86 -96
- package/dist/Filter/Pca.js.map +1 -1
- package/dist/Filter/TrainedFeatureFilter.js +14 -24
- package/dist/Filter/TrainedFeatureFilter.js.map +1 -1
- package/dist/Instance/CompositeInstance.js +46 -56
- package/dist/Instance/CompositeInstance.js.map +1 -1
- package/dist/Instance/Instance.js +145 -154
- package/dist/Instance/Instance.js.map +1 -1
- package/dist/InstanceList/InstanceList.js +466 -443
- package/dist/InstanceList/InstanceList.js.map +1 -1
- package/dist/InstanceList/InstanceListOfSameClass.js +23 -32
- package/dist/InstanceList/InstanceListOfSameClass.js.map +1 -1
- package/dist/InstanceList/Partition.js +167 -177
- package/dist/InstanceList/Partition.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionCondition.js +71 -80
- package/dist/Model/DecisionTree/DecisionCondition.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionNode.js +302 -311
- package/dist/Model/DecisionTree/DecisionNode.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionStump.js +22 -32
- package/dist/Model/DecisionTree/DecisionStump.js.map +1 -1
- package/dist/Model/DecisionTree/DecisionTree.js +89 -98
- package/dist/Model/DecisionTree/DecisionTree.js.map +1 -1
- package/dist/Model/DummyModel.js +64 -73
- package/dist/Model/DummyModel.js.map +1 -1
- package/dist/Model/Ensemble/BaggingModel.js +34 -44
- package/dist/Model/Ensemble/BaggingModel.js.map +1 -1
- package/dist/Model/Ensemble/RandomForestModel.js +31 -41
- package/dist/Model/Ensemble/RandomForestModel.js.map +1 -1
- package/dist/Model/Ensemble/TreeEnsembleModel.js +55 -64
- package/dist/Model/Ensemble/TreeEnsembleModel.js.map +1 -1
- package/dist/Model/Model.js +130 -140
- package/dist/Model/Model.js.map +1 -1
- package/dist/Model/NeuralNetwork/DeepNetworkModel.js +162 -169
- package/dist/Model/NeuralNetwork/DeepNetworkModel.js.map +1 -1
- package/dist/Model/NeuralNetwork/LinearPerceptronModel.js +69 -78
- package/dist/Model/NeuralNetwork/LinearPerceptronModel.js.map +1 -1
- package/dist/Model/NeuralNetwork/MultiLayerPerceptronModel.js +112 -120
- package/dist/Model/NeuralNetwork/MultiLayerPerceptronModel.js.map +1 -1
- package/dist/Model/NeuralNetwork/NeuralNetworkModel.js +197 -201
- package/dist/Model/NeuralNetwork/NeuralNetworkModel.js.map +1 -1
- package/dist/Model/NonParametric/KnnInstance.js +21 -29
- package/dist/Model/NonParametric/KnnInstance.js.map +1 -1
- package/dist/Model/NonParametric/KnnModel.js +101 -108
- package/dist/Model/NonParametric/KnnModel.js.map +1 -1
- package/dist/Model/Parametric/GaussianModel.js +82 -91
- package/dist/Model/Parametric/GaussianModel.js.map +1 -1
- package/dist/Model/Parametric/KMeansModel.js +59 -67
- package/dist/Model/Parametric/KMeansModel.js.map +1 -1
- package/dist/Model/Parametric/LdaModel.js +83 -91
- package/dist/Model/Parametric/LdaModel.js.map +1 -1
- package/dist/Model/Parametric/NaiveBayesModel.js +119 -132
- package/dist/Model/Parametric/NaiveBayesModel.js.map +1 -1
- package/dist/Model/Parametric/QdaModel.js +70 -79
- package/dist/Model/Parametric/QdaModel.js.map +1 -1
- package/dist/Model/RandomModel.js +85 -92
- package/dist/Model/RandomModel.js.map +1 -1
- package/dist/Model/ValidatedModel.js +21 -31
- package/dist/Model/ValidatedModel.js.map +1 -1
- package/dist/Parameter/ActivationFunction.js +9 -19
- package/dist/Parameter/ActivationFunction.js.map +1 -1
- package/dist/Parameter/BaggingParameter.js +24 -33
- package/dist/Parameter/BaggingParameter.js.map +1 -1
- package/dist/Parameter/C45Parameter.js +34 -42
- package/dist/Parameter/C45Parameter.js.map +1 -1
- package/dist/Parameter/DeepNetworkParameter.js +48 -56
- package/dist/Parameter/DeepNetworkParameter.js.map +1 -1
- package/dist/Parameter/KMeansParameter.js +29 -38
- package/dist/Parameter/KMeansParameter.js.map +1 -1
- package/dist/Parameter/KnnParameter.js +25 -34
- package/dist/Parameter/KnnParameter.js.map +1 -1
- package/dist/Parameter/LinearPerceptronParameter.js +56 -62
- package/dist/Parameter/LinearPerceptronParameter.js.map +1 -1
- package/dist/Parameter/MultiLayerPerceptronParameter.js +38 -46
- package/dist/Parameter/MultiLayerPerceptronParameter.js.map +1 -1
- package/dist/Parameter/Parameter.js +21 -30
- package/dist/Parameter/Parameter.js.map +1 -1
- package/dist/Parameter/RandomForestParameter.js +25 -34
- package/dist/Parameter/RandomForestParameter.js.map +1 -1
- package/dist/Performance/ClassificationPerformance.js +24 -33
- package/dist/Performance/ClassificationPerformance.js.map +1 -1
- package/dist/Performance/ConfusionMatrix.js +149 -158
- package/dist/Performance/ConfusionMatrix.js.map +1 -1
- package/dist/Performance/DetailedClassificationPerformance.js +23 -32
- package/dist/Performance/DetailedClassificationPerformance.js.map +1 -1
- package/dist/Performance/ExperimentPerformance.js +184 -161
- package/dist/Performance/ExperimentPerformance.js.map +1 -1
- package/dist/Performance/Performance.js +21 -30
- package/dist/Performance/Performance.js.map +1 -1
- package/dist/StatisticalTest/Combined5x2F.js +41 -51
- package/dist/StatisticalTest/Combined5x2F.js.map +1 -1
- package/dist/StatisticalTest/Combined5x2t.js +42 -52
- package/dist/StatisticalTest/Combined5x2t.js.map +1 -1
- package/dist/StatisticalTest/Paired5x2t.js +40 -50
- package/dist/StatisticalTest/Paired5x2t.js.map +1 -1
- package/dist/StatisticalTest/PairedTest.js +31 -41
- package/dist/StatisticalTest/PairedTest.js.map +1 -1
- package/dist/StatisticalTest/Pairedt.js +38 -48
- package/dist/StatisticalTest/Pairedt.js.map +1 -1
- package/dist/StatisticalTest/Sign.js +50 -60
- package/dist/StatisticalTest/Sign.js.map +1 -1
- package/dist/StatisticalTest/StatisticalTestResult.js +65 -73
- package/dist/StatisticalTest/StatisticalTestResult.js.map +1 -1
- package/dist/StatisticalTest/StatisticalTestResultType.js +11 -21
- package/dist/StatisticalTest/StatisticalTestResultType.js.map +1 -1
- package/dist/index.js +95 -101
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
- package/tsconfig.json +4 -3
- package/source/tsconfig.json +0 -13
|
@@ -1,176 +1,199 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
5
7
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ExperimentPerformance = void 0;
|
|
37
|
+
const Performance_1 = require("./Performance");
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const DetailedClassificationPerformance_1 = require("./DetailedClassificationPerformance");
|
|
40
|
+
const ClassificationPerformance_1 = require("./ClassificationPerformance");
|
|
41
|
+
class ExperimentPerformance {
|
|
42
|
+
results = new Array();
|
|
43
|
+
containsDetails = true;
|
|
44
|
+
classification = true;
|
|
45
|
+
/**
|
|
46
|
+
* A constructor that takes a file name as an input and takes the inputs from that file assigns these inputs to the
|
|
47
|
+
* errorRate and adds them to the results {@link Array} as a new {@link Performance}.
|
|
48
|
+
*
|
|
49
|
+
* @param fileName String input.
|
|
50
|
+
*/
|
|
51
|
+
constructor(fileName) {
|
|
52
|
+
if (fileName != undefined) {
|
|
53
|
+
let data = fs.readFileSync(fileName, 'utf8');
|
|
54
|
+
let lines = data.split("\n");
|
|
55
|
+
for (let line of lines) {
|
|
56
|
+
this.results.push(new Performance_1.Performance(Number.parseFloat(line)));
|
|
34
57
|
}
|
|
35
58
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (!(performance instanceof ClassificationPerformance_1.ClassificationPerformance)) {
|
|
46
|
-
this.classification = false;
|
|
47
|
-
}
|
|
48
|
-
this.results.push(performance);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The add method takes a {@link Performance} as an input and adds it to the results {@link Array}.
|
|
62
|
+
*
|
|
63
|
+
* @param performance {@link Performance} input.
|
|
64
|
+
*/
|
|
65
|
+
add(performance) {
|
|
66
|
+
if (!(performance instanceof DetailedClassificationPerformance_1.DetailedClassificationPerformance)) {
|
|
67
|
+
this.containsDetails = false;
|
|
49
68
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
*
|
|
53
|
-
* @return The results {@link Array}.
|
|
54
|
-
*/
|
|
55
|
-
numberOfExperiments() {
|
|
56
|
-
return this.results.length;
|
|
69
|
+
if (!(performance instanceof ClassificationPerformance_1.ClassificationPerformance)) {
|
|
70
|
+
this.classification = false;
|
|
57
71
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
this.results.push(performance);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The numberOfExperiments method returns the size of the results {@link Array}.
|
|
76
|
+
*
|
|
77
|
+
* @return The results {@link Array}.
|
|
78
|
+
*/
|
|
79
|
+
numberOfExperiments() {
|
|
80
|
+
return this.results.length;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The getErrorRate method takes an index as an input and returns the errorRate at given index of
|
|
84
|
+
* results {@link Array}.
|
|
85
|
+
*
|
|
86
|
+
* @param index Index of results {@link Array} to retrieve.
|
|
87
|
+
* @return The errorRate at given index of results {@link Array}.
|
|
88
|
+
*/
|
|
89
|
+
getErrorRate(index) {
|
|
90
|
+
return this.results[index].getErrorRate();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The getAccuracy method takes an index as an input. It returns the accuracy of a {@link Performance} at given
|
|
94
|
+
* index of results {@link Array}.
|
|
95
|
+
*
|
|
96
|
+
* @param index Index of results {@link Array} to retrieve.
|
|
97
|
+
* @return The accuracy of a {@link Performance} at given index of results {@link Array}.
|
|
98
|
+
*/
|
|
99
|
+
getAccuracy(index) {
|
|
100
|
+
if (this.results[index] instanceof ClassificationPerformance_1.ClassificationPerformance) {
|
|
101
|
+
return this.results[index].getAccuracy();
|
|
67
102
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The meanPerformance method loops through the performances of results {@link Array} and sums up the errorRates
|
|
106
|
+
* of each then returns a new {@link Performance} with the mean of that summation.
|
|
107
|
+
*
|
|
108
|
+
* @return A new {@link Performance} with the mean of the summation of errorRates.
|
|
109
|
+
*/
|
|
110
|
+
meanPerformance() {
|
|
111
|
+
let sumError = 0;
|
|
112
|
+
for (let performance of this.results) {
|
|
113
|
+
sumError += performance.getErrorRate();
|
|
79
114
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return
|
|
115
|
+
return new Performance_1.Performance(sumError / this.results.length);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The meanClassificationPerformance method loops through the performances of results {@link Array} and sums up the
|
|
119
|
+
* accuracy of each classification performance, then returns a new classificationPerformance with the mean of that
|
|
120
|
+
* summation.
|
|
121
|
+
*
|
|
122
|
+
* @return A new classificationPerformance with the mean of that summation.
|
|
123
|
+
*/
|
|
124
|
+
meanClassificationPerformance() {
|
|
125
|
+
if (this.results.length == 0 || !this.classification) {
|
|
126
|
+
return undefined;
|
|
92
127
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
*
|
|
98
|
-
* @return A new classificationPerformance with the mean of that summation.
|
|
99
|
-
*/
|
|
100
|
-
meanClassificationPerformance() {
|
|
101
|
-
if (this.results.length == 0 || !this.classification) {
|
|
102
|
-
return undefined;
|
|
103
|
-
}
|
|
104
|
-
let sumAccuracy = 0;
|
|
105
|
-
for (let performance of this.results) {
|
|
106
|
-
let classificationPerformance = performance;
|
|
107
|
-
sumAccuracy += classificationPerformance.getAccuracy();
|
|
108
|
-
}
|
|
109
|
-
return new ClassificationPerformance_1.ClassificationPerformance(sumAccuracy / this.results.length);
|
|
128
|
+
let sumAccuracy = 0;
|
|
129
|
+
for (let performance of this.results) {
|
|
130
|
+
let classificationPerformance = performance;
|
|
131
|
+
sumAccuracy += classificationPerformance.getAccuracy();
|
|
110
132
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
for (let i = 1; i < this.results.length; i++) {
|
|
124
|
-
sum.addConfusionMatrix(this.results[i].getConfusionMatrix());
|
|
125
|
-
}
|
|
126
|
-
return new DetailedClassificationPerformance_1.DetailedClassificationPerformance(sum);
|
|
133
|
+
return new ClassificationPerformance_1.ClassificationPerformance(sumAccuracy / this.results.length);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* The meanDetailedPerformance method gets the first confusion matrix of results {@link Array}.
|
|
137
|
+
* Then, it adds new confusion matrices as the {@link DetailedClassificationPerformance} of
|
|
138
|
+
* other elements of results ArrayList' confusion matrices as a {@link DetailedClassificationPerformance}.
|
|
139
|
+
*
|
|
140
|
+
* @return A new {@link DetailedClassificationPerformance} with the {@link ConfusionMatrix} sum.
|
|
141
|
+
*/
|
|
142
|
+
meanDetailedPerformance() {
|
|
143
|
+
if (this.results.length == 0 || !this.containsDetails) {
|
|
144
|
+
return undefined;
|
|
127
145
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
*
|
|
132
|
-
* @return A new Performance with the standard deviation.
|
|
133
|
-
*/
|
|
134
|
-
standardDeviationPerformance() {
|
|
135
|
-
let sumErrorRate = 0;
|
|
136
|
-
let averagePerformance = this.meanPerformance();
|
|
137
|
-
for (let performance of this.results) {
|
|
138
|
-
sumErrorRate += Math.pow(performance.getErrorRate() - averagePerformance.getErrorRate(), 2);
|
|
139
|
-
}
|
|
140
|
-
return new Performance_1.Performance(Math.sqrt(sumErrorRate / (this.results.length - 1)));
|
|
146
|
+
let sum = this.results[0].getConfusionMatrix();
|
|
147
|
+
for (let i = 1; i < this.results.length; i++) {
|
|
148
|
+
sum.addConfusionMatrix(this.results[i].getConfusionMatrix());
|
|
141
149
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
150
|
+
return new DetailedClassificationPerformance_1.DetailedClassificationPerformance(sum);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* The standardDeviationPerformance method loops through the {@link Performance}s of results {@link Array} and
|
|
154
|
+
* returns a new Performance with the standard deviation.
|
|
155
|
+
*
|
|
156
|
+
* @return A new Performance with the standard deviation.
|
|
157
|
+
*/
|
|
158
|
+
standardDeviationPerformance() {
|
|
159
|
+
let sumErrorRate = 0;
|
|
160
|
+
let averagePerformance = this.meanPerformance();
|
|
161
|
+
for (let performance of this.results) {
|
|
162
|
+
sumErrorRate += Math.pow(performance.getErrorRate() - averagePerformance.getErrorRate(), 2);
|
|
163
|
+
}
|
|
164
|
+
return new Performance_1.Performance(Math.sqrt(sumErrorRate / (this.results.length - 1)));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* The standardDeviationClassificationPerformance method loops through the {@link Performance}s of results {@link ArrayList} and
|
|
168
|
+
* returns a new {@link ClassificationPerformance} with standard deviation.
|
|
169
|
+
*
|
|
170
|
+
* @return A new {@link ClassificationPerformance} with standard deviation.
|
|
171
|
+
*/
|
|
172
|
+
standardDeviationClassificationPerformance() {
|
|
173
|
+
if (this.results.length == 0 || !this.classification) {
|
|
174
|
+
return undefined;
|
|
160
175
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
*/
|
|
168
|
-
isBetter(experimentPerformance) {
|
|
169
|
-
let accuracy1 = this.meanClassificationPerformance().getAccuracy();
|
|
170
|
-
let accuracy2 = experimentPerformance.meanClassificationPerformance().getAccuracy();
|
|
171
|
-
return accuracy1 > accuracy2;
|
|
176
|
+
let sumAccuracy = 0, sumErrorRate = 0;
|
|
177
|
+
let averageClassificationPerformance = this.meanClassificationPerformance();
|
|
178
|
+
for (let performance of this.results) {
|
|
179
|
+
let classificationPerformance = performance;
|
|
180
|
+
sumAccuracy += Math.pow(classificationPerformance.getAccuracy() - averageClassificationPerformance.getAccuracy(), 2);
|
|
181
|
+
sumErrorRate += Math.pow(classificationPerformance.getErrorRate() - averageClassificationPerformance.getErrorRate(), 2);
|
|
172
182
|
}
|
|
183
|
+
return new ClassificationPerformance_1.ClassificationPerformance(Math.sqrt(sumAccuracy / (this.results.length - 1)), Math.sqrt(sumErrorRate / (this.results.length - 1)));
|
|
173
184
|
}
|
|
174
|
-
|
|
175
|
-
}
|
|
185
|
+
/**
|
|
186
|
+
* The isBetter method takes an {@link ExperimentPerformance} as an input and returns true if the result of compareTo method is positive
|
|
187
|
+
* and false otherwise.
|
|
188
|
+
*
|
|
189
|
+
* @param experimentPerformance {@link ExperimentPerformance} input.
|
|
190
|
+
* @return True if the result of compareTo method is positive and false otherwise.
|
|
191
|
+
*/
|
|
192
|
+
isBetter(experimentPerformance) {
|
|
193
|
+
let accuracy1 = this.meanClassificationPerformance().getAccuracy();
|
|
194
|
+
let accuracy2 = experimentPerformance.meanClassificationPerformance().getAccuracy();
|
|
195
|
+
return accuracy1 > accuracy2;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
exports.ExperimentPerformance = ExperimentPerformance;
|
|
176
199
|
//# sourceMappingURL=ExperimentPerformance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExperimentPerformance.js","sourceRoot":"","sources":["../../source/Performance/ExperimentPerformance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExperimentPerformance.js","sourceRoot":"","sources":["../../source/Performance/ExperimentPerformance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Performance = void 0;
|
|
4
|
+
class Performance {
|
|
5
|
+
errorRate;
|
|
6
|
+
/**
|
|
7
|
+
* Constructor that sets the error rate.
|
|
8
|
+
*
|
|
9
|
+
* @param errorRate Double input.
|
|
10
|
+
*/
|
|
11
|
+
constructor(errorRate) {
|
|
12
|
+
this.errorRate = errorRate;
|
|
5
13
|
}
|
|
6
|
-
|
|
7
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Accessor for the error rate.
|
|
16
|
+
*
|
|
17
|
+
* @return Double errorRate.
|
|
18
|
+
*/
|
|
19
|
+
getErrorRate() {
|
|
20
|
+
return this.errorRate;
|
|
8
21
|
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.Performance = void 0;
|
|
13
|
-
class Performance {
|
|
14
|
-
/**
|
|
15
|
-
* Constructor that sets the error rate.
|
|
16
|
-
*
|
|
17
|
-
* @param errorRate Double input.
|
|
18
|
-
*/
|
|
19
|
-
constructor(errorRate) {
|
|
20
|
-
this.errorRate = errorRate;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Accessor for the error rate.
|
|
24
|
-
*
|
|
25
|
-
* @return Double errorRate.
|
|
26
|
-
*/
|
|
27
|
-
getErrorRate() {
|
|
28
|
-
return this.errorRate;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
exports.Performance = Performance;
|
|
32
|
-
});
|
|
22
|
+
}
|
|
23
|
+
exports.Performance = Performance;
|
|
33
24
|
//# sourceMappingURL=Performance.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Performance.js","sourceRoot":"","sources":["../../source/Performance/Performance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Performance.js","sourceRoot":"","sources":["../../source/Performance/Performance.ts"],"names":[],"mappings":";;;AAAA,MAAa,WAAW;IAEV,SAAS,CAAQ;IAE3B;;;;OAIG;IACH,YAAY,SAAiB;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC9B,CAAC;IAED;;;;OAIG;IACH,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;CACJ;AArBD,kCAqBC"}
|
|
@@ -1,55 +1,45 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
* @param classifier2 Performance (error rate or accuracy) results of the second classifier.
|
|
21
|
-
* @return Given the performances of two classifiers, the test statistic of the combined 5x2 cv F test.
|
|
22
|
-
*/
|
|
23
|
-
testStatistic(classifier1, classifier2) {
|
|
24
|
-
let difference = new Array();
|
|
25
|
-
let numerator = 0;
|
|
26
|
-
for (let i = 0; i < classifier1.numberOfExperiments(); i++) {
|
|
27
|
-
difference.push(classifier1.getErrorRate(i) - classifier2.getErrorRate(i));
|
|
28
|
-
numerator += difference[i] * difference[i];
|
|
29
|
-
}
|
|
30
|
-
let denominator = 0;
|
|
31
|
-
for (let i = 0; i < classifier1.numberOfExperiments() / 2; i++) {
|
|
32
|
-
let mean = (difference[2 * i] + difference[2 * i + 1]) / 2;
|
|
33
|
-
let variance = (difference[2 * i] - mean) * (difference[2 * i] - mean) +
|
|
34
|
-
(difference[2 * i + 1] - mean) * (difference[2 * i + 1] - mean);
|
|
35
|
-
denominator += variance;
|
|
36
|
-
}
|
|
37
|
-
denominator *= 2;
|
|
38
|
-
return numerator / denominator;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Combined5x2F = void 0;
|
|
4
|
+
const PairedTest_1 = require("./PairedTest");
|
|
5
|
+
const StatisticalTestResult_1 = require("./StatisticalTestResult");
|
|
6
|
+
const Distribution_1 = require("nlptoolkit-math/dist/Distribution");
|
|
7
|
+
class Combined5x2F extends PairedTest_1.PairedTest {
|
|
8
|
+
/**
|
|
9
|
+
* Calculates the test statistic of the combined 5x2 cv F test.
|
|
10
|
+
* @param classifier1 Performance (error rate or accuracy) results of the first classifier.
|
|
11
|
+
* @param classifier2 Performance (error rate or accuracy) results of the second classifier.
|
|
12
|
+
* @return Given the performances of two classifiers, the test statistic of the combined 5x2 cv F test.
|
|
13
|
+
*/
|
|
14
|
+
testStatistic(classifier1, classifier2) {
|
|
15
|
+
let difference = new Array();
|
|
16
|
+
let numerator = 0;
|
|
17
|
+
for (let i = 0; i < classifier1.numberOfExperiments(); i++) {
|
|
18
|
+
difference.push(classifier1.getErrorRate(i) - classifier2.getErrorRate(i));
|
|
19
|
+
numerator += difference[i] * difference[i];
|
|
39
20
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
compareClassifiers(classifier1, classifier2) {
|
|
47
|
-
let statistic = this.testStatistic(classifier1, classifier2);
|
|
48
|
-
let degreeOfFreedom1 = classifier1.numberOfExperiments();
|
|
49
|
-
let degreeOfFreedom2 = classifier1.numberOfExperiments() / 2;
|
|
50
|
-
return new StatisticalTestResult_1.StatisticalTestResult(Distribution_1.Distribution.fDistribution(statistic, degreeOfFreedom1, degreeOfFreedom2), true);
|
|
21
|
+
let denominator = 0;
|
|
22
|
+
for (let i = 0; i < classifier1.numberOfExperiments() / 2; i++) {
|
|
23
|
+
let mean = (difference[2 * i] + difference[2 * i + 1]) / 2;
|
|
24
|
+
let variance = (difference[2 * i] - mean) * (difference[2 * i] - mean) +
|
|
25
|
+
(difference[2 * i + 1] - mean) * (difference[2 * i + 1] - mean);
|
|
26
|
+
denominator += variance;
|
|
51
27
|
}
|
|
28
|
+
denominator *= 2;
|
|
29
|
+
return numerator / denominator;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Compares two classification algorithms based on their performances (accuracy or error rate) using combined 5x2 cv F test.
|
|
33
|
+
* @param classifier1 Performance (error rate or accuracy) results of the first classifier.
|
|
34
|
+
* @param classifier2 Performance (error rate or accuracy) results of the second classifier.
|
|
35
|
+
* @return Statistical test result of the comparison.
|
|
36
|
+
*/
|
|
37
|
+
compareClassifiers(classifier1, classifier2) {
|
|
38
|
+
let statistic = this.testStatistic(classifier1, classifier2);
|
|
39
|
+
let degreeOfFreedom1 = classifier1.numberOfExperiments();
|
|
40
|
+
let degreeOfFreedom2 = classifier1.numberOfExperiments() / 2;
|
|
41
|
+
return new StatisticalTestResult_1.StatisticalTestResult(Distribution_1.Distribution.fDistribution(statistic, degreeOfFreedom1, degreeOfFreedom2), true);
|
|
52
42
|
}
|
|
53
|
-
|
|
54
|
-
|
|
43
|
+
}
|
|
44
|
+
exports.Combined5x2F = Combined5x2F;
|
|
55
45
|
//# sourceMappingURL=Combined5x2F.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combined5x2F.js","sourceRoot":"","sources":["../../source/StatisticalTest/Combined5x2F.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Combined5x2F.js","sourceRoot":"","sources":["../../source/StatisticalTest/Combined5x2F.ts"],"names":[],"mappings":";;;AAAA,6CAAwC;AAExC,mEAA8D;AAC9D,oEAA+D;AAE/D,MAAa,YAAa,SAAQ,uBAAU;IAExC;;;;;OAKG;IACK,aAAa,CAAC,WAAkC,EAAE,WAAkC;QACxF,IAAI,UAAU,GAAG,IAAI,KAAK,EAAU,CAAC;QACrC,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAC,CAAC;YACxD,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAC,CAAC;YAC5D,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,IAAI,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;gBAClE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACpE,WAAW,IAAI,QAAQ,CAAC;QAC5B,CAAC;QACD,WAAW,IAAI,CAAC,CAAC;QACjB,OAAO,SAAS,GAAG,WAAW,CAAC;IACnC,CAAC;IAED;;;;;OAKG;IACH,kBAAkB,CAAC,WAAkC,EAAE,WAAkC;QACrF,IAAI,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC7D,IAAI,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,EAAE,CAAC;QACzD,IAAI,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,IAAI,6CAAqB,CAAC,2BAAY,CAAC,aAAa,CAAC,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;IACtH,CAAC;CAEJ;AAvCD,oCAuCC"}
|