nlptoolkit-classification 1.0.0

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.
Files changed (412) hide show
  1. package/README.md +161 -0
  2. package/datasets/bupa.data +345 -0
  3. package/datasets/car.data +1728 -0
  4. package/datasets/chess.data +28056 -0
  5. package/datasets/dermatology.data +366 -0
  6. package/datasets/iris.data +150 -0
  7. package/datasets/nursery.data +12960 -0
  8. package/datasets/tictactoe.data +958 -0
  9. package/dist/Attribute/Attribute.d.ts +4 -0
  10. package/dist/Attribute/Attribute.js +17 -0
  11. package/dist/Attribute/Attribute.js.map +1 -0
  12. package/dist/Attribute/AttributeType.d.ts +18 -0
  13. package/dist/Attribute/AttributeType.js +33 -0
  14. package/dist/Attribute/AttributeType.js.map +1 -0
  15. package/dist/Attribute/BinaryAttribute.d.ts +9 -0
  16. package/dist/Attribute/BinaryAttribute.js +26 -0
  17. package/dist/Attribute/BinaryAttribute.js.map +1 -0
  18. package/dist/Attribute/ContinuousAttribute.d.ts +30 -0
  19. package/dist/Attribute/ContinuousAttribute.js +59 -0
  20. package/dist/Attribute/ContinuousAttribute.js.map +1 -0
  21. package/dist/Attribute/DiscreteAttribute.d.ts +24 -0
  22. package/dist/Attribute/DiscreteAttribute.js +53 -0
  23. package/dist/Attribute/DiscreteAttribute.js.map +1 -0
  24. package/dist/Attribute/DiscreteIndexedAttribute.d.ts +27 -0
  25. package/dist/Attribute/DiscreteIndexedAttribute.js +61 -0
  26. package/dist/Attribute/DiscreteIndexedAttribute.js.map +1 -0
  27. package/dist/Classifier/Bagging.d.ts +16 -0
  28. package/dist/Classifier/Bagging.js +42 -0
  29. package/dist/Classifier/Bagging.js.map +1 -0
  30. package/dist/Classifier/C45.d.ts +13 -0
  31. package/dist/Classifier/C45.js +40 -0
  32. package/dist/Classifier/C45.js.map +1 -0
  33. package/dist/Classifier/C45Stump.d.ts +12 -0
  34. package/dist/Classifier/C45Stump.js +29 -0
  35. package/dist/Classifier/C45Stump.js.map +1 -0
  36. package/dist/Classifier/Classifier.d.ts +39 -0
  37. package/dist/Classifier/Classifier.js +72 -0
  38. package/dist/Classifier/Classifier.js.map +1 -0
  39. package/dist/Classifier/DeepNetwork.d.ts +13 -0
  40. package/dist/Classifier/DeepNetwork.js +31 -0
  41. package/dist/Classifier/DeepNetwork.js.map +1 -0
  42. package/dist/Classifier/Dummy.d.ts +13 -0
  43. package/dist/Classifier/Dummy.js +29 -0
  44. package/dist/Classifier/Dummy.js.map +1 -0
  45. package/dist/Classifier/KMeans.d.ts +12 -0
  46. package/dist/Classifier/KMeans.js +36 -0
  47. package/dist/Classifier/KMeans.js.map +1 -0
  48. package/dist/Classifier/Knn.d.ts +13 -0
  49. package/dist/Classifier/Knn.js +29 -0
  50. package/dist/Classifier/Knn.js.map +1 -0
  51. package/dist/Classifier/Lda.d.ts +12 -0
  52. package/dist/Classifier/Lda.js +52 -0
  53. package/dist/Classifier/Lda.js.map +1 -0
  54. package/dist/Classifier/LinearPerceptron.d.ts +14 -0
  55. package/dist/Classifier/LinearPerceptron.js +32 -0
  56. package/dist/Classifier/LinearPerceptron.js.map +1 -0
  57. package/dist/Classifier/MultiLayerPerceptron.d.ts +14 -0
  58. package/dist/Classifier/MultiLayerPerceptron.js +32 -0
  59. package/dist/Classifier/MultiLayerPerceptron.js.map +1 -0
  60. package/dist/Classifier/NaiveBayes.d.ts +25 -0
  61. package/dist/Classifier/NaiveBayes.js +67 -0
  62. package/dist/Classifier/NaiveBayes.js.map +1 -0
  63. package/dist/Classifier/Qda.d.ts +12 -0
  64. package/dist/Classifier/Qda.js +50 -0
  65. package/dist/Classifier/Qda.js.map +1 -0
  66. package/dist/Classifier/RandomClassifier.d.ts +12 -0
  67. package/dist/Classifier/RandomClassifier.js +32 -0
  68. package/dist/Classifier/RandomClassifier.js.map +1 -0
  69. package/dist/Classifier/RandomForest.d.ts +13 -0
  70. package/dist/Classifier/RandomForest.js +39 -0
  71. package/dist/Classifier/RandomForest.js.map +1 -0
  72. package/dist/DataSet/DataDefinition.d.ts +59 -0
  73. package/dist/DataSet/DataDefinition.js +108 -0
  74. package/dist/DataSet/DataDefinition.js.map +1 -0
  75. package/dist/DataSet/DataSet.d.ts +111 -0
  76. package/dist/DataSet/DataSet.js +286 -0
  77. package/dist/DataSet/DataSet.js.map +1 -0
  78. package/dist/DistanceMetric/DistanceMetric.d.ts +4 -0
  79. package/dist/DistanceMetric/DistanceMetric.js +13 -0
  80. package/dist/DistanceMetric/DistanceMetric.js.map +1 -0
  81. package/dist/DistanceMetric/EuclidianDistance.d.ts +13 -0
  82. package/dist/DistanceMetric/EuclidianDistance.js +43 -0
  83. package/dist/DistanceMetric/EuclidianDistance.js.map +1 -0
  84. package/dist/DistanceMetric/MahalanobisDistance.d.ts +20 -0
  85. package/dist/DistanceMetric/MahalanobisDistance.js +39 -0
  86. package/dist/DistanceMetric/MahalanobisDistance.js.map +1 -0
  87. package/dist/Experiment/BootstrapRun.d.ts +19 -0
  88. package/dist/Experiment/BootstrapRun.js +44 -0
  89. package/dist/Experiment/BootstrapRun.js.map +1 -0
  90. package/dist/Experiment/Experiment.d.ts +37 -0
  91. package/dist/Experiment/Experiment.js +57 -0
  92. package/dist/Experiment/Experiment.js.map +1 -0
  93. package/dist/Experiment/KFoldRun.d.ts +19 -0
  94. package/dist/Experiment/KFoldRun.js +43 -0
  95. package/dist/Experiment/KFoldRun.js.map +1 -0
  96. package/dist/Experiment/KFoldRunSeparateTest.d.ts +24 -0
  97. package/dist/Experiment/KFoldRunSeparateTest.js +51 -0
  98. package/dist/Experiment/KFoldRunSeparateTest.js.map +1 -0
  99. package/dist/Experiment/MultipleRun.d.ts +5 -0
  100. package/dist/Experiment/MultipleRun.js +13 -0
  101. package/dist/Experiment/MultipleRun.js.map +1 -0
  102. package/dist/Experiment/MxKFoldRun.d.ts +20 -0
  103. package/dist/Experiment/MxKFoldRun.js +44 -0
  104. package/dist/Experiment/MxKFoldRun.js.map +1 -0
  105. package/dist/Experiment/MxKFoldRunSeparateTest.d.ts +21 -0
  106. package/dist/Experiment/MxKFoldRunSeparateTest.js +48 -0
  107. package/dist/Experiment/MxKFoldRunSeparateTest.js.map +1 -0
  108. package/dist/Experiment/SingleRun.d.ts +5 -0
  109. package/dist/Experiment/SingleRun.js +13 -0
  110. package/dist/Experiment/SingleRun.js.map +1 -0
  111. package/dist/Experiment/SingleRunWithK.d.ts +19 -0
  112. package/dist/Experiment/SingleRunWithK.js +37 -0
  113. package/dist/Experiment/SingleRunWithK.js.map +1 -0
  114. package/dist/Experiment/StratifiedKFoldRun.d.ts +17 -0
  115. package/dist/Experiment/StratifiedKFoldRun.js +39 -0
  116. package/dist/Experiment/StratifiedKFoldRun.js.map +1 -0
  117. package/dist/Experiment/StratifiedKFoldRunSeparateTest.d.ts +18 -0
  118. package/dist/Experiment/StratifiedKFoldRunSeparateTest.js +43 -0
  119. package/dist/Experiment/StratifiedKFoldRunSeparateTest.js.map +1 -0
  120. package/dist/Experiment/StratifiedMxKFoldRun.d.ts +19 -0
  121. package/dist/Experiment/StratifiedMxKFoldRun.js +43 -0
  122. package/dist/Experiment/StratifiedMxKFoldRun.js.map +1 -0
  123. package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.d.ts +20 -0
  124. package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.js +47 -0
  125. package/dist/Experiment/StratifiedMxKFoldRunSeparateTest.js.map +1 -0
  126. package/dist/Experiment/StratifiedSingleRunWithK.d.ts +18 -0
  127. package/dist/Experiment/StratifiedSingleRunWithK.js +39 -0
  128. package/dist/Experiment/StratifiedSingleRunWithK.js.map +1 -0
  129. package/dist/FeatureSelection/BackwardSelection.d.ts +18 -0
  130. package/dist/FeatureSelection/BackwardSelection.js +39 -0
  131. package/dist/FeatureSelection/BackwardSelection.js.map +1 -0
  132. package/dist/FeatureSelection/FeatureSubSet.d.ts +47 -0
  133. package/dist/FeatureSelection/FeatureSubSet.js +89 -0
  134. package/dist/FeatureSelection/FeatureSubSet.js.map +1 -0
  135. package/dist/FeatureSelection/FloatingSelection.d.ts +16 -0
  136. package/dist/FeatureSelection/FloatingSelection.js +38 -0
  137. package/dist/FeatureSelection/FloatingSelection.js.map +1 -0
  138. package/dist/FeatureSelection/ForwardSelection.d.ts +17 -0
  139. package/dist/FeatureSelection/ForwardSelection.js +38 -0
  140. package/dist/FeatureSelection/ForwardSelection.js.map +1 -0
  141. package/dist/FeatureSelection/SubSetSelection.d.ts +37 -0
  142. package/dist/FeatureSelection/SubSetSelection.js +90 -0
  143. package/dist/FeatureSelection/SubSetSelection.js.map +1 -0
  144. package/dist/Filter/DiscreteToContinuous.d.ts +25 -0
  145. package/dist/Filter/DiscreteToContinuous.js +69 -0
  146. package/dist/Filter/DiscreteToContinuous.js.map +1 -0
  147. package/dist/Filter/DiscreteToIndexed.d.ts +21 -0
  148. package/dist/Filter/DiscreteToIndexed.js +56 -0
  149. package/dist/Filter/DiscreteToIndexed.js.map +1 -0
  150. package/dist/Filter/FeatureFilter.d.ts +18 -0
  151. package/dist/Filter/FeatureFilter.js +36 -0
  152. package/dist/Filter/FeatureFilter.js.map +1 -0
  153. package/dist/Filter/LaryFilter.d.ts +27 -0
  154. package/dist/Filter/LaryFilter.js +62 -0
  155. package/dist/Filter/LaryFilter.js.map +1 -0
  156. package/dist/Filter/LaryToBinary.d.ts +23 -0
  157. package/dist/Filter/LaryToBinary.js +67 -0
  158. package/dist/Filter/LaryToBinary.js.map +1 -0
  159. package/dist/Filter/Normalize.d.ts +21 -0
  160. package/dist/Filter/Normalize.js +47 -0
  161. package/dist/Filter/Normalize.js.map +1 -0
  162. package/dist/Filter/Pca.d.ts +44 -0
  163. package/dist/Filter/Pca.js +109 -0
  164. package/dist/Filter/Pca.js.map +1 -0
  165. package/dist/Filter/TrainedFeatureFilter.d.ts +11 -0
  166. package/dist/Filter/TrainedFeatureFilter.js +26 -0
  167. package/dist/Filter/TrainedFeatureFilter.js.map +1 -0
  168. package/dist/Instance/CompositeInstance.d.ts +32 -0
  169. package/dist/Instance/CompositeInstance.js +61 -0
  170. package/dist/Instance/CompositeInstance.js.map +1 -0
  171. package/dist/Instance/Instance.d.ts +89 -0
  172. package/dist/Instance/Instance.js +170 -0
  173. package/dist/Instance/Instance.js.map +1 -0
  174. package/dist/InstanceList/InstanceList.d.ts +188 -0
  175. package/dist/InstanceList/InstanceList.js +517 -0
  176. package/dist/InstanceList/InstanceList.js.map +1 -0
  177. package/dist/InstanceList/InstanceListOfSameClass.d.ts +16 -0
  178. package/dist/InstanceList/InstanceListOfSameClass.js +35 -0
  179. package/dist/InstanceList/InstanceListOfSameClass.js.map +1 -0
  180. package/dist/InstanceList/Partition.d.ts +31 -0
  181. package/dist/InstanceList/Partition.js +143 -0
  182. package/dist/InstanceList/Partition.js.map +1 -0
  183. package/dist/Model/DecisionTree/DecisionCondition.d.ts +34 -0
  184. package/dist/Model/DecisionTree/DecisionCondition.js +84 -0
  185. package/dist/Model/DecisionTree/DecisionCondition.js.map +1 -0
  186. package/dist/Model/DecisionTree/DecisionNode.d.ts +82 -0
  187. package/dist/Model/DecisionTree/DecisionNode.js +271 -0
  188. package/dist/Model/DecisionTree/DecisionNode.js.map +1 -0
  189. package/dist/Model/DecisionTree/DecisionTree.d.ts +37 -0
  190. package/dist/Model/DecisionTree/DecisionTree.js +75 -0
  191. package/dist/Model/DecisionTree/DecisionTree.js.map +1 -0
  192. package/dist/Model/DeepNetworkModel.d.ts +42 -0
  193. package/dist/Model/DeepNetworkModel.js +163 -0
  194. package/dist/Model/DeepNetworkModel.js.map +1 -0
  195. package/dist/Model/DummyModel.d.ts +20 -0
  196. package/dist/Model/DummyModel.js +46 -0
  197. package/dist/Model/DummyModel.js.map +1 -0
  198. package/dist/Model/GaussianModel.d.ts +24 -0
  199. package/dist/Model/GaussianModel.js +59 -0
  200. package/dist/Model/GaussianModel.js.map +1 -0
  201. package/dist/Model/KMeansModel.d.ts +27 -0
  202. package/dist/Model/KMeansModel.js +48 -0
  203. package/dist/Model/KMeansModel.js.map +1 -0
  204. package/dist/Model/KnnInstance.d.ts +14 -0
  205. package/dist/Model/KnnInstance.js +33 -0
  206. package/dist/Model/KnnInstance.js.map +1 -0
  207. package/dist/Model/KnnModel.d.ts +36 -0
  208. package/dist/Model/KnnModel.js +83 -0
  209. package/dist/Model/KnnModel.js.map +1 -0
  210. package/dist/Model/LdaModel.d.ts +25 -0
  211. package/dist/Model/LdaModel.js +45 -0
  212. package/dist/Model/LdaModel.js.map +1 -0
  213. package/dist/Model/LinearPerceptronModel.d.ts +21 -0
  214. package/dist/Model/LinearPerceptronModel.js +62 -0
  215. package/dist/Model/LinearPerceptronModel.js.map +1 -0
  216. package/dist/Model/Model.d.ts +12 -0
  217. package/dist/Model/Model.js +31 -0
  218. package/dist/Model/Model.js.map +1 -0
  219. package/dist/Model/MultiLayerPerceptronModel.d.ts +29 -0
  220. package/dist/Model/MultiLayerPerceptronModel.js +101 -0
  221. package/dist/Model/MultiLayerPerceptronModel.js.map +1 -0
  222. package/dist/Model/NaiveBayesModel.d.ts +47 -0
  223. package/dist/Model/NaiveBayesModel.js +95 -0
  224. package/dist/Model/NaiveBayesModel.js.map +1 -0
  225. package/dist/Model/NeuralNetworkModel.d.ts +99 -0
  226. package/dist/Model/NeuralNetworkModel.js +180 -0
  227. package/dist/Model/NeuralNetworkModel.js.map +1 -0
  228. package/dist/Model/QdaModel.d.ts +26 -0
  229. package/dist/Model/QdaModel.js +45 -0
  230. package/dist/Model/QdaModel.js.map +1 -0
  231. package/dist/Model/RandomModel.d.ts +16 -0
  232. package/dist/Model/RandomModel.js +51 -0
  233. package/dist/Model/RandomModel.js.map +1 -0
  234. package/dist/Model/TreeEnsembleModel.d.ts +21 -0
  235. package/dist/Model/TreeEnsembleModel.js +49 -0
  236. package/dist/Model/TreeEnsembleModel.js.map +1 -0
  237. package/dist/Model/ValidatedModel.d.ts +12 -0
  238. package/dist/Model/ValidatedModel.js +35 -0
  239. package/dist/Model/ValidatedModel.js.map +1 -0
  240. package/dist/Parameter/ActivationFunction.d.ts +5 -0
  241. package/dist/Parameter/ActivationFunction.js +20 -0
  242. package/dist/Parameter/ActivationFunction.js.map +1 -0
  243. package/dist/Parameter/BaggingParameter.d.ts +17 -0
  244. package/dist/Parameter/BaggingParameter.js +36 -0
  245. package/dist/Parameter/BaggingParameter.js.map +1 -0
  246. package/dist/Parameter/C45Parameter.d.ts +25 -0
  247. package/dist/Parameter/C45Parameter.js +46 -0
  248. package/dist/Parameter/C45Parameter.js.map +1 -0
  249. package/dist/Parameter/DeepNetworkParameter.d.ts +38 -0
  250. package/dist/Parameter/DeepNetworkParameter.js +60 -0
  251. package/dist/Parameter/DeepNetworkParameter.js.map +1 -0
  252. package/dist/Parameter/KMeansParameter.d.ts +18 -0
  253. package/dist/Parameter/KMeansParameter.js +42 -0
  254. package/dist/Parameter/KMeansParameter.js.map +1 -0
  255. package/dist/Parameter/KnnParameter.d.ts +19 -0
  256. package/dist/Parameter/KnnParameter.js +37 -0
  257. package/dist/Parameter/KnnParameter.js.map +1 -0
  258. package/dist/Parameter/LinearPerceptronParameter.d.ts +41 -0
  259. package/dist/Parameter/LinearPerceptronParameter.js +66 -0
  260. package/dist/Parameter/LinearPerceptronParameter.js.map +1 -0
  261. package/dist/Parameter/MultiLayerPerceptronParameter.d.ts +30 -0
  262. package/dist/Parameter/MultiLayerPerceptronParameter.js +50 -0
  263. package/dist/Parameter/MultiLayerPerceptronParameter.js.map +1 -0
  264. package/dist/Parameter/Parameter.d.ts +15 -0
  265. package/dist/Parameter/Parameter.js +33 -0
  266. package/dist/Parameter/Parameter.js.map +1 -0
  267. package/dist/Parameter/RandomForestParameter.d.ts +18 -0
  268. package/dist/Parameter/RandomForestParameter.js +37 -0
  269. package/dist/Parameter/RandomForestParameter.js.map +1 -0
  270. package/dist/Performance/ClassificationPerformance.d.ts +17 -0
  271. package/dist/Performance/ClassificationPerformance.js +36 -0
  272. package/dist/Performance/ClassificationPerformance.js.map +1 -0
  273. package/dist/Performance/ConfusionMatrix.d.ts +81 -0
  274. package/dist/Performance/ConfusionMatrix.js +178 -0
  275. package/dist/Performance/ConfusionMatrix.js.map +1 -0
  276. package/dist/Performance/DetailedClassificationPerformance.d.ts +17 -0
  277. package/dist/Performance/DetailedClassificationPerformance.js +35 -0
  278. package/dist/Performance/DetailedClassificationPerformance.js.map +1 -0
  279. package/dist/Performance/ExperimentPerformance.d.ts +88 -0
  280. package/dist/Performance/ExperimentPerformance.js +176 -0
  281. package/dist/Performance/ExperimentPerformance.js.map +1 -0
  282. package/dist/Performance/Performance.d.ts +15 -0
  283. package/dist/Performance/Performance.js +33 -0
  284. package/dist/Performance/Performance.js.map +1 -0
  285. package/dist/StatisticalTest/Combined5x2F.d.ts +7 -0
  286. package/dist/StatisticalTest/Combined5x2F.js +43 -0
  287. package/dist/StatisticalTest/Combined5x2F.js.map +1 -0
  288. package/dist/StatisticalTest/Combined5x2t.d.ts +7 -0
  289. package/dist/StatisticalTest/Combined5x2t.js +43 -0
  290. package/dist/StatisticalTest/Combined5x2t.js.map +1 -0
  291. package/dist/StatisticalTest/Paired5x2t.d.ts +7 -0
  292. package/dist/StatisticalTest/Paired5x2t.js +42 -0
  293. package/dist/StatisticalTest/Paired5x2t.js.map +1 -0
  294. package/dist/StatisticalTest/PairedTest.d.ts +6 -0
  295. package/dist/StatisticalTest/PairedTest.js +35 -0
  296. package/dist/StatisticalTest/PairedTest.js.map +1 -0
  297. package/dist/StatisticalTest/Pairedt.d.ts +7 -0
  298. package/dist/StatisticalTest/Pairedt.js +40 -0
  299. package/dist/StatisticalTest/Pairedt.js.map +1 -0
  300. package/dist/StatisticalTest/Sign.d.ts +8 -0
  301. package/dist/StatisticalTest/Sign.js +52 -0
  302. package/dist/StatisticalTest/Sign.js.map +1 -0
  303. package/dist/StatisticalTest/StatisticalTestResult.d.ts +9 -0
  304. package/dist/StatisticalTest/StatisticalTestResult.js +53 -0
  305. package/dist/StatisticalTest/StatisticalTestResult.js.map +1 -0
  306. package/dist/StatisticalTest/StatisticalTestResultType.d.ts +7 -0
  307. package/dist/StatisticalTest/StatisticalTestResultType.js +22 -0
  308. package/dist/StatisticalTest/StatisticalTestResultType.js.map +1 -0
  309. package/index.js +100 -0
  310. package/package.json +30 -0
  311. package/source/Attribute/Attribute.ts +6 -0
  312. package/source/Attribute/AttributeType.ts +18 -0
  313. package/source/Attribute/BinaryAttribute.ts +14 -0
  314. package/source/Attribute/ContinuousAttribute.ts +53 -0
  315. package/source/Attribute/DiscreteAttribute.ts +46 -0
  316. package/source/Attribute/DiscreteIndexedAttribute.ts +54 -0
  317. package/source/Classifier/Bagging.ts +32 -0
  318. package/source/Classifier/C45.ts +30 -0
  319. package/source/Classifier/C45Stump.ts +19 -0
  320. package/source/Classifier/Classifier.ts +71 -0
  321. package/source/Classifier/DeepNetwork.ts +22 -0
  322. package/source/Classifier/Dummy.ts +19 -0
  323. package/source/Classifier/KMeans.ts +26 -0
  324. package/source/Classifier/Knn.ts +21 -0
  325. package/source/Classifier/Lda.ts +43 -0
  326. package/source/Classifier/LinearPerceptron.ts +23 -0
  327. package/source/Classifier/MultiLayerPerceptron.ts +23 -0
  328. package/source/Classifier/NaiveBayes.ts +62 -0
  329. package/source/Classifier/Qda.ts +42 -0
  330. package/source/Classifier/RandomClassifier.ts +22 -0
  331. package/source/Classifier/RandomForest.ts +29 -0
  332. package/source/DataSet/DataDefinition.ts +106 -0
  333. package/source/DataSet/DataSet.ts +279 -0
  334. package/source/DistanceMetric/DistanceMetric.ts +6 -0
  335. package/source/DistanceMetric/EuclidianDistance.ts +32 -0
  336. package/source/DistanceMetric/MahalanobisDistance.ts +33 -0
  337. package/source/Experiment/BootstrapRun.ts +37 -0
  338. package/source/Experiment/Experiment.ts +57 -0
  339. package/source/Experiment/KFoldRun.ts +44 -0
  340. package/source/Experiment/KFoldRunSeparateTest.ts +50 -0
  341. package/source/Experiment/MultipleRun.ts +7 -0
  342. package/source/Experiment/MxKFoldRun.ts +37 -0
  343. package/source/Experiment/MxKFoldRunSeparateTest.ts +40 -0
  344. package/source/Experiment/SingleRun.ts +7 -0
  345. package/source/Experiment/SingleRunWithK.ts +39 -0
  346. package/source/Experiment/StratifiedKFoldRun.ts +30 -0
  347. package/source/Experiment/StratifiedKFoldRunSeparateTest.ts +33 -0
  348. package/source/Experiment/StratifiedMxKFoldRun.ts +34 -0
  349. package/source/Experiment/StratifiedMxKFoldRunSeparateTest.ts +40 -0
  350. package/source/Experiment/StratifiedSingleRunWithK.ts +33 -0
  351. package/source/FeatureSelection/BackwardSelection.ts +28 -0
  352. package/source/FeatureSelection/FeatureSubSet.ts +82 -0
  353. package/source/FeatureSelection/FloatingSelection.ts +27 -0
  354. package/source/FeatureSelection/ForwardSelection.ts +27 -0
  355. package/source/FeatureSelection/SubSetSelection.ts +88 -0
  356. package/source/Filter/DiscreteToContinuous.ts +59 -0
  357. package/source/Filter/DiscreteToIndexed.ts +48 -0
  358. package/source/Filter/FeatureFilter.ts +31 -0
  359. package/source/Filter/LaryFilter.ts +54 -0
  360. package/source/Filter/LaryToBinary.ts +57 -0
  361. package/source/Filter/Normalize.ts +42 -0
  362. package/source/Filter/Pca.ts +104 -0
  363. package/source/Filter/TrainedFeatureFilter.ts +17 -0
  364. package/source/Instance/CompositeInstance.ts +53 -0
  365. package/source/Instance/Instance.ts +170 -0
  366. package/source/InstanceList/InstanceList.ts +519 -0
  367. package/source/InstanceList/InstanceListOfSameClass.ts +25 -0
  368. package/source/InstanceList/Partition.ts +131 -0
  369. package/source/Model/DecisionTree/DecisionCondition.ts +74 -0
  370. package/source/Model/DecisionTree/DecisionNode.ts +257 -0
  371. package/source/Model/DecisionTree/DecisionTree.ts +71 -0
  372. package/source/Model/DeepNetworkModel.ts +156 -0
  373. package/source/Model/DummyModel.ts +40 -0
  374. package/source/Model/GaussianModel.ts +58 -0
  375. package/source/Model/KMeansModel.ts +44 -0
  376. package/source/Model/KnnInstance.ts +27 -0
  377. package/source/Model/KnnModel.ts +78 -0
  378. package/source/Model/LdaModel.ts +39 -0
  379. package/source/Model/LinearPerceptronModel.ts +55 -0
  380. package/source/Model/Model.ts +22 -0
  381. package/source/Model/MultiLayerPerceptronModel.ts +95 -0
  382. package/source/Model/NaiveBayesModel.ts +89 -0
  383. package/source/Model/NeuralNetworkModel.ts +187 -0
  384. package/source/Model/QdaModel.ts +39 -0
  385. package/source/Model/RandomModel.ts +44 -0
  386. package/source/Model/TreeEnsembleModel.ts +43 -0
  387. package/source/Model/ValidatedModel.ts +23 -0
  388. package/source/Parameter/ActivationFunction.ts +3 -0
  389. package/source/Parameter/BaggingParameter.ts +26 -0
  390. package/source/Parameter/C45Parameter.ts +38 -0
  391. package/source/Parameter/DeepNetworkParameter.ts +59 -0
  392. package/source/Parameter/KMeansParameter.ts +33 -0
  393. package/source/Parameter/KnnParameter.ts +28 -0
  394. package/source/Parameter/LinearPerceptronParameter.ts +66 -0
  395. package/source/Parameter/MultiLayerPerceptronParameter.ts +49 -0
  396. package/source/Parameter/Parameter.ts +22 -0
  397. package/source/Parameter/RandomForestParameter.ts +27 -0
  398. package/source/Performance/ClassificationPerformance.ts +26 -0
  399. package/source/Performance/ConfusionMatrix.ts +175 -0
  400. package/source/Performance/DetailedClassificationPerformance.ts +26 -0
  401. package/source/Performance/ExperimentPerformance.ts +175 -0
  402. package/source/Performance/Performance.ts +22 -0
  403. package/source/StatisticalTest/Combined5x2F.ts +33 -0
  404. package/source/StatisticalTest/Combined5x2t.ts +33 -0
  405. package/source/StatisticalTest/Paired5x2t.ts +32 -0
  406. package/source/StatisticalTest/PairedTest.ts +24 -0
  407. package/source/StatisticalTest/Pairedt.ts +30 -0
  408. package/source/StatisticalTest/Sign.ts +41 -0
  409. package/source/StatisticalTest/StatisticalTestResult.ts +42 -0
  410. package/source/StatisticalTest/StatisticalTestResultType.ts +6 -0
  411. package/source/tsconfig.json +13 -0
  412. package/tsconfig.json +15 -0
