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,187 +1,180 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeepNetworkModel = void 0;
|
|
4
|
+
const NeuralNetworkModel_1 = require("./NeuralNetworkModel");
|
|
5
|
+
const Matrix_1 = require("nlptoolkit-math/dist/Matrix");
|
|
6
|
+
const ActivationFunction_1 = require("../../Parameter/ActivationFunction");
|
|
7
|
+
const Vector_1 = require("nlptoolkit-math/dist/Vector");
|
|
8
|
+
const ClassificationPerformance_1 = require("../../Performance/ClassificationPerformance");
|
|
9
|
+
const Random_1 = require("nlptoolkit-util/dist/Random");
|
|
10
|
+
const FileContents_1 = require("nlptoolkit-util/dist/FileContents");
|
|
11
|
+
const Partition_1 = require("../../InstanceList/Partition");
|
|
12
|
+
class DeepNetworkModel extends NeuralNetworkModel_1.NeuralNetworkModel {
|
|
13
|
+
weights;
|
|
14
|
+
hiddenLayerSize;
|
|
15
|
+
activationFunction;
|
|
16
|
+
/**
|
|
17
|
+
* The allocateWeights method takes {@link DeepNetworkParameter}s as an input. First it adds random weights to the {@link Array}
|
|
18
|
+
* of {@link Matrix} weights' first layer. Then it loops through the layers and adds random weights till the last layer.
|
|
19
|
+
* At the end it adds random weights to the last layer and also sets the hiddenLayerSize value.
|
|
20
|
+
*
|
|
21
|
+
* @param parameters {@link DeepNetworkParameter} input.
|
|
22
|
+
*/
|
|
23
|
+
allocateWeights(parameters) {
|
|
24
|
+
this.weights = new Array();
|
|
25
|
+
this.weights.push(this.allocateLayerWeights(parameters.getHiddenNodes(0), this.d + 1, new Random_1.Random(parameters.getSeed())));
|
|
26
|
+
for (let i = 0; i < parameters.layerSize() - 1; i++) {
|
|
27
|
+
this.weights.push(this.allocateLayerWeights(parameters.getHiddenNodes(i + 1), parameters.getHiddenNodes(i) + 1, new Random_1.Random(parameters.getSeed())));
|
|
28
|
+
}
|
|
29
|
+
this.weights.push(this.allocateLayerWeights(this.K, parameters.getHiddenNodes(parameters.layerSize() - 1) + 1, new Random_1.Random(parameters.getSeed())));
|
|
30
|
+
this.hiddenLayerSize = parameters.layerSize();
|
|
5
31
|
}
|
|
6
|
-
|
|
7
|
-
|
|
32
|
+
/**
|
|
33
|
+
* The setBestWeights method creates an {@link Array} of Matrix as bestWeights and clones the values of weights {@link Array}
|
|
34
|
+
* into this newly created {@link Array}.
|
|
35
|
+
*
|
|
36
|
+
* @return An {@link Array} clones from the weights ArrayList.
|
|
37
|
+
*/
|
|
38
|
+
setBestWeights() {
|
|
39
|
+
let bestWeights = new Array();
|
|
40
|
+
for (let m of this.weights) {
|
|
41
|
+
bestWeights.push(m.clone());
|
|
42
|
+
}
|
|
43
|
+
return bestWeights;
|
|
8
44
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const Partition_1 = require("../../InstanceList/Partition");
|
|
21
|
-
class DeepNetworkModel extends NeuralNetworkModel_1.NeuralNetworkModel {
|
|
22
|
-
/**
|
|
23
|
-
* The allocateWeights method takes {@link DeepNetworkParameter}s as an input. First it adds random weights to the {@link Array}
|
|
24
|
-
* of {@link Matrix} weights' first layer. Then it loops through the layers and adds random weights till the last layer.
|
|
25
|
-
* At the end it adds random weights to the last layer and also sets the hiddenLayerSize value.
|
|
26
|
-
*
|
|
27
|
-
* @param parameters {@link DeepNetworkParameter} input.
|
|
28
|
-
*/
|
|
29
|
-
allocateWeights(parameters) {
|
|
30
|
-
this.weights = new Array();
|
|
31
|
-
this.weights.push(this.allocateLayerWeights(parameters.getHiddenNodes(0), this.d + 1, new Random_1.Random(parameters.getSeed())));
|
|
32
|
-
for (let i = 0; i < parameters.layerSize() - 1; i++) {
|
|
33
|
-
this.weights.push(this.allocateLayerWeights(parameters.getHiddenNodes(i + 1), parameters.getHiddenNodes(i) + 1, new Random_1.Random(parameters.getSeed())));
|
|
34
|
-
}
|
|
35
|
-
this.weights.push(this.allocateLayerWeights(this.K, parameters.getHiddenNodes(parameters.layerSize() - 1) + 1, new Random_1.Random(parameters.getSeed())));
|
|
36
|
-
this.hiddenLayerSize = parameters.layerSize();
|
|
45
|
+
/**
|
|
46
|
+
* Loads a deep network model from an input model file.
|
|
47
|
+
* @param fileName Model file name.
|
|
48
|
+
*/
|
|
49
|
+
constructor2(fileName) {
|
|
50
|
+
let input = new FileContents_1.FileContents(fileName);
|
|
51
|
+
this.loadClassLabels(input);
|
|
52
|
+
this.hiddenLayerSize = parseInt(input.readLine());
|
|
53
|
+
this.weights = new Array();
|
|
54
|
+
for (let i = 0; i < this.hiddenLayerSize + 1; i++) {
|
|
55
|
+
this.weights.push(this.loadMatrix(input));
|
|
37
56
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
57
|
+
this.activationFunction = this.loadActivationFunction(input);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The calculateOutput method loops size of the weights times and calculate one hidden layer at a time and adds bias term.
|
|
61
|
+
* At the end it updates the output y value.
|
|
62
|
+
*/
|
|
63
|
+
calculateOutput() {
|
|
64
|
+
let hiddenBiased;
|
|
65
|
+
for (let i = 0; i < this.weights.length - 1; i++) {
|
|
66
|
+
let hidden;
|
|
67
|
+
if (i == 0) {
|
|
68
|
+
hidden = this.calculateHidden(this.x, this.weights[i], this.activationFunction);
|
|
48
69
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Loads a deep network model from an input model file.
|
|
53
|
-
* @param fileName Model file name.
|
|
54
|
-
*/
|
|
55
|
-
constructor2(fileName) {
|
|
56
|
-
let input = new FileContents_1.FileContents(fileName);
|
|
57
|
-
this.loadClassLabels(input);
|
|
58
|
-
this.hiddenLayerSize = parseInt(input.readLine());
|
|
59
|
-
this.weights = new Array();
|
|
60
|
-
for (let i = 0; i < this.hiddenLayerSize + 1; i++) {
|
|
61
|
-
this.weights.push(this.loadMatrix(input));
|
|
70
|
+
else {
|
|
71
|
+
hidden = this.calculateHidden(hiddenBiased, this.weights[i], this.activationFunction);
|
|
62
72
|
}
|
|
63
|
-
|
|
73
|
+
hiddenBiased = hidden.biased();
|
|
64
74
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
this.y = this.weights[this.weights.length - 1].multiplyWithVectorFromRight(hiddenBiased);
|
|
76
|
+
}
|
|
77
|
+
saveTxt(fileName) {
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Training algorithm for deep network classifier.
|
|
81
|
+
*
|
|
82
|
+
* @param train Training data given to the algorithm.
|
|
83
|
+
* @param params Parameters of the deep network algorithm. crossValidationRatio and seed are used as parameters.
|
|
84
|
+
* @throws DiscreteFeaturesNotAllowed Exception for discrete features.
|
|
85
|
+
*/
|
|
86
|
+
train(train, params) {
|
|
87
|
+
this.initialize(train);
|
|
88
|
+
let parameters = params;
|
|
89
|
+
let partition = new Partition_1.Partition(train, parameters.getCrossValidationRatio(), true);
|
|
90
|
+
let trainSet = partition.get(1);
|
|
91
|
+
let validationSet = partition.get(0);
|
|
92
|
+
let tmpHidden = new Vector_1.Vector(0, 0);
|
|
93
|
+
let deltaWeights = new Array();
|
|
94
|
+
let hidden = new Array();
|
|
95
|
+
let hiddenBiased = new Array();
|
|
96
|
+
this.activationFunction = parameters.getActivationFunction();
|
|
97
|
+
this.allocateWeights(parameters);
|
|
98
|
+
let bestWeights = this.setBestWeights();
|
|
99
|
+
let bestClassificationPerformance = new ClassificationPerformance_1.ClassificationPerformance(0.0);
|
|
100
|
+
let epoch = parameters.getEpoch();
|
|
101
|
+
let learningRate = parameters.getLearningRate();
|
|
102
|
+
for (let i = 0; i < epoch; i++) {
|
|
103
|
+
trainSet.shuffle(new Random_1.Random(parameters.getSeed()));
|
|
104
|
+
for (let j = 0; j < trainSet.size(); j++) {
|
|
105
|
+
this.createInputVector(trainSet.get(j));
|
|
106
|
+
hidden = new Array();
|
|
107
|
+
hiddenBiased = new Array();
|
|
108
|
+
deltaWeights = new Array();
|
|
109
|
+
for (let k = 0; k < this.hiddenLayerSize; k++) {
|
|
110
|
+
if (k == 0) {
|
|
111
|
+
hidden.push(this.calculateHidden(this.x, this.weights[k], this.activationFunction));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
hidden.push(this.calculateHidden(hiddenBiased[k - 1], this.weights[k], this.activationFunction));
|
|
115
|
+
}
|
|
116
|
+
hiddenBiased.push(hidden[k].biased());
|
|
78
117
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
* @param train Training data given to the algorithm.
|
|
89
|
-
* @param params Parameters of the deep network algorithm. crossValidationRatio and seed are used as parameters.
|
|
90
|
-
* @throws DiscreteFeaturesNotAllowed Exception for discrete features.
|
|
91
|
-
*/
|
|
92
|
-
train(train, params) {
|
|
93
|
-
this.initialize(train);
|
|
94
|
-
let parameters = params;
|
|
95
|
-
let partition = new Partition_1.Partition(train, parameters.getCrossValidationRatio(), true);
|
|
96
|
-
let trainSet = partition.get(1);
|
|
97
|
-
let validationSet = partition.get(0);
|
|
98
|
-
let tmpHidden = new Vector_1.Vector(0, 0);
|
|
99
|
-
let deltaWeights = new Array();
|
|
100
|
-
let hidden = new Array();
|
|
101
|
-
let hiddenBiased = new Array();
|
|
102
|
-
this.activationFunction = parameters.getActivationFunction();
|
|
103
|
-
this.allocateWeights(parameters);
|
|
104
|
-
let bestWeights = this.setBestWeights();
|
|
105
|
-
let bestClassificationPerformance = new ClassificationPerformance_1.ClassificationPerformance(0.0);
|
|
106
|
-
let epoch = parameters.getEpoch();
|
|
107
|
-
let learningRate = parameters.getLearningRate();
|
|
108
|
-
for (let i = 0; i < epoch; i++) {
|
|
109
|
-
trainSet.shuffle(new Random_1.Random(parameters.getSeed()));
|
|
110
|
-
for (let j = 0; j < trainSet.size(); j++) {
|
|
111
|
-
this.createInputVector(trainSet.get(j));
|
|
112
|
-
hidden = new Array();
|
|
113
|
-
hiddenBiased = new Array();
|
|
114
|
-
deltaWeights = new Array();
|
|
115
|
-
for (let k = 0; k < this.hiddenLayerSize; k++) {
|
|
116
|
-
if (k == 0) {
|
|
117
|
-
hidden.push(this.calculateHidden(this.x, this.weights[k], this.activationFunction));
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
hidden.push(this.calculateHidden(hiddenBiased[k - 1], this.weights[k], this.activationFunction));
|
|
121
|
-
}
|
|
122
|
-
hiddenBiased.push(hidden[k].biased());
|
|
118
|
+
let rMinusY = this.calculateRMinusY(trainSet.get(j), hiddenBiased[this.hiddenLayerSize - 1], this.weights[this.weights.length - 1]);
|
|
119
|
+
deltaWeights.splice(0, 0, new Matrix_1.Matrix(rMinusY, hiddenBiased[this.hiddenLayerSize - 1]));
|
|
120
|
+
for (let k = this.weights.length - 2; k >= 0; k--) {
|
|
121
|
+
let tmph;
|
|
122
|
+
if (k == this.weights.length - 2) {
|
|
123
|
+
tmph = this.weights[k + 1].multiplyWithVectorFromLeft(rMinusY);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
tmph = this.weights[k + 1].multiplyWithVectorFromLeft(tmpHidden);
|
|
123
127
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
break;
|
|
142
|
-
case ActivationFunction_1.ActivationFunction.TANH:
|
|
143
|
-
let one = new Vector_1.Vector(hidden.length, 1.0);
|
|
144
|
-
hidden[k].tanh();
|
|
145
|
-
activationDerivative = one.difference(hidden[k].elementProduct(hidden[k]));
|
|
146
|
-
break;
|
|
147
|
-
case ActivationFunction_1.ActivationFunction.RELU:
|
|
148
|
-
hidden[k].reluDerivative();
|
|
149
|
-
activationDerivative = hidden[k];
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
tmpHidden = tmph.elementProduct(activationDerivative);
|
|
153
|
-
if (k == 0) {
|
|
154
|
-
deltaWeights.splice(0, 0, new Matrix_1.Matrix(tmpHidden, this.x));
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
deltaWeights.splice(0, 0, new Matrix_1.Matrix(tmpHidden, hiddenBiased[k - 1]));
|
|
158
|
-
}
|
|
128
|
+
tmph.remove(0);
|
|
129
|
+
let activationDerivative;
|
|
130
|
+
switch (this.activationFunction) {
|
|
131
|
+
case ActivationFunction_1.ActivationFunction.SIGMOID:
|
|
132
|
+
default:
|
|
133
|
+
let oneMinusHidden = this.calculateOneMinusHidden(hidden[k]);
|
|
134
|
+
activationDerivative = oneMinusHidden.elementProduct(hidden[k]);
|
|
135
|
+
break;
|
|
136
|
+
case ActivationFunction_1.ActivationFunction.TANH:
|
|
137
|
+
let one = new Vector_1.Vector(hidden.length, 1.0);
|
|
138
|
+
hidden[k].tanh();
|
|
139
|
+
activationDerivative = one.difference(hidden[k].elementProduct(hidden[k]));
|
|
140
|
+
break;
|
|
141
|
+
case ActivationFunction_1.ActivationFunction.RELU:
|
|
142
|
+
hidden[k].reluDerivative();
|
|
143
|
+
activationDerivative = hidden[k];
|
|
144
|
+
break;
|
|
159
145
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
146
|
+
tmpHidden = tmph.elementProduct(activationDerivative);
|
|
147
|
+
if (k == 0) {
|
|
148
|
+
deltaWeights.splice(0, 0, new Matrix_1.Matrix(tmpHidden, this.x));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
deltaWeights.splice(0, 0, new Matrix_1.Matrix(tmpHidden, hiddenBiased[k - 1]));
|
|
163
152
|
}
|
|
164
153
|
}
|
|
165
|
-
let
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
bestWeights = this.setBestWeights();
|
|
154
|
+
for (let k = 0; k < this.weights.length; k++) {
|
|
155
|
+
deltaWeights[k].multiplyWithConstant(learningRate);
|
|
156
|
+
this.weights[k].add(deltaWeights[k]);
|
|
169
157
|
}
|
|
170
|
-
learningRate *= parameters.getEtaDecrease();
|
|
171
158
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
159
|
+
let currentClassificationPerformance = this.testClassifier(validationSet);
|
|
160
|
+
if (currentClassificationPerformance.getAccuracy() > bestClassificationPerformance.getAccuracy()) {
|
|
161
|
+
bestClassificationPerformance = currentClassificationPerformance;
|
|
162
|
+
bestWeights = this.setBestWeights();
|
|
175
163
|
}
|
|
164
|
+
learningRate *= parameters.getEtaDecrease();
|
|
176
165
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
*/
|
|
181
|
-
loadModel(fileName) {
|
|
182
|
-
this.constructor2(fileName);
|
|
166
|
+
this.weights = new Array();
|
|
167
|
+
for (let m of bestWeights) {
|
|
168
|
+
this.weights.push(m);
|
|
183
169
|
}
|
|
184
170
|
}
|
|
185
|
-
|
|
186
|
-
|
|
171
|
+
/**
|
|
172
|
+
* Loads the deep network model from an input file.
|
|
173
|
+
* @param fileName File name of the deep network model.
|
|
174
|
+
*/
|
|
175
|
+
loadModel(fileName) {
|
|
176
|
+
this.constructor2(fileName);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.DeepNetworkModel = DeepNetworkModel;
|
|
187
180
|
//# sourceMappingURL=DeepNetworkModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeepNetworkModel.js","sourceRoot":"","sources":["../../../source/Model/NeuralNetwork/DeepNetworkModel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DeepNetworkModel.js","sourceRoot":"","sources":["../../../source/Model/NeuralNetwork/DeepNetworkModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,84 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LinearPerceptronModel = void 0;
|
|
4
|
+
const NeuralNetworkModel_1 = require("./NeuralNetworkModel");
|
|
5
|
+
const Matrix_1 = require("nlptoolkit-math/dist/Matrix");
|
|
6
|
+
const ClassificationPerformance_1 = require("../../Performance/ClassificationPerformance");
|
|
7
|
+
const Random_1 = require("nlptoolkit-util/dist/Random");
|
|
8
|
+
const FileContents_1 = require("nlptoolkit-util/dist/FileContents");
|
|
9
|
+
const Partition_1 = require("../../InstanceList/Partition");
|
|
10
|
+
class LinearPerceptronModel extends NeuralNetworkModel_1.NeuralNetworkModel {
|
|
11
|
+
W;
|
|
12
|
+
/**
|
|
13
|
+
* Loads a linear perceptron model from an input model file.
|
|
14
|
+
* @param fileName Model file name.
|
|
15
|
+
*/
|
|
16
|
+
constructor2(fileName) {
|
|
17
|
+
let input = new FileContents_1.FileContents(fileName);
|
|
18
|
+
this.loadClassLabels(input);
|
|
19
|
+
this.W = this.loadMatrix(input);
|
|
5
20
|
}
|
|
6
|
-
|
|
7
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The calculateOutput method calculates the {@link Matrix} y by multiplying Matrix W with {@link Vector} x.
|
|
23
|
+
*/
|
|
24
|
+
calculateOutput() {
|
|
25
|
+
this.y = this.W.multiplyWithVectorFromRight(this.x);
|
|
8
26
|
}
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
* Training algorithm for the linear perceptron algorithm. 20 percent of the data is separated as cross-validation
|
|
39
|
-
* data used for selecting the best weights. 80 percent of the data is used for training the linear perceptron with
|
|
40
|
-
* gradient descent.
|
|
41
|
-
*
|
|
42
|
-
* @param train Training data given to the algorithm
|
|
43
|
-
* @param params Parameters of the linear perceptron.
|
|
44
|
-
*/
|
|
45
|
-
train(train, params) {
|
|
46
|
-
this.initialize(train);
|
|
47
|
-
let parameters = params;
|
|
48
|
-
let partition = new Partition_1.Partition(train, parameters.getCrossValidationRatio(), true);
|
|
49
|
-
let trainSet = partition.get(1);
|
|
50
|
-
let validationSet = partition.get(0);
|
|
51
|
-
this.W = this.allocateLayerWeights(this.K, this.d + 1, new Random_1.Random(parameters.getSeed()));
|
|
52
|
-
let bestW = this.W.clone();
|
|
53
|
-
let bestClassificationPerformance = new ClassificationPerformance_1.ClassificationPerformance(0.0);
|
|
54
|
-
let epoch = parameters.getEpoch();
|
|
55
|
-
let learningRate = parameters.getLearningRate();
|
|
56
|
-
for (let i = 0; i < epoch; i++) {
|
|
57
|
-
trainSet.shuffle(new Random_1.Random(parameters.getSeed()));
|
|
58
|
-
for (let j = 0; j < trainSet.size(); j++) {
|
|
59
|
-
this.createInputVector(trainSet.get(j));
|
|
60
|
-
let rMinusY = this.calculateRMinusY(trainSet.get(j), this.x, this.W);
|
|
61
|
-
let deltaW = new Matrix_1.Matrix(rMinusY, this.x);
|
|
62
|
-
deltaW.multiplyWithConstant(learningRate);
|
|
63
|
-
this.W.add(deltaW);
|
|
64
|
-
}
|
|
65
|
-
let currentClassificationPerformance = this.testClassifier(validationSet);
|
|
66
|
-
if (currentClassificationPerformance.getAccuracy() > bestClassificationPerformance.getAccuracy()) {
|
|
67
|
-
bestClassificationPerformance = currentClassificationPerformance;
|
|
68
|
-
bestW = this.W.clone();
|
|
69
|
-
}
|
|
70
|
-
learningRate *= parameters.getEtaDecrease();
|
|
27
|
+
saveTxt(fileName) {
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Training algorithm for the linear perceptron algorithm. 20 percent of the data is separated as cross-validation
|
|
31
|
+
* data used for selecting the best weights. 80 percent of the data is used for training the linear perceptron with
|
|
32
|
+
* gradient descent.
|
|
33
|
+
*
|
|
34
|
+
* @param train Training data given to the algorithm
|
|
35
|
+
* @param params Parameters of the linear perceptron.
|
|
36
|
+
*/
|
|
37
|
+
train(train, params) {
|
|
38
|
+
this.initialize(train);
|
|
39
|
+
let parameters = params;
|
|
40
|
+
let partition = new Partition_1.Partition(train, parameters.getCrossValidationRatio(), true);
|
|
41
|
+
let trainSet = partition.get(1);
|
|
42
|
+
let validationSet = partition.get(0);
|
|
43
|
+
this.W = this.allocateLayerWeights(this.K, this.d + 1, new Random_1.Random(parameters.getSeed()));
|
|
44
|
+
let bestW = this.W.clone();
|
|
45
|
+
let bestClassificationPerformance = new ClassificationPerformance_1.ClassificationPerformance(0.0);
|
|
46
|
+
let epoch = parameters.getEpoch();
|
|
47
|
+
let learningRate = parameters.getLearningRate();
|
|
48
|
+
for (let i = 0; i < epoch; i++) {
|
|
49
|
+
trainSet.shuffle(new Random_1.Random(parameters.getSeed()));
|
|
50
|
+
for (let j = 0; j < trainSet.size(); j++) {
|
|
51
|
+
this.createInputVector(trainSet.get(j));
|
|
52
|
+
let rMinusY = this.calculateRMinusY(trainSet.get(j), this.x, this.W);
|
|
53
|
+
let deltaW = new Matrix_1.Matrix(rMinusY, this.x);
|
|
54
|
+
deltaW.multiplyWithConstant(learningRate);
|
|
55
|
+
this.W.add(deltaW);
|
|
71
56
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
loadModel(fileName) {
|
|
79
|
-
this.constructor2(fileName);
|
|
57
|
+
let currentClassificationPerformance = this.testClassifier(validationSet);
|
|
58
|
+
if (currentClassificationPerformance.getAccuracy() > bestClassificationPerformance.getAccuracy()) {
|
|
59
|
+
bestClassificationPerformance = currentClassificationPerformance;
|
|
60
|
+
bestW = this.W.clone();
|
|
61
|
+
}
|
|
62
|
+
learningRate *= parameters.getEtaDecrease();
|
|
80
63
|
}
|
|
64
|
+
this.W = bestW;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Loads the linear perceptron model from an input file.
|
|
68
|
+
* @param fileName File name of the linear perceptron model.
|
|
69
|
+
*/
|
|
70
|
+
loadModel(fileName) {
|
|
71
|
+
this.constructor2(fileName);
|
|
81
72
|
}
|
|
82
|
-
|
|
83
|
-
|
|
73
|
+
}
|
|
74
|
+
exports.LinearPerceptronModel = LinearPerceptronModel;
|
|
84
75
|
//# sourceMappingURL=LinearPerceptronModel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinearPerceptronModel.js","sourceRoot":"","sources":["../../../source/Model/NeuralNetwork/LinearPerceptronModel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"LinearPerceptronModel.js","sourceRoot":"","sources":["../../../source/Model/NeuralNetwork/LinearPerceptronModel.ts"],"names":[],"mappings":"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"}
|