@@ -0,0 +1,44 @@
1
+ import {GaussianModel} from "./GaussianModel";
2
+ import {InstanceList} from "../InstanceList/InstanceList";
3
+ import {DistanceMetric} from "../DistanceMetric/DistanceMetric";
4
+ import {Instance} from "../Instance/Instance";
5
+ import {DiscreteDistribution} from "nlptoolkit-math/dist/DiscreteDistribution";
6
+
7
+ export class KMeansModel extends GaussianModel{
8
+
9
+ private classMeans: InstanceList
10
+ private distanceMetric: DistanceMetric
11
+
12
+ /**
13
+ * The constructor that sets the classMeans, priorDistribution and distanceMetric according to given inputs.
14
+ *
15
+ * @param priorDistribution {@link DiscreteDistribution} input.
16
+ * @param classMeans {@link InstanceList} of class means.
17
+ * @param distanceMetric {@link DistanceMetric} input.
18
+ */
19
+ constructor(priorDistribution: DiscreteDistribution, classMeans: InstanceList, distanceMetric: DistanceMetric) {
20
+ super();
21
+ this.classMeans = classMeans;
22
+ this.priorDistribution = priorDistribution;
23
+ this.distanceMetric = distanceMetric;
24
+ }
25
+
26
+ /**
27
+ * The calculateMetric method takes an {@link Instance} and a String as inputs. It loops through the class means, if
28
+ * the corresponding class label is same as the given String it returns the negated distance between given instance and the
29
+ * current item of class means. Otherwise it returns the smallest negative number.
30
+ *
31
+ * @param instance {@link Instance} input.
32
+ * @param Ci String input.
33
+ * @return The negated distance between given instance and the current item of class means.
34
+ */
35
+ calculateMetric(instance: Instance, Ci: string): number {
36
+ for (let i = 0; i < this.classMeans.size(); i++) {
37
+ if (this.classMeans.get(i).getClassLabel() == Ci) {
38
+ return -this.distanceMetric.distance(instance, this.classMeans.get(i));
39
+ }
40
+ }
41
+ return Number.NEGATIVE_INFINITY;
42
+ }
43
+
44
+ }
@@ -0,0 +1,27 @@
1
+ import {Instance} from "../Instance/Instance";
2
+
3
+ export class KnnInstance {
4
+
5
+ private readonly distance: number
6
+ private readonly instance: Instance
7
+
8
+ /**
9
+ * The constructor that sets the instance and distance value.
10
+ *
11
+ * @param instance {@link Instance} input.
12
+ * @param distance Double distance value.
13
+ */
14
+ constructor(instance: Instance, distance: number) {
15
+ this.instance = instance;
16
+ this.distance = distance;
17
+ }
18
+
19
+ getInstance(): Instance{
20
+ return this.instance
21
+ }
22
+
23
+ getDistance(): number{
24
+ return this.distance
25
+ }
26
+
27
+ }
@@ -0,0 +1,78 @@
1
+ import {Model} from "./Model";
2
+ import {InstanceList} from "../InstanceList/InstanceList";
3
+ import {Instance} from "../Instance/Instance";
4
+ import {DistanceMetric} from "../DistanceMetric/DistanceMetric";
5
+ import {CompositeInstance} from "../Instance/CompositeInstance";
6
+ import {KnnInstance} from "./KnnInstance";
7
+
8
+ export class KnnModel extends Model{
9
+
10
+ private data: InstanceList
11
+ private k: number
12
+ private distanceMetric: DistanceMetric
13
+
14
+ /**
15
+ * Constructor that sets the data {@link InstanceList}, k value and the {@link DistanceMetric}.
16
+ *
17
+ * @param data {@link InstanceList} input.
18
+ * @param k K value.
19
+ * @param distanceMetric {@link DistanceMetric} input.
20
+ */
21
+ constructor(data: InstanceList, k: number, distanceMetric: DistanceMetric) {
22
+ super();
23
+ this.data = data
24
+ this.k = k
25
+ this.distanceMetric = distanceMetric
26
+ }
27
+
28
+ /**
29
+ * The predict method takes an {@link Instance} as an input and finds the nearest neighbors of given instance. Then
30
+ * it returns the first possible class label as the predicted class.
31
+ *
32
+ * @param instance {@link Instance} to make prediction.
33
+ * @return The first possible class label as the predicted class.
34
+ */
35
+ predict(instance: Instance): string {
36
+ let nearestNeighbors = this.nearestNeighbors(instance);
37
+ let predictedClass
38
+ if (instance instanceof CompositeInstance && nearestNeighbors.size() == 0) {
39
+ predictedClass = (<CompositeInstance> instance).getPossibleClassLabels()[0];
40
+ } else {
41
+ predictedClass = Model.getMaximum(nearestNeighbors.getClassLabels());
42
+ }
43
+ return predictedClass;
44
+ }
45
+
46
+ predictProbability(instance: Instance): Map<string, number> {
47
+ let nearestNeighbors = this.nearestNeighbors(instance);
48
+ return nearestNeighbors.classDistribution().getProbabilityDistribution();
49
+ }
50
+
51
+ /**
52
+ * The nearestNeighbors method takes an {@link Instance} as an input. First it gets the possible class labels, then loops
53
+ * through the data {@link InstanceList} and creates new {@link Array} of {@link KnnInstance}s and adds the corresponding data with
54
+ * the distance between data and given instance. After sorting this newly created ArrayList, it loops k times and
55
+ * returns the first k instances as an {@link InstanceList}.
56
+ *
57
+ * @param instance {@link Instance} to find nearest neighbors/
58
+ * @return The first k instances which are nearest to the given instance as an {@link InstanceList}.
59
+ */
60
+ nearestNeighbors(instance: Instance): InstanceList{
61
+ let result = new InstanceList();
62
+ let instances = new Array<KnnInstance>();
63
+ let possibleClassLabels = undefined;
64
+ if (instance instanceof CompositeInstance) {
65
+ possibleClassLabels = (<CompositeInstance> instance).getPossibleClassLabels();
66
+ }
67
+ for (let i = 0; i < this.data.size(); i++) {
68
+ if (!(instance instanceof CompositeInstance) || possibleClassLabels.includes(this.data.get(i).getClassLabel())) {
69
+ instances.push(new KnnInstance(this.data.get(i), this.distanceMetric.distance(this.data.get(i), instance)));
70
+ }
71
+ }
72
+ instances.sort((a: KnnInstance, b: KnnInstance) => a.getDistance() < b.getDistance() ? -1 : a.getDistance() > b.getDistance() ? 1: 0);
73
+ for (let i = 0; i < Math.min(this.k, instances.length); i++) {
74
+ result.add(instances[i].getInstance());
75
+ }
76
+ return result;
77
+ }
78
+ }
@@ -0,0 +1,39 @@
1
+ import {GaussianModel} from "./GaussianModel";
2
+ import {Vector} from "nlptoolkit-math/dist/Vector";
3
+ import {DiscreteDistribution} from "nlptoolkit-math/dist/DiscreteDistribution";
4
+ import {Instance} from "../Instance/Instance";
5
+
6
+ export class LdaModel extends GaussianModel{
7
+
8
+ protected w0: Map<string, number>
9
+ protected w: Map<string, Vector>
10
+
11
+ /**
12
+ * A constructor which sets the priorDistribution, w and w0 according to given inputs.
13
+ *
14
+ * @param priorDistribution {@link DiscreteDistribution} input.
15
+ * @param w {@link HashMap} of String and Vectors.
16
+ * @param w0 {@link HashMap} of String and Double.
17
+ */
18
+ constructor(priorDistribution: DiscreteDistribution, w: Map<string, Vector>, w0: Map<string, number>) {
19
+ super();
20
+ this.priorDistribution = priorDistribution;
21
+ this.w = w;
22
+ this.w0 = w0;
23
+ }
24
+
25
+ /**
26
+ * The calculateMetric method takes an {@link Instance} and a String as inputs. It returns the dot product of given Instance
27
+ * and wi plus w0i.
28
+ *
29
+ * @param instance {@link Instance} input.
30
+ * @param Ci String input.
31
+ * @return The dot product of given Instance and wi plus w0i.
32
+ */
33
+ calculateMetric(instance: Instance, Ci: string): number {
34
+ let xi = instance.toVector();
35
+ let wi = this.w.get(Ci);
36
+ let w0i = this.w0.get(Ci);
37
+ return wi.dotProduct(xi) + w0i;
38
+ }
39
+ }
@@ -0,0 +1,55 @@
1
+ import {NeuralNetworkModel} from "./NeuralNetworkModel";
2
+ import {Matrix} from "nlptoolkit-math/dist/Matrix";
3
+ import {InstanceList} from "../InstanceList/InstanceList";
4
+ import {LinearPerceptronParameter} from "../Parameter/LinearPerceptronParameter";
5
+ import {ClassificationPerformance} from "../Performance/ClassificationPerformance";
6
+
7
+ export class LinearPerceptronModel extends NeuralNetworkModel{
8
+
9
+ protected W: Matrix
10
+
11
+ /**
12
+ * Constructor that takes {@link InstanceList}s as trainsSet and validationSet. Initially it allocates layer weights,
13
+ * then creates an input vector by using given trainSet and finds error. Via the validationSet it finds the classification
14
+ * performance and at the end it reassigns the allocated weight Matrix with the matrix that has the best accuracy.
15
+ *
16
+ * @param trainSet InstanceList that is used to train.
17
+ * @param validationSet InstanceList that is used to validate.
18
+ * @param parameters Linear perceptron parameters; learningRate, etaDecrease, crossValidationRatio, epoch.
19
+ */
20
+ constructor(trainSet: InstanceList, validationSet?: InstanceList, parameters?: LinearPerceptronParameter) {
21
+ super(trainSet);
22
+ if (validationSet != undefined){
23
+ let W = this.allocateLayerWeights(this.K, this.d + 1);
24
+ let bestW = W.clone();
25
+ let bestClassificationPerformance = new ClassificationPerformance(0.0);
26
+ let epoch = parameters.getEpoch();
27
+ let learningRate = parameters.getLearningRate();
28
+ for (let i = 0; i < epoch; i++) {
29
+ trainSet.shuffle(parameters.getSeed());
30
+ for (let j = 0; j < trainSet.size(); j++) {
31
+ this.createInputVector(trainSet.get(j));
32
+ let rMinusY = this.calculateRMinusY(trainSet.get(j), this.x, W);
33
+ let deltaW = new Matrix(rMinusY, this.x);
34
+ deltaW.multiplyWithConstant(learningRate);
35
+ W.add(deltaW);
36
+ }
37
+ let currentClassificationPerformance = this.testClassifier(validationSet);
38
+ if (currentClassificationPerformance.getAccuracy() > bestClassificationPerformance.getAccuracy()) {
39
+ bestClassificationPerformance = currentClassificationPerformance;
40
+ bestW = W.clone();
41
+ }
42
+ learningRate *= parameters.getEtaDecrease();
43
+ }
44
+ W = bestW;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * The calculateOutput method calculates the {@link Matrix} y by multiplying Matrix W with {@link Vector} x.
50
+ */
51
+ protected calculateOutput(): void {
52
+ this.y = this.W.multiplyWithVectorFromRight(this.x);
53
+ }
54
+
55
+ }
@@ -0,0 +1,22 @@
1
+ import {Instance} from "../Instance/Instance";
2
+ import {CounterHashMap} from "nlptoolkit-datastructure/dist/CounterHashMap";
3
+
4
+ export abstract class Model {
5
+
6
+ abstract predict(instance: Instance): string
7
+ abstract predictProbability(instance: Instance): Map<string, number>
8
+
9
+ /**
10
+ * Given an array of class labels, returns the maximum occurred one.
11
+ *
12
+ * @param classLabels An array of class labels.
13
+ * @return The class label that occurs most in the array of class labels (mod of class label list).
14
+ */
15
+ static getMaximum(classLabels: Array<string>): string{
16
+ let frequencies = new CounterHashMap<string>();
17
+ for (let label of classLabels) {
18
+ frequencies.put(label);
19
+ }
20
+ return frequencies.max();
21
+ }
22
+ }
@@ -0,0 +1,95 @@
1
+ import {LinearPerceptronModel} from "./LinearPerceptronModel";
2
+ import {Matrix} from "nlptoolkit-math/dist/Matrix";
3
+ import {ActivationFunction} from "../Parameter/ActivationFunction";
4
+ import {InstanceList} from "../InstanceList/InstanceList";
5
+ import {MultiLayerPerceptronParameter} from "../Parameter/MultiLayerPerceptronParameter";
6
+ import {ClassificationPerformance} from "../Performance/ClassificationPerformance";
7
+ import {Vector} from "nlptoolkit-math/dist/Vector";
8
+
9
+ export class MultiLayerPerceptronModel extends LinearPerceptronModel{
10
+
11
+ private V: Matrix
12
+ protected activationFunction: ActivationFunction
13
+
14
+ /**
15
+ * The allocateWeights method allocates layers' weights of Matrix W and V.
16
+ *
17
+ * @param H Integer value for weights.
18
+ */
19
+ private allocateWeights(H: number){
20
+ this.W = this.allocateLayerWeights(H, this.d + 1);
21
+ this.V = this.allocateLayerWeights(this.K, H + 1);
22
+ }
23
+
24
+ /**
25
+ * A constructor that takes {@link InstanceList}s as trainsSet and validationSet. It sets the {@link NeuralNetworkModel}
26
+ * nodes with given {@link InstanceList} then creates an input vector by using given trainSet and finds error.
27
+ * Via the validationSet it finds the classification performance and reassigns the allocated weight Matrix with the matrix
28
+ * that has the best accuracy and the Matrix V with the best Vector input.
29
+ *
30
+ * @param trainSet InstanceList that is used to train.
31
+ * @param validationSet InstanceList that is used to validate.
32
+ * @param parameters Multi layer perceptron parameters; seed, learningRate, etaDecrease, crossValidationRatio, epoch, hiddenNodes.
33
+ */
34
+ constructor(trainSet: InstanceList, validationSet: InstanceList, parameters: MultiLayerPerceptronParameter) {
35
+ super(trainSet);
36
+ this.activationFunction = parameters.getActivationFunction();
37
+ this.allocateWeights(parameters.getHiddenNodes());
38
+ let bestW = this.W.clone();
39
+ let bestV = this.V.clone();
40
+ let bestClassificationPerformance = new ClassificationPerformance(0.0);
41
+ let epoch = parameters.getEpoch();
42
+ let learningRate = parameters.getLearningRate();
43
+ for (let i = 0; i < epoch; i++) {
44
+ trainSet.shuffle(parameters.getSeed());
45
+ for (let j = 0; j < trainSet.size(); j++) {
46
+ this.createInputVector(trainSet.get(j));
47
+ let hidden = this.calculateHidden(this.x, this.W, this.activationFunction);
48
+ let hiddenBiased = hidden.biased();
49
+ let rMinusY = this.calculateRMinusY(trainSet.get(j), hiddenBiased, this.V);
50
+ let deltaV = new Matrix(rMinusY, hiddenBiased);
51
+ let tmph = this.V.multiplyWithVectorFromLeft(rMinusY);
52
+ tmph.remove(0);
53
+ let activationDerivative
54
+ switch (this.activationFunction){
55
+ case ActivationFunction.SIGMOID:
56
+ default:
57
+ let oneMinusHidden = this.calculateOneMinusHidden(hidden);
58
+ activationDerivative = oneMinusHidden.elementProduct(hidden);
59
+ break;
60
+ case ActivationFunction.TANH:
61
+ let one = new Vector(hidden.size(), 1.0);
62
+ hidden.tanh();
63
+ activationDerivative = one.difference(hidden.elementProduct(hidden));
64
+ break;
65
+ case ActivationFunction.RELU:
66
+ hidden.reluDerivative();
67
+ activationDerivative = hidden;
68
+ break;
69
+ }
70
+ let tmpHidden = tmph.elementProduct(activationDerivative);
71
+ let deltaW = new Matrix(tmpHidden, this.x);
72
+ deltaV.multiplyWithConstant(learningRate);
73
+ this.V.add(deltaV);
74
+ deltaW.multiplyWithConstant(learningRate);
75
+ this.W.add(deltaW);
76
+ }
77
+ let currentClassificationPerformance = this.testClassifier(validationSet);
78
+ if (currentClassificationPerformance.getAccuracy() > bestClassificationPerformance.getAccuracy()) {
79
+ bestClassificationPerformance = currentClassificationPerformance;
80
+ bestW = this.W.clone();
81
+ bestV = this.V.clone();
82
+ }
83
+ learningRate *= parameters.getEtaDecrease();
84
+ }
85
+ this.W = bestW;
86
+ this.V = bestV;
87
+ }
88
+
89
+ /**
90
+ * The calculateOutput method calculates the forward single hidden layer by using Matrices W and V.
91
+ */
92
+ protected calculateOutput() {
93
+ this.calculateForwardSingleHiddenLayer(this.W, this.V, this.activationFunction);
94
+ }
95
+ }
@@ -0,0 +1,89 @@
1
+ import {GaussianModel} from "./GaussianModel";
2
+ import {Instance} from "../Instance/Instance";
3
+ import {Vector} from "nlptoolkit-math/dist/Vector";
4
+ import {DiscreteDistribution} from "nlptoolkit-math/dist/DiscreteDistribution";
5
+ import {ContinuousAttribute} from "../Attribute/ContinuousAttribute";
6
+ import {DiscreteAttribute} from "../Attribute/DiscreteAttribute";
7
+
8
+ export class NaiveBayesModel extends GaussianModel{
9
+
10
+ private classMeans: Map<string, Vector> = undefined
11
+ private classDeviations: Map<string, Vector> = undefined
12
+ private readonly classAttributeDistributions: Map<string, Array<DiscreteDistribution>> = undefined
13
+
14
+ /**
15
+ * A constructor that sets the priorDistribution, classMeans and classDeviations.
16
+ *
17
+ * @param priorDistribution {@link DiscreteDistribution} input.
18
+ * @param classMeans A {@link Map} of String and {@link Vector}.
19
+ * @param classDeviations A {@link Map} of String and {@link Vector}.
20
+ */
21
+ constructor(priorDistribution: DiscreteDistribution, classMeans: any, classDeviations?: Map<string, Vector>) {
22
+ super();
23
+ this.priorDistribution = priorDistribution
24
+ if (classDeviations != undefined){
25
+ this.classMeans = classMeans
26
+ this.classDeviations = classDeviations
27
+ } else {
28
+ this.classAttributeDistributions = classMeans
29
+ }
30
+ }
31
+
32
+ /**
33
+ * The calculateMetric method takes an {@link Instance} and a String as inputs, and it returns the log likelihood of
34
+ * these inputs.
35
+ *
36
+ * @param instance {@link Instance} input.
37
+ * @param Ci String input.
38
+ * @return The log likelihood of inputs.
39
+ */
40
+ calculateMetric(instance: Instance, Ci: string): number {
41
+ if (this.classAttributeDistributions == undefined) {
42
+ return this.logLikelihoodContinuous(Ci, instance);
43
+ } else {
44
+ return this.logLikelihoodDiscrete(Ci, instance);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * The logLikelihoodContinuous method takes an {@link Instance} and a class label as inputs. First it gets the logarithm
50
+ * of given class label's probability via prior distribution as logLikelihood. Then it loops times of given instance attribute size, and accumulates the
51
+ * logLikelihood by calculating -0.5 * ((xi - mi) / si )** 2).
52
+ *
53
+ * @param classLabel String input class label.
54
+ * @param instance {@link Instance} input.
55
+ * @return The log likelihood of given class label and {@link Instance}.
56
+ */
57
+ private logLikelihoodContinuous(classLabel: string, instance: Instance): number{
58
+ let logLikelihood = Math.log(this.priorDistribution.getProbability(classLabel));
59
+ for (let i = 0; i < instance.attributeSize(); i++) {
60
+ let xi = (<ContinuousAttribute> instance.getAttribute(i)).getValue();
61
+ let mi = this.classMeans.get(classLabel).getValue(i);
62
+ let si = this.classDeviations.get(classLabel).getValue(i);
63
+ if (si != 0){
64
+ logLikelihood += -0.5 * Math.pow((xi - mi) / si, 2);
65
+ }
66
+ }
67
+ return logLikelihood;
68
+ }
69
+
70
+ /**
71
+ * The logLikelihoodDiscrete method takes an {@link Instance} and a class label as inputs. First it gets the logarithm
72
+ * of given class label's probability via prior distribution as logLikelihood and gets the class attribute distribution of given class label.
73
+ * Then it loops times of given instance attribute size, and accumulates the logLikelihood by calculating the logarithm of
74
+ * corresponding attribute distribution's smoothed probability by using laplace smoothing on xi.
75
+ *
76
+ * @param classLabel String input class label.
77
+ * @param instance {@link Instance} input.
78
+ * @return The log likelihood of given class label and {@link Instance}.
79
+ */
80
+ private logLikelihoodDiscrete(classLabel: string, instance: Instance): number{
81
+ let logLikelihood = Math.log(this.priorDistribution.getProbability(classLabel));
82
+ let attributeDistributions = this.classAttributeDistributions.get(classLabel);
83
+ for (let i = 0; i < instance.attributeSize(); i++) {
84
+ let xi = (<DiscreteAttribute> instance.getAttribute(i)).getValue();
85
+ logLikelihood += Math.log(attributeDistributions[i].getProbabilityLaplaceSmoothing(xi));
86
+ }
87
+ return logLikelihood;
88
+ }
89
+ }
@@ -0,0 +1,187 @@
1
+ import {ValidatedModel} from "./ValidatedModel";
2
+ import {Vector} from "nlptoolkit-math/dist/Vector";
3
+ import {InstanceList} from "../InstanceList/InstanceList";
4
+ import {Matrix} from "nlptoolkit-math/dist/Matrix";
5
+ import {Instance} from "../Instance/Instance";
6
+ import {ActivationFunction} from "../Parameter/ActivationFunction";
7
+ import {CompositeInstance} from "../Instance/CompositeInstance";
8
+
9
+ export abstract class NeuralNetworkModel extends ValidatedModel{
10
+
11
+ protected classLabels: Array<string>
12
+ protected K: number
13
+ protected d: number
14
+ protected x: Vector
15
+ protected y: Vector
16
+ protected r: Vector
17
+
18
+ protected abstract calculateOutput(): void
19
+
20
+ /**
21
+ * Constructor that sets the class labels, their sizes as K and the size of the continuous attributes as d.
22
+ *
23
+ * @param trainSet {@link InstanceList} to use as train set.
24
+ */
25
+ protected constructor(trainSet: InstanceList) {
26
+ super();
27
+ this.classLabels = trainSet.getDistinctClassLabels()
28
+ this.K = this.classLabels.length
29
+ this.d = trainSet.get(0).continuousAttributeSize()
30
+ }
31
+
32
+ /**
33
+ * The allocateLayerWeights method returns a new {@link Matrix} with random weights.
34
+ *
35
+ * @param row Number of rows.
36
+ * @param column Number of columns.
37
+ * @return Matrix with random weights.
38
+ */
39
+ protected allocateLayerWeights(row: number, column: number): Matrix{
40
+ return new Matrix(row, column, -0.01, +0.01);
41
+ }
42
+
43
+ /**
44
+ * The normalizeOutput method takes an input {@link Vector} o, gets the result for e^o of each element of o,
45
+ * then sums them up. At the end, divides each e^o by the summation.
46
+ *
47
+ * @param o Vector to normalize.
48
+ * @return Normalized vector.
49
+ */
50
+ protected normalizeOutput(o: Vector): Vector{
51
+ let sum = 0.0;
52
+ let values = new Array<number>()
53
+ for (let i = 0; i < values.length; i++){
54
+ sum += Math.exp(o.getValue(i));
55
+ }
56
+ for (let i = 0; i < values.length; i++){
57
+ values.push(Math.exp(o.getValue(i)) / sum);
58
+ }
59
+ return new Vector(values);
60
+ }
61
+
62
+ /**
63
+ * The createInputVector method takes an {@link Instance} as an input. It converts given Instance to the {@link Vector}
64
+ * and insert 1.0 to the first element.
65
+ *
66
+ * @param instance Instance to insert 1.0.
67
+ */
68
+ protected createInputVector(instance: Instance){
69
+ this.x = instance.toVector();
70
+ this.x.insert(0, 1.0);
71
+ }
72
+
73
+ /**
74
+ * The calculateHidden method takes a {@link Vector} input and {@link Matrix} weights, It multiplies the weights
75
+ * Matrix with given input Vector than applies the sigmoid function and returns the result.
76
+ *
77
+ * @param input Vector to multiply weights.
78
+ * @param weights Matrix is multiplied with input Vector.
79
+ * @param activationFunction Activation function.
80
+ * @return Result of sigmoid function.
81
+ */
82
+ protected calculateHidden(input: Vector, weights: Matrix, activationFunction: ActivationFunction): Vector{
83
+ let z = weights.multiplyWithVectorFromRight(input);
84
+ switch (activationFunction){
85
+ case ActivationFunction.SIGMOID:
86
+ default:
87
+ z.sigmoid();
88
+ break;
89
+ case ActivationFunction.TANH:
90
+ z.tanh();
91
+ break;
92
+ case ActivationFunction.RELU:
93
+ z.relu();
94
+ break;
95
+ }
96
+ return z;
97
+ }
98
+
99
+ /**
100
+ * The calculateOneMinusHidden method takes a {@link Vector} as input. It creates a Vector of ones and
101
+ * returns the difference between given Vector.
102
+ *
103
+ * @param hidden Vector to find difference.
104
+ * @return Returns the difference between one's Vector and input Vector.
105
+ */
106
+ protected calculateOneMinusHidden(hidden: Vector): Vector{
107
+ let one = new Vector(hidden.size(), 1.0);
108
+ return one.difference(hidden);
109
+ }
110
+
111
+ /**
112
+ * The calculateForwardSingleHiddenLayer method takes two matrices W and V. First it multiplies W with x, then
113
+ * multiplies V with the result of the previous multiplication.
114
+ *
115
+ * @param W Matrix to multiply with x.
116
+ * @param V Matrix to multiply.
117
+ * @param activationFunction Activation function.
118
+ */
119
+ protected calculateForwardSingleHiddenLayer(W: Matrix, V: Matrix, activationFunction: ActivationFunction){
120
+ let hidden = this.calculateHidden(this.x, W, activationFunction);
121
+ let hiddenBiased = hidden.biased();
122
+ this.y = V.multiplyWithVectorFromRight(hiddenBiased);
123
+ }
124
+
125
+ /**
126
+ * The calculateRMinusY method creates a new {@link Vector} with given Instance, then it multiplies given
127
+ * input Vector with given weights Matrix. After normalizing the output, it returns the difference between the newly created
128
+ * Vector and normalized output.
129
+ *
130
+ * @param instance Instance is used to get class labels.
131
+ * @param input Vector to multiply weights.
132
+ * @param weights Matrix of weights/
133
+ * @return Difference between newly created Vector and normalized output.
134
+ */
135
+ protected calculateRMinusY(instance: Instance, input: Vector, weights: Matrix): Vector{
136
+ this.r = new Vector(this.K, this.classLabels.indexOf(instance.getClassLabel()), 1.0);
137
+ let o = weights.multiplyWithVectorFromRight(input);
138
+ this.y = this.normalizeOutput(o);
139
+ return this.r.difference(this.y);
140
+ }
141
+
142
+ /**
143
+ * The predictWithCompositeInstance method takes an ArrayList possibleClassLabels. It returns the class label
144
+ * which has the maximum value of y.
145
+ *
146
+ * @param possibleClassLabels ArrayList that has the class labels.
147
+ * @return The class label which has the maximum value of y.
148
+ */
149
+ protected predictWithCompositeInstance(possibleClassLabels: Array<string>){
150
+ let predictedClass = possibleClassLabels[0];
151
+ let maxY = Number.NEGATIVE_INFINITY
152
+ for (let i = 0; i < this.classLabels.length; i++) {
153
+ if (possibleClassLabels.includes(this.classLabels[i]) && this.y.getValue(i) > maxY) {
154
+ maxY = this.y.getValue(i);
155
+ predictedClass = this.classLabels[i];
156
+ }
157
+ }
158
+ return predictedClass;
159
+ }
160
+
161
+ /**
162
+ * The predict method takes an {@link Instance} as an input, converts it to a Vector and calculates the {@link Matrix} y by
163
+ * multiplying Matrix W with {@link Vector} x. Then it returns the class label which has the maximum y value.
164
+ *
165
+ * @param instance Instance to predict.
166
+ * @return The class label which has the maximum y.
167
+ */
168
+ predict(instance: Instance): string {
169
+ this.createInputVector(instance);
170
+ this.calculateOutput();
171
+ if (instance instanceof CompositeInstance) {
172
+ return this.predictWithCompositeInstance((<CompositeInstance> instance).getPossibleClassLabels());
173
+ } else {
174
+ return this.classLabels[this.y.maxIndex()];
175
+ }
176
+ }
177
+
178
+ predictProbability(instance: Instance): Map<string, number> {
179
+ this.createInputVector(instance);
180
+ this.calculateOutput();
181
+ let result = new Map<string, number>();
182
+ for (let i = 0; i < this.classLabels.length; i++){
183
+ result.set(this.classLabels[i], this.y.getValue(i));
184
+ }
185
+ return result;
186
+ }
187
+ }