From 56114d99ce650c6e797a74c464e1b91ef6c04c71 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Mon, 2 May 2016 23:06:17 +0200 Subject: [PATCH 01/30] fix param casting for hhvm compatibility --- src/Phpml/Clustering/KMeans/Point.php | 2 +- src/Phpml/Math/Distance/Euclidean.php | 2 +- src/Phpml/Math/Matrix.php | 4 ++-- src/Phpml/Math/Statistic/Correlation.php | 2 +- src/Phpml/Math/Statistic/StandardDeviation.php | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Phpml/Clustering/KMeans/Point.php b/src/Phpml/Clustering/KMeans/Point.php index 9ff4b45..eb5bb78 100644 --- a/src/Phpml/Clustering/KMeans/Point.php +++ b/src/Phpml/Clustering/KMeans/Point.php @@ -49,7 +49,7 @@ class Point implements ArrayAccess $distance += $difference * $difference; } - return $precise ? sqrt($distance) : $distance; + return $precise ? sqrt((float)$distance) : $distance; } /** diff --git a/src/Phpml/Math/Distance/Euclidean.php b/src/Phpml/Math/Distance/Euclidean.php index cca8f2b..1b6083b 100644 --- a/src/Phpml/Math/Distance/Euclidean.php +++ b/src/Phpml/Math/Distance/Euclidean.php @@ -30,6 +30,6 @@ class Euclidean implements Distance $distance += pow($a[$i] - $b[$i], 2); } - return sqrt($distance); + return sqrt((float)$distance); } } diff --git a/src/Phpml/Math/Matrix.php b/src/Phpml/Math/Matrix.php index 7c04119..d15629a 100644 --- a/src/Phpml/Math/Matrix.php +++ b/src/Phpml/Math/Matrix.php @@ -147,7 +147,7 @@ class Matrix for ($j = 0; $j < $this->columns; ++$j) { $subMatrix = $this->crossOut(0, $j); $minor = $this->matrix[0][$j] * $subMatrix->getDeterminant(); - $determinant += fmod($j, 2) == 0 ? $minor : -$minor; + $determinant += fmod((float)$j, 2.0) == 0 ? $minor : -$minor; } } @@ -236,7 +236,7 @@ class Matrix for ($i = 0; $i < $this->rows; ++$i) { for ($j = 0; $j < $this->columns; ++$j) { $minor = $this->crossOut($i, $j)->getDeterminant(); - $newMatrix[$i][$j] = fmod($i + $j, 2) == 0 ? $minor : -$minor; + $newMatrix[$i][$j] = fmod((float)($i + $j), 2.0) == 0 ? $minor : -$minor; } } diff --git a/src/Phpml/Math/Statistic/Correlation.php b/src/Phpml/Math/Statistic/Correlation.php index 1d2e8ac..842008c 100644 --- a/src/Phpml/Math/Statistic/Correlation.php +++ b/src/Phpml/Math/Statistic/Correlation.php @@ -38,7 +38,7 @@ class Correlation $b2 = $b2 + pow($b, 2); } - $corr = $axb / sqrt($a2 * $b2); + $corr = $axb / sqrt((float)($a2 * $b2)); return $corr; } diff --git a/src/Phpml/Math/Statistic/StandardDeviation.php b/src/Phpml/Math/Statistic/StandardDeviation.php index 2b03c54..8ecb234 100644 --- a/src/Phpml/Math/Statistic/StandardDeviation.php +++ b/src/Phpml/Math/Statistic/StandardDeviation.php @@ -39,6 +39,6 @@ class StandardDeviation --$n; } - return sqrt($carry / $n); + return sqrt((float)($carry / $n)); } } From 5c67cfaeef28a36b82949cc8c6b896745385a03b Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Mon, 2 May 2016 23:36:58 +0200 Subject: [PATCH 02/30] refactor kmeans init methods --- src/Phpml/Clustering/KMeans/Point.php | 2 +- src/Phpml/Clustering/KMeans/Space.php | 82 ++++++++++++------- src/Phpml/Math/Distance/Euclidean.php | 2 +- src/Phpml/Math/Matrix.php | 4 +- src/Phpml/Math/Statistic/Correlation.php | 2 +- .../Math/Statistic/StandardDeviation.php | 2 +- 6 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/Phpml/Clustering/KMeans/Point.php b/src/Phpml/Clustering/KMeans/Point.php index eb5bb78..5dcf5ec 100644 --- a/src/Phpml/Clustering/KMeans/Point.php +++ b/src/Phpml/Clustering/KMeans/Point.php @@ -49,7 +49,7 @@ class Point implements ArrayAccess $distance += $difference * $difference; } - return $precise ? sqrt((float)$distance) : $distance; + return $precise ? sqrt((float) $distance) : $distance; } /** diff --git a/src/Phpml/Clustering/KMeans/Space.php b/src/Phpml/Clustering/KMeans/Space.php index 2976434..2904e2f 100644 --- a/src/Phpml/Clustering/KMeans/Space.php +++ b/src/Phpml/Clustering/KMeans/Space.php @@ -150,37 +150,11 @@ class Space extends SplObjectStorage { switch ($initMethod) { case KMeans::INIT_RANDOM: - list($min, $max) = $this->getBoundaries(); - for ($n = 0; $n < $clustersNumber; ++$n) { - $clusters[] = new Cluster($this, $this->getRandomPoint($min, $max)->getCoordinates()); - } + $clusters = $this->initializeRandomClusters($clustersNumber); break; case KMeans::INIT_KMEANS_PLUS_PLUS: - $position = rand(1, count($this)); - for ($i = 1, $this->rewind(); $i < $position && $this->valid(); $i++, $this->next()); - $clusters[] = new Cluster($this, $this->current()->getCoordinates()); - - $distances = new SplObjectStorage(); - - for ($i = 1; $i < $clustersNumber; ++$i) { - $sum = 0; - foreach ($this as $point) { - $distance = $point->getDistanceWith($point->getClosest($clusters)); - $sum += $distances[$point] = $distance; - } - - $sum = rand(0, (int) $sum); - foreach ($this as $point) { - if (($sum -= $distances[$point]) > 0) { - continue; - } - - $clusters[] = new Cluster($this, $point->getCoordinates()); - break; - } - } - + $clusters = $this->initializeKMPPClusters($clustersNumber); break; } $clusters[0]->attachAll($this); @@ -230,4 +204,56 @@ class Space extends SplObjectStorage return $convergence; } + + /** + * @param int $clustersNumber + * + * @return array + */ + private function initializeRandomClusters(int $clustersNumber) + { + $clusters = []; + list($min, $max) = $this->getBoundaries(); + + for ($n = 0; $n < $clustersNumber; ++$n) { + $clusters[] = new Cluster($this, $this->getRandomPoint($min, $max)->getCoordinates()); + } + + return $clusters; + } + + /** + * @param int $clustersNumber + * + * @return array + */ + protected function initializeKMPPClusters(int $clustersNumber) + { + $clusters = []; + $position = rand(1, count($this)); + for ($i = 1, $this->rewind(); $i < $position && $this->valid(); $i++, $this->next()); + $clusters[] = new Cluster($this, $this->current()->getCoordinates()); + + $distances = new SplObjectStorage(); + + for ($i = 1; $i < $clustersNumber; ++$i) { + $sum = 0; + foreach ($this as $point) { + $distance = $point->getDistanceWith($point->getClosest($clusters)); + $sum += $distances[$point] = $distance; + } + + $sum = rand(0, (int) $sum); + foreach ($this as $point) { + if (($sum -= $distances[$point]) > 0) { + continue; + } + + $clusters[] = new Cluster($this, $point->getCoordinates()); + break; + } + } + + return $clusters; + } } diff --git a/src/Phpml/Math/Distance/Euclidean.php b/src/Phpml/Math/Distance/Euclidean.php index 1b6083b..21a6aa9 100644 --- a/src/Phpml/Math/Distance/Euclidean.php +++ b/src/Phpml/Math/Distance/Euclidean.php @@ -30,6 +30,6 @@ class Euclidean implements Distance $distance += pow($a[$i] - $b[$i], 2); } - return sqrt((float)$distance); + return sqrt((float) $distance); } } diff --git a/src/Phpml/Math/Matrix.php b/src/Phpml/Math/Matrix.php index d15629a..208b10d 100644 --- a/src/Phpml/Math/Matrix.php +++ b/src/Phpml/Math/Matrix.php @@ -147,7 +147,7 @@ class Matrix for ($j = 0; $j < $this->columns; ++$j) { $subMatrix = $this->crossOut(0, $j); $minor = $this->matrix[0][$j] * $subMatrix->getDeterminant(); - $determinant += fmod((float)$j, 2.0) == 0 ? $minor : -$minor; + $determinant += fmod((float) $j, 2.0) == 0 ? $minor : -$minor; } } @@ -236,7 +236,7 @@ class Matrix for ($i = 0; $i < $this->rows; ++$i) { for ($j = 0; $j < $this->columns; ++$j) { $minor = $this->crossOut($i, $j)->getDeterminant(); - $newMatrix[$i][$j] = fmod((float)($i + $j), 2.0) == 0 ? $minor : -$minor; + $newMatrix[$i][$j] = fmod((float) ($i + $j), 2.0) == 0 ? $minor : -$minor; } } diff --git a/src/Phpml/Math/Statistic/Correlation.php b/src/Phpml/Math/Statistic/Correlation.php index 842008c..e9c0e30 100644 --- a/src/Phpml/Math/Statistic/Correlation.php +++ b/src/Phpml/Math/Statistic/Correlation.php @@ -38,7 +38,7 @@ class Correlation $b2 = $b2 + pow($b, 2); } - $corr = $axb / sqrt((float)($a2 * $b2)); + $corr = $axb / sqrt((float) ($a2 * $b2)); return $corr; } diff --git a/src/Phpml/Math/Statistic/StandardDeviation.php b/src/Phpml/Math/Statistic/StandardDeviation.php index 8ecb234..6e161fb 100644 --- a/src/Phpml/Math/Statistic/StandardDeviation.php +++ b/src/Phpml/Math/Statistic/StandardDeviation.php @@ -39,6 +39,6 @@ class StandardDeviation --$n; } - return sqrt((float)($carry / $n)); + return sqrt((float) ($carry / $n)); } } From fadd003169f490c9297174c9814c69e175e0ba6e Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Tue, 3 May 2016 00:33:18 +0200 Subject: [PATCH 03/30] create whitespace tokenizer --- src/Phpml/Tokenization/Tokenizer.php | 15 +++++++ .../Tokenization/WhitespaceTokenizer.php | 18 +++++++++ .../Tokenization/WhitespaceTokenizerTest.php | 40 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/Phpml/Tokenization/Tokenizer.php create mode 100644 src/Phpml/Tokenization/WhitespaceTokenizer.php create mode 100644 tests/Phpml/Tokenization/WhitespaceTokenizerTest.php diff --git a/src/Phpml/Tokenization/Tokenizer.php b/src/Phpml/Tokenization/Tokenizer.php new file mode 100644 index 0000000..5539a85 --- /dev/null +++ b/src/Phpml/Tokenization/Tokenizer.php @@ -0,0 +1,15 @@ +assertEquals($tokens, $tokenizer->tokenize($text)); + } + + public function testTokenizationOnUtf8() + { + $tokenizer = new WhitespaceTokenizer(); + + $text = '鋍鞎 鳼 鞮鞢騉 袟袘觕, 炟砏 蒮 謺貙蹖 偢偣唲 蒛 箷箯緷 鑴鱱爧 覮轀, + 剆坲 煘煓瑐 鬐鶤鶐 飹勫嫢 銪 餀 枲柊氠 鍎鞚韕 焲犈, + 殍涾烰 齞齝囃 蹅輶 鄜, 孻憵 擙樲橚 藒襓謥 岯岪弨 蒮 廞徲 孻憵懥 趡趛踠 槏'; + + $tokens = ['鋍鞎', '鳼', '鞮鞢騉', '袟袘觕,', '炟砏', '蒮', '謺貙蹖', '偢偣唲', '蒛', '箷箯緷', '鑴鱱爧', '覮轀,', + '剆坲', '煘煓瑐', '鬐鶤鶐', '飹勫嫢', '銪', '餀', '枲柊氠', '鍎鞚韕', '焲犈,', + '殍涾烰', '齞齝囃', '蹅輶', '鄜,', '孻憵', '擙樲橚', '藒襓謥', '岯岪弨', '蒮', '廞徲', '孻憵懥', '趡趛踠', '槏', ]; + + $this->assertEquals($tokens, $tokenizer->tokenize($text)); + } +} From a8af599cc1d9b2fc17d4bac78854621629270da0 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Tue, 3 May 2016 12:03:36 +0200 Subject: [PATCH 04/30] add filter for code coverage --- phpunit.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/phpunit.xml b/phpunit.xml index d31e033..cbf6c18 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -11,4 +11,11 @@ tests/* ​ + + + + src + + + From 96df5f6d7e27b7ee4674a5b6d5beaf6186737f77 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Tue, 3 May 2016 12:35:57 +0200 Subject: [PATCH 05/30] add config for humbug - mutation test framework --- .gitignore | 1 + humbug.json.dist | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 humbug.json.dist diff --git a/.gitignore b/.gitignore index 57872d0..55f5b64 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /vendor/ +humbuglog.* diff --git a/humbug.json.dist b/humbug.json.dist new file mode 100644 index 0000000..2535633 --- /dev/null +++ b/humbug.json.dist @@ -0,0 +1,11 @@ +{ + "source": { + "directories": [ + "src" + ] + }, + "timeout": 10, + "logs": { + "text": "humbuglog.txt" + } +} From 00178cdd45405a29f168a75e4a9ce6fb3170f7e7 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Tue, 3 May 2016 13:08:09 +0200 Subject: [PATCH 06/30] change docs and readme title --- README.md | 2 +- mkdocs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d3f65b7..4b0e6a8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PHP Machine Learning library +# PHP-ML - Machine Learning library for PHP [![Build Status](https://scrutinizer-ci.com/g/php-ai/php-ml/badges/build.png?b=develop)](https://scrutinizer-ci.com/g/php-ai/php-ml/build-status/develop) [![Documentation Status](https://readthedocs.org/projects/php-ml/badge/?version=develop)](http://php-ml.readthedocs.org/en/develop/?badge=develop) diff --git a/mkdocs.yml b/mkdocs.yml index eac1c17..a596d91 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: PHP Machine Learning (PHP-ML) +site_name: PHP-ML - Machine Learning library for PHP pages: - Home: index.md - Machine Learning: From c05ce8c542e6364c734cb0842331e58ee25316a5 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Tue, 3 May 2016 23:28:29 +0200 Subject: [PATCH 07/30] feature extractions tools - TokenCountVectorizez --- .../TokenCountVectorizer.php | 163 ++++++++++++++++++ src/Phpml/FeatureExtraction/Vectorizer.php | 15 ++ .../TokenCountVectorizerTest.php | 73 ++++++++ 3 files changed, 251 insertions(+) create mode 100644 src/Phpml/FeatureExtraction/TokenCountVectorizer.php create mode 100644 src/Phpml/FeatureExtraction/Vectorizer.php create mode 100644 tests/Phpml/FeatureExtraction/TokenCountVectorizerTest.php diff --git a/src/Phpml/FeatureExtraction/TokenCountVectorizer.php b/src/Phpml/FeatureExtraction/TokenCountVectorizer.php new file mode 100644 index 0000000..14fc69c --- /dev/null +++ b/src/Phpml/FeatureExtraction/TokenCountVectorizer.php @@ -0,0 +1,163 @@ +tokenizer = $tokenizer; + $this->minDF = $minDF; + $this->vocabulary = []; + $this->frequencies = []; + } + + /** + * @param array $samples + * + * @return array + */ + public function transform(array $samples): array + { + foreach ($samples as $index => $sample) { + $samples[$index] = $this->transformSample($sample); + } + + $samples = $this->checkDocumentFrequency($samples); + + return $samples; + } + + /** + * @return array + */ + public function getVocabulary() + { + return array_flip($this->vocabulary); + } + + /** + * @param string $sample + * + * @return array + */ + private function transformSample(string $sample) + { + $counts = []; + $tokens = $this->tokenizer->tokenize($sample); + foreach ($tokens as $token) { + $index = $this->getTokenIndex($token); + $this->updateFrequency($token); + if (!isset($counts[$index])) { + $counts[$index] = 0; + } + + ++$counts[$index]; + } + + return $counts; + } + + /** + * @param string $token + * + * @return mixed + */ + private function getTokenIndex(string $token) + { + if (!isset($this->vocabulary[$token])) { + $this->vocabulary[$token] = count($this->vocabulary); + } + + return $this->vocabulary[$token]; + } + + /** + * @param string $token + */ + private function updateFrequency(string $token) + { + if (!isset($this->frequencies[$token])) { + $this->frequencies[$token] = 0; + } + + ++$this->frequencies[$token]; + } + + /** + * @param array $samples + * + * @return array + */ + private function checkDocumentFrequency(array $samples) + { + if ($this->minDF > 0) { + $beyondMinimum = $this->getBeyondMinimumIndexes(count($samples)); + foreach ($samples as $index => $sample) { + $samples[$index] = $this->unsetBeyondMinimum($sample, $beyondMinimum); + } + } + + return $samples; + } + + /** + * @param array $sample + * @param array $beyondMinimum + * + * @return array + */ + private function unsetBeyondMinimum(array $sample, array $beyondMinimum) + { + foreach ($beyondMinimum as $index) { + unset($sample[$index]); + } + + return $sample; + } + + /** + * @param int $samplesCount + * + * @return array + */ + private function getBeyondMinimumIndexes(int $samplesCount) + { + $indexes = []; + foreach ($this->frequencies as $token => $frequency) { + if (($frequency / $samplesCount) < $this->minDF) { + $indexes[] = $this->getTokenIndex($token); + } + } + + return $indexes; + } +} diff --git a/src/Phpml/FeatureExtraction/Vectorizer.php b/src/Phpml/FeatureExtraction/Vectorizer.php new file mode 100644 index 0000000..04a8bea --- /dev/null +++ b/src/Phpml/FeatureExtraction/Vectorizer.php @@ -0,0 +1,15 @@ + 1, 1 => 1, 2 => 2, 3 => 1, 4 => 1], + [5 => 1, 6 => 1, 1 => 1, 2 => 1], + [5 => 1, 7 => 2, 8 => 1, 9 => 1], + ]; + + $vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer()); + + $this->assertEquals($vector, $vectorizer->transform($samples)); + $this->assertEquals($vocabulary, $vectorizer->getVocabulary()); + } + + public function testMinimumDocumentTokenCountFrequency() + { + // word at least in half samples + $samples = [ + 'Lorem ipsum dolor sit amet', + 'Lorem ipsum sit amet', + 'ipsum sit amet', + 'ipsum sit amet', + ]; + + $vocabulary = ['Lorem', 'ipsum', 'dolor', 'sit', 'amet']; + $vector = [ + [0 => 1, 1 => 1, 3 => 1, 4 => 1], + [0 => 1, 1 => 1, 3 => 1, 4 => 1], + [1 => 1, 3 => 1, 4 => 1], + [1 => 1, 3 => 1, 4 => 1], + ]; + + $vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer(), 0.5); + + $this->assertEquals($vector, $vectorizer->transform($samples)); + $this->assertEquals($vocabulary, $vectorizer->getVocabulary()); + + // word at least in all samples + $samples = [ + 'Lorem ipsum dolor sit amet', + 'Morbi quis lacinia arcu. Sed eu sagittis Lorem', + 'Suspendisse gravida consequat eros Lorem', + ]; + + $vector = [ + [0 => 1], + [0 => 1], + [0 => 1], + ]; + + $vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer(), 1); + + $this->assertEquals($vector, $vectorizer->transform($samples)); + } +} From 791a54068b901d4bdc11c28e81a059c3fee4b519 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Wed, 4 May 2016 21:29:26 +0200 Subject: [PATCH 08/30] update composer --- bin/libsvm/svm-predict | Bin 0 -> 82312 bytes bin/libsvm/svm-scale | Bin 0 -> 18640 bytes bin/libsvm/svm-train | Bin 0 -> 86712 bytes composer.json | 3 - composer.lock | 56 +++++++++--------- .../Classification/SupportVectorMachine.php | 17 ++++++ 6 files changed, 45 insertions(+), 31 deletions(-) create mode 100755 bin/libsvm/svm-predict create mode 100755 bin/libsvm/svm-scale create mode 100755 bin/libsvm/svm-train diff --git a/bin/libsvm/svm-predict b/bin/libsvm/svm-predict new file mode 100755 index 0000000000000000000000000000000000000000..e6df243d3c27353701adb2c07916debf59cf9896 GIT binary patch literal 82312 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
={qER^}e(J<2e}24$QYsQ^Av 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 YTtq*N7JuFh9e#yf&?;0S-NtGCAHrR=FaQ7m literal 0 HcmV?d00001 diff --git a/bin/libsvm/svm-scale b/bin/libsvm/svm-scale new file mode 100755 index 0000000000000000000000000000000000000000..edfb98a6bd7e728118340c6a3ce0a2278c472830 GIT binary patch literal 18640 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 A>i_@% literal 0 HcmV?d00001 diff --git a/composer.json b/composer.json index 4f0dd26..dcae248 100644 --- a/composer.json +++ b/composer.json @@ -16,9 +16,6 @@ "Phpml": "src/" } }, - "config": { - "bin-dir": "bin" - }, "require": { "php": ">=7.0.0" }, diff --git a/composer.lock b/composer.lock index 667ba6a..91597a8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "7c34eebd6b8749a1cd09df57e5d1f47a", + "hash": "0db5c4b38b7fbd4bd58649b84948d0fe", "content-hash": "087091d0c339e9fa3a551a189ea658bf", "packages": [], "packages-dev": [ @@ -64,16 +64,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "e3abefcd7f106677fd352cd7c187d6c969aa9ddc" + "reference": "a8773992b362b58498eed24bf85005f363c34771" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e3abefcd7f106677fd352cd7c187d6c969aa9ddc", - "reference": "e3abefcd7f106677fd352cd7c187d6c969aa9ddc", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/a8773992b362b58498eed24bf85005f363c34771", + "reference": "a8773992b362b58498eed24bf85005f363c34771", "shasum": "" }, "require": { @@ -102,7 +102,7 @@ "object", "object graph" ], - "time": "2015-11-07 22:20:37" + "time": "2015-11-20 12:04:31" }, { "name": "phpdocumentor/reflection-docblock", @@ -217,16 +217,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "3.3.0", + "version": "3.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "fe33716763b604ade4cb442c0794f5bd5ad73004" + "reference": "2431befdd451fac43fbcde94d1a92fb3b8b68f86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/fe33716763b604ade4cb442c0794f5bd5ad73004", - "reference": "fe33716763b604ade4cb442c0794f5bd5ad73004", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2431befdd451fac43fbcde94d1a92fb3b8b68f86", + "reference": "2431befdd451fac43fbcde94d1a92fb3b8b68f86", "shasum": "" }, "require": { @@ -244,7 +244,7 @@ }, "suggest": { "ext-dom": "*", - "ext-xdebug": ">=2.2.1", + "ext-xdebug": ">=2.4.0", "ext-xmlwriter": "*" }, "type": "library", @@ -276,7 +276,7 @@ "testing", "xunit" ], - "time": "2016-03-03 08:49:08" + "time": "2016-04-08 08:14:53" }, { "name": "phpunit/php-file-iterator", @@ -458,16 +458,16 @@ }, { "name": "phpunit/phpunit", - "version": "5.3.1", + "version": "5.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "34a3acb401ae79deb37bc6e5f5ec3d325b369b4c" + "reference": "2c6da3536035617bae3fe3db37283c9e0eb63ab3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34a3acb401ae79deb37bc6e5f5ec3d325b369b4c", - "reference": "34a3acb401ae79deb37bc6e5f5ec3d325b369b4c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2c6da3536035617bae3fe3db37283c9e0eb63ab3", + "reference": "2c6da3536035617bae3fe3db37283c9e0eb63ab3", "shasum": "" }, "require": { @@ -529,20 +529,20 @@ "testing", "xunit" ], - "time": "2016-04-07 07:04:34" + "time": "2016-04-12 16:20:08" }, { "name": "phpunit/phpunit-mock-objects", - "version": "3.1.2", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "7c34c9bdde4131b824086457a3145e27dba10ca1" + "reference": "151c96874bff6fe61a25039df60e776613a61489" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/7c34c9bdde4131b824086457a3145e27dba10ca1", - "reference": "7c34c9bdde4131b824086457a3145e27dba10ca1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/151c96874bff6fe61a25039df60e776613a61489", + "reference": "151c96874bff6fe61a25039df60e776613a61489", "shasum": "" }, "require": { @@ -585,7 +585,7 @@ "mock", "xunit" ], - "time": "2016-03-24 05:58:25" + "time": "2016-04-20 14:39:26" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -750,16 +750,16 @@ }, { "name": "sebastian/environment", - "version": "1.3.5", + "version": "1.3.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + "reference": "2292b116f43c272ff4328083096114f84ea46a56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/2292b116f43c272ff4328083096114f84ea46a56", + "reference": "2292b116f43c272ff4328083096114f84ea46a56", "shasum": "" }, "require": { @@ -796,7 +796,7 @@ "environment", "hhvm" ], - "time": "2016-02-26 18:40:46" + "time": "2016-05-04 07:59:13" }, { "name": "sebastian/exporter", @@ -1101,7 +1101,7 @@ }, { "name": "symfony/yaml", - "version": "v3.0.4", + "version": "v3.0.5", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", diff --git a/src/Phpml/Classification/SupportVectorMachine.php b/src/Phpml/Classification/SupportVectorMachine.php index 7b0d854..f25602d 100644 --- a/src/Phpml/Classification/SupportVectorMachine.php +++ b/src/Phpml/Classification/SupportVectorMachine.php @@ -32,6 +32,11 @@ class SupportVectorMachine implements Classifier */ private $upperBound; + /** + * @var string + */ + private $binPath; + /** * @param Kernel $kernel * @param float $C @@ -50,6 +55,16 @@ class SupportVectorMachine implements Classifier $this->upperBound = $upperBound; } + /** + * @param array $samples + * @param array $labels + */ + public function train(array $samples, array $labels) + { + $this->samples = $samples; + $this->labels = $labels; + } + /** * @param array $sample * @@ -57,5 +72,7 @@ class SupportVectorMachine implements Classifier */ protected function predictSample(array $sample) { + } + } From 24fc917d6aa06be9fdd345a889a3cb617a69594a Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Wed, 4 May 2016 21:30:40 +0200 Subject: [PATCH 09/30] php-cs-fixer --- src/Phpml/Classification/SupportVectorMachine.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Phpml/Classification/SupportVectorMachine.php b/src/Phpml/Classification/SupportVectorMachine.php index f25602d..3a811c1 100644 --- a/src/Phpml/Classification/SupportVectorMachine.php +++ b/src/Phpml/Classification/SupportVectorMachine.php @@ -72,7 +72,5 @@ class SupportVectorMachine implements Classifier */ protected function predictSample(array $sample) { - } - } From 71400cc1e6b5107b0c0fa83ce3883f628e6026a8 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Thu, 5 May 2016 21:57:25 +0200 Subject: [PATCH 10/30] svm --- src/Phpml/Classification/SupportVectorMachine.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Phpml/Classification/SupportVectorMachine.php b/src/Phpml/Classification/SupportVectorMachine.php index 3a811c1..5eb84e6 100644 --- a/src/Phpml/Classification/SupportVectorMachine.php +++ b/src/Phpml/Classification/SupportVectorMachine.php @@ -53,6 +53,8 @@ class SupportVectorMachine implements Classifier $this->C = $C; $this->tolerance = $tolerance; $this->upperBound = $upperBound; + + $this->binPath = realpath(implode(DIRECTORY_SEPARATOR, array(dirname(__FILE__), '..', '..', '..', 'bin'))) . DIRECTORY_SEPARATOR; } /** From a2e8a89c3e53140c06a26712b67baee656936947 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Thu, 5 May 2016 22:15:34 +0200 Subject: [PATCH 11/30] revert bin dir --- .gitignore | 1 + composer.json | 5 ++++- composer.lock | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 55f5b64..73854f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /vendor/ humbuglog.* +/bin/phpunit diff --git a/composer.json b/composer.json index dcae248..041f818 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "php-ai/php-ml", "type": "library", - "description": "PHP Machine Learning library", + "description": "PHP-ML - Machine Learning library for PHP", "license": "MIT", "keywords": ["machine learning","pattern recognition","computational learning theory","artificial intelligence"], "homepage": "https://github.com/php-ai/php-ml", @@ -21,5 +21,8 @@ }, "require-dev": { "phpunit/phpunit": "^5.2" + }, + "config": { + "bin-dir": "bin" } } diff --git a/composer.lock b/composer.lock index 91597a8..bf1fd1f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "0db5c4b38b7fbd4bd58649b84948d0fe", + "hash": "f3e2d9975d300b3ea4c3568de44d8499", "content-hash": "087091d0c339e9fa3a551a189ea658bf", "packages": [], "packages-dev": [ From 95caef86926306c5e8d3b893addaf704d13a010d Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Thu, 5 May 2016 23:29:11 +0200 Subject: [PATCH 12/30] start to implement SVM with libsvm --- src/Phpml/Classification/SVC.php | 53 ++++++++++++ .../Classification/SupportVectorMachine.php | 78 ----------------- src/Phpml/Dataset/Dataset.php | 1 - .../SupportVectorMachine/DataTransformer.php | 59 +++++++++++++ src/Phpml/SupportVectorMachine/Kernel.php | 28 +++++++ .../SupportVectorMachine.php | 83 +++++++++++++++++++ src/Phpml/SupportVectorMachine/Type.php | 33 ++++++++ .../DataTransformerTest.php | 25 ++++++ .../SupportVectorMachineTest.php | 36 ++++++++ var/.gitkeep | 0 10 files changed, 317 insertions(+), 79 deletions(-) create mode 100644 src/Phpml/Classification/SVC.php delete mode 100644 src/Phpml/Classification/SupportVectorMachine.php create mode 100644 src/Phpml/SupportVectorMachine/DataTransformer.php create mode 100644 src/Phpml/SupportVectorMachine/Kernel.php create mode 100644 src/Phpml/SupportVectorMachine/SupportVectorMachine.php create mode 100644 src/Phpml/SupportVectorMachine/Type.php create mode 100644 tests/Phpml/SupportVectorMachine/DataTransformerTest.php create mode 100644 tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php create mode 100644 var/.gitkeep diff --git a/src/Phpml/Classification/SVC.php b/src/Phpml/Classification/SVC.php new file mode 100644 index 0000000..5279539 --- /dev/null +++ b/src/Phpml/Classification/SVC.php @@ -0,0 +1,53 @@ +kernel = $kernel; + $this->cost = $cost; + } + + /** + * @param array $samples + * @param array $labels + */ + public function train(array $samples, array $labels) + { + $this->samples = $samples; + $this->labels = $labels; + } + + /** + * @param array $sample + * + * @return mixed + */ + protected function predictSample(array $sample) + { + } +} diff --git a/src/Phpml/Classification/SupportVectorMachine.php b/src/Phpml/Classification/SupportVectorMachine.php deleted file mode 100644 index 5eb84e6..0000000 --- a/src/Phpml/Classification/SupportVectorMachine.php +++ /dev/null @@ -1,78 +0,0 @@ -kernel = $kernel; - $this->C = $C; - $this->tolerance = $tolerance; - $this->upperBound = $upperBound; - - $this->binPath = realpath(implode(DIRECTORY_SEPARATOR, array(dirname(__FILE__), '..', '..', '..', 'bin'))) . DIRECTORY_SEPARATOR; - } - - /** - * @param array $samples - * @param array $labels - */ - public function train(array $samples, array $labels) - { - $this->samples = $samples; - $this->labels = $labels; - } - - /** - * @param array $sample - * - * @return mixed - */ - protected function predictSample(array $sample) - { - } -} diff --git a/src/Phpml/Dataset/Dataset.php b/src/Phpml/Dataset/Dataset.php index 2bc4043..4e04931 100644 --- a/src/Phpml/Dataset/Dataset.php +++ b/src/Phpml/Dataset/Dataset.php @@ -6,7 +6,6 @@ namespace Phpml\Dataset; interface Dataset { - const SOME = 'z'; /** * @return array */ diff --git a/src/Phpml/SupportVectorMachine/DataTransformer.php b/src/Phpml/SupportVectorMachine/DataTransformer.php new file mode 100644 index 0000000..4e01fc8 --- /dev/null +++ b/src/Phpml/SupportVectorMachine/DataTransformer.php @@ -0,0 +1,59 @@ + $label) { + $set .= sprintf('%s %s %s', $numericLabels[$label], self::sampleRow($samples[$index]), PHP_EOL); + } + + return $set; + } + + /** + * @param array $labels + * + * @return array + */ + public static function numericLabels(array $labels): array + { + $numericLabels = []; + foreach ($labels as $label) { + if (isset($numericLabels[$label])) { + continue; + } + + $numericLabels[$label] = count($numericLabels); + } + + return $numericLabels; + } + + /** + * @param array $sample + * + * @return string + */ + private static function sampleRow(array $sample): string + { + $row = []; + foreach ($sample as $index => $feature) { + $row[] = sprintf('%s:%s', $index, $feature); + } + + return implode(' ', $row); + } +} diff --git a/src/Phpml/SupportVectorMachine/Kernel.php b/src/Phpml/SupportVectorMachine/Kernel.php new file mode 100644 index 0000000..4dddef6 --- /dev/null +++ b/src/Phpml/SupportVectorMachine/Kernel.php @@ -0,0 +1,28 @@ +type = $type; + $this->kernel = $kernel; + $this->cost = $cost; + + $rootPath = realpath(implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), '..', '..', '..'])).DIRECTORY_SEPARATOR; + + $this->binPath = $rootPath.'bin'.DIRECTORY_SEPARATOR.'libsvm'.DIRECTORY_SEPARATOR; + $this->varPath = $rootPath.'var'.DIRECTORY_SEPARATOR; + } + + /** + * @param array $samples + * @param array $labels + */ + public function train(array $samples, array $labels) + { + $trainingSet = DataTransformer::trainingSet($samples, $labels); + file_put_contents($trainingSetFileName = $this->varPath.uniqid(), $trainingSet); + $modelFileName = $trainingSetFileName.'-model'; + + $command = sprintf('%ssvm-train -s %s -t %s -c %s %s %s', $this->binPath, $this->type, $this->kernel, $this->cost, $trainingSetFileName, $modelFileName); + $output = ''; + exec(escapeshellcmd($command), $output); + + $this->model = file_get_contents($modelFileName); + + unlink($trainingSetFileName); + unlink($modelFileName); + } + + /** + * @return string + */ + public function getModel() + { + return $this->model; + } +} diff --git a/src/Phpml/SupportVectorMachine/Type.php b/src/Phpml/SupportVectorMachine/Type.php new file mode 100644 index 0000000..49b03a0 --- /dev/null +++ b/src/Phpml/SupportVectorMachine/Type.php @@ -0,0 +1,33 @@ +assertEquals($trainingSet, DataTransformer::trainingSet($samples, $labels)); + } +} diff --git a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php new file mode 100644 index 0000000..e06f715 --- /dev/null +++ b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php @@ -0,0 +1,36 @@ +train($samples, $labels); + + $this->assertEquals($model, $svm->getModel()); + } +} diff --git a/var/.gitkeep b/var/.gitkeep new file mode 100644 index 0000000..e69de29 From 4ac2ac8a353e45c91125cec58ff5c9cab0e0adbb Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Fri, 6 May 2016 22:33:04 +0200 Subject: [PATCH 13/30] fix index for trainging set --- src/Phpml/SupportVectorMachine/DataTransformer.php | 2 +- src/Phpml/SupportVectorMachine/SupportVectorMachine.php | 6 +++++- tests/Phpml/SupportVectorMachine/DataTransformerTest.php | 8 ++++---- .../SupportVectorMachine/SupportVectorMachineTest.php | 4 ++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Phpml/SupportVectorMachine/DataTransformer.php b/src/Phpml/SupportVectorMachine/DataTransformer.php index 4e01fc8..5b418e2 100644 --- a/src/Phpml/SupportVectorMachine/DataTransformer.php +++ b/src/Phpml/SupportVectorMachine/DataTransformer.php @@ -51,7 +51,7 @@ class DataTransformer { $row = []; foreach ($sample as $index => $feature) { - $row[] = sprintf('%s:%s', $index, $feature); + $row[] = sprintf('%s:%s', $index + 1, $feature); } return implode(' ', $row); diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index 6e2be20..6842777 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -27,7 +27,7 @@ class SupportVectorMachine private $binPath; /** - * @var + * @var string */ private $varPath; @@ -80,4 +80,8 @@ class SupportVectorMachine { return $this->model; } + + public function predict(array $samples) + { + } } diff --git a/tests/Phpml/SupportVectorMachine/DataTransformerTest.php b/tests/Phpml/SupportVectorMachine/DataTransformerTest.php index 84fd001..1429511 100644 --- a/tests/Phpml/SupportVectorMachine/DataTransformerTest.php +++ b/tests/Phpml/SupportVectorMachine/DataTransformerTest.php @@ -14,10 +14,10 @@ class DataTransformerTest extends \PHPUnit_Framework_TestCase $labels = ['a', 'a', 'b', 'b']; $trainingSet = - '0 0:1 1:1 '.PHP_EOL. - '0 0:2 1:1 '.PHP_EOL. - '1 0:3 1:2 '.PHP_EOL. - '1 0:4 1:5 '.PHP_EOL + '0 1:1 2:1 '.PHP_EOL. + '0 1:2 2:1 '.PHP_EOL. + '1 1:3 2:2 '.PHP_EOL. + '1 1:4 2:5 '.PHP_EOL ; $this->assertEquals($trainingSet, DataTransformer::trainingSet($samples, $labels)); diff --git a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php index e06f715..e4a8857 100644 --- a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php +++ b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php @@ -24,8 +24,8 @@ rho 0 label 0 1 nr_sv 1 1 SV -0.25 0:2 1:4 --0.25 0:4 1:2 +0.25 1:2 2:4 +-0.25 1:4 2:2 '; $svm = new SupportVectorMachine(Type::C_SVC, Kernel::LINEAR, 100.0); From dfb7b6b108deb457bda393b007769202d09b6a54 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Fri, 6 May 2016 22:38:50 +0200 Subject: [PATCH 14/30] datatransformer test set --- .../SupportVectorMachine/DataTransformer.php | 15 +++++++++++++++ .../SupportVectorMachine/SupportVectorMachine.php | 1 + .../SupportVectorMachine/DataTransformerTest.php | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/Phpml/SupportVectorMachine/DataTransformer.php b/src/Phpml/SupportVectorMachine/DataTransformer.php index 5b418e2..05599f1 100644 --- a/src/Phpml/SupportVectorMachine/DataTransformer.php +++ b/src/Phpml/SupportVectorMachine/DataTransformer.php @@ -23,6 +23,21 @@ class DataTransformer return $set; } + /** + * @param array $samples + * + * @return string + */ + public static function testSet(array $samples): string + { + $set = ''; + foreach ($samples as $sample) { + $set .= sprintf('0 %s %s', self::sampleRow($sample), PHP_EOL); + } + + return $set; + } + /** * @param array $labels * diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index 6842777..325fcf3 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -83,5 +83,6 @@ class SupportVectorMachine public function predict(array $samples) { + $testSet = DataTransformer::testSet(); } } diff --git a/tests/Phpml/SupportVectorMachine/DataTransformerTest.php b/tests/Phpml/SupportVectorMachine/DataTransformerTest.php index 1429511..ff2a7c7 100644 --- a/tests/Phpml/SupportVectorMachine/DataTransformerTest.php +++ b/tests/Phpml/SupportVectorMachine/DataTransformerTest.php @@ -22,4 +22,19 @@ class DataTransformerTest extends \PHPUnit_Framework_TestCase $this->assertEquals($trainingSet, DataTransformer::trainingSet($samples, $labels)); } + + public function testTransformSamplesToTestSet() + { + $samples = [[1, 1], [2, 1], [3, 2], [4, 5]]; + + $testSet = + '0 1:1 2:1 '.PHP_EOL. + '0 1:2 2:1 '.PHP_EOL. + '0 1:3 2:2 '.PHP_EOL. + '0 1:4 2:5 '.PHP_EOL + ; + + $this->assertEquals($testSet, DataTransformer::testSet($samples)); + } + } From 7b5b6418f42f743aa747629fc95487877853312b Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Fri, 6 May 2016 22:55:41 +0200 Subject: [PATCH 15/30] libsvm predict program implementation --- .../SupportVectorMachine/DataTransformer.php | 17 +++++++++++ .../SupportVectorMachine.php | 29 ++++++++++++++++++- .../DataTransformerTest.php | 1 - .../SupportVectorMachineTest.php | 19 ++++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/Phpml/SupportVectorMachine/DataTransformer.php b/src/Phpml/SupportVectorMachine/DataTransformer.php index 05599f1..1ce4bee 100644 --- a/src/Phpml/SupportVectorMachine/DataTransformer.php +++ b/src/Phpml/SupportVectorMachine/DataTransformer.php @@ -38,6 +38,23 @@ class DataTransformer return $set; } + /** + * @param string $resultString + * @param array $labels + * + * @return array + */ + public static function results(string $resultString, array $labels): array + { + $numericLabels = self::numericLabels($labels); + $results = []; + foreach (explode(PHP_EOL, $resultString) as $result) { + $results[] = array_search($result, $numericLabels); + } + + return $results; + } + /** * @param array $labels * diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index 325fcf3..f14d534 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -36,6 +36,11 @@ class SupportVectorMachine */ private $model; + /** + * @var array + */ + private $labels; + /** * @param int $type * @param int $kernel @@ -59,6 +64,7 @@ class SupportVectorMachine */ public function train(array $samples, array $labels) { + $this->labels = $labels; $trainingSet = DataTransformer::trainingSet($samples, $labels); file_put_contents($trainingSetFileName = $this->varPath.uniqid(), $trainingSet); $modelFileName = $trainingSetFileName.'-model'; @@ -81,8 +87,29 @@ class SupportVectorMachine return $this->model; } + /** + * @param array $samples + * + * @return array + */ public function predict(array $samples) { - $testSet = DataTransformer::testSet(); + $testSet = DataTransformer::testSet($samples); + file_put_contents($testSetFileName = $this->varPath.uniqid(), $testSet); + $modelFileName = $testSetFileName.'-model'; + file_put_contents($modelFileName, $this->model); + $outputFileName = $testSetFileName.'-output'; + + $command = sprintf('%ssvm-predict %s %s %s', $this->binPath, $testSetFileName, $modelFileName, $outputFileName); + $output = ''; + exec(escapeshellcmd($command), $output); + + $predictions = file_get_contents($outputFileName); + + unlink($testSetFileName); + unlink($modelFileName); + unlink($outputFileName); + + return DataTransformer::results($predictions, $this->labels); } } diff --git a/tests/Phpml/SupportVectorMachine/DataTransformerTest.php b/tests/Phpml/SupportVectorMachine/DataTransformerTest.php index ff2a7c7..c07948a 100644 --- a/tests/Phpml/SupportVectorMachine/DataTransformerTest.php +++ b/tests/Phpml/SupportVectorMachine/DataTransformerTest.php @@ -36,5 +36,4 @@ class DataTransformerTest extends \PHPUnit_Framework_TestCase $this->assertEquals($testSet, DataTransformer::testSet($samples)); } - } diff --git a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php index e4a8857..330f7f0 100644 --- a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php +++ b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php @@ -33,4 +33,23 @@ SV $this->assertEquals($model, $svm->getModel()); } + + public function testPredictCSVCModelWithLinearKernel() + { + $samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; + $labels = ['a', 'a', 'a', 'b', 'b', 'b']; + + $svm = new SupportVectorMachine(Type::C_SVC, Kernel::LINEAR, 100.0); + $svm->train($samples, $labels); + + $predictions = $svm->predict([ + [3, 2], + [2, 3], + [4, -5], + ]); + + $this->assertEquals('b', $predictions[0]); + $this->assertEquals('a', $predictions[1]); + $this->assertEquals('b', $predictions[2]); + } } From 95bfc890cd0ab0fdada44057a50dfbbf500fed40 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 11:22:37 +0200 Subject: [PATCH 16/30] add windows libsvm binaries --- bin/libsvm/svm-predict.exe | Bin 0 -> 107008 bytes bin/libsvm/svm-scale.exe | Bin 0 -> 80384 bytes bin/libsvm/svm-train.exe | Bin 0 -> 135680 bytes .../SupportVectorMachine.php | 17 +++++++++++++++-- 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 bin/libsvm/svm-predict.exe create mode 100644 bin/libsvm/svm-scale.exe create mode 100644 bin/libsvm/svm-train.exe diff --git a/bin/libsvm/svm-predict.exe b/bin/libsvm/svm-predict.exe new file mode 100644 index 0000000000000000000000000000000000000000..29760b09f7ed30d894cafbd4d91b55db1f639a24 GIT binary patch literal 107008 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

qUDKC70K*9g;xaS5W+mC9KSdNSyN@8)Z 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 literal 0 HcmV?d00001 diff --git a/bin/libsvm/svm-scale.exe b/bin/libsvm/svm-scale.exe new file mode 100644 index 0000000000000000000000000000000000000000..75489ae97d24eecfef35b4f88d3472c4dccb1c81 GIT binary patch literal 80384 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 K5`q5_0{;NVwOd30 literal 0 HcmV?d00001 diff --git a/bin/libsvm/svm-train.exe b/bin/libsvm/svm-train.exe new file mode 100644 index 0000000000000000000000000000000000000000..23368b5b23b6b98a7efaeafba85525bf06b47150 GIT binary patch literal 135680 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 literal 0 HcmV?d00001 diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index f14d534..a812065 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -69,7 +69,7 @@ class SupportVectorMachine file_put_contents($trainingSetFileName = $this->varPath.uniqid(), $trainingSet); $modelFileName = $trainingSetFileName.'-model'; - $command = sprintf('%ssvm-train -s %s -t %s -c %s %s %s', $this->binPath, $this->type, $this->kernel, $this->cost, $trainingSetFileName, $modelFileName); + $command = sprintf('%ssvm-train%s -s %s -t %s -c %s %s %s', $this->binPath, $this->getOSExtension(), $this->type, $this->kernel, $this->cost, $trainingSetFileName, $modelFileName); $output = ''; exec(escapeshellcmd($command), $output); @@ -100,7 +100,7 @@ class SupportVectorMachine file_put_contents($modelFileName, $this->model); $outputFileName = $testSetFileName.'-output'; - $command = sprintf('%ssvm-predict %s %s %s', $this->binPath, $testSetFileName, $modelFileName, $outputFileName); + $command = sprintf('%ssvm-predict%s %s %s %s', $this->binPath, $this->getOSExtension(), $testSetFileName, $modelFileName, $outputFileName); $output = ''; exec(escapeshellcmd($command), $output); @@ -112,4 +112,17 @@ class SupportVectorMachine return DataTransformer::results($predictions, $this->labels); } + + /** + * @return string + */ + private function getOSExtension() + { + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + return '.exe'; + } + + return ''; + } + } From 6cf6c5e768d0ce5e3922263f09045efc9965d559 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 14:08:09 +0200 Subject: [PATCH 17/30] add multi class svm test --- .../SupportVectorMachine.php | 1 - .../SupportVectorMachineTest.php | 29 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index a812065..e9bd8c8 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -124,5 +124,4 @@ class SupportVectorMachine return ''; } - } diff --git a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php index 330f7f0..d14f777 100644 --- a/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php +++ b/tests/Phpml/SupportVectorMachine/SupportVectorMachineTest.php @@ -34,7 +34,7 @@ SV $this->assertEquals($model, $svm->getModel()); } - public function testPredictCSVCModelWithLinearKernel() + public function testPredictSampleWithLinearKernel() { $samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; $labels = ['a', 'a', 'a', 'b', 'b', 'b']; @@ -52,4 +52,31 @@ SV $this->assertEquals('a', $predictions[1]); $this->assertEquals('b', $predictions[2]); } + + public function testPredictSampleFromMultipleClassWithRbfKernel() + { + $samples = [ + [1, 3], [1, 4], [1, 4], + [3, 1], [4, 1], [4, 2], + [-3, -1], [-4, -1], [-4, -2], + ]; + $labels = [ + 'a', 'a', 'a', + 'b', 'b', 'b', + 'c', 'c', 'c', + ]; + + $svm = new SupportVectorMachine(Type::C_SVC, Kernel::RBF, 100.0); + $svm->train($samples, $labels); + + $predictions = $svm->predict([ + [1, 5], + [4, 3], + [-4, -3], + ]); + + $this->assertEquals('a', $predictions[0]); + $this->assertEquals('b', $predictions[1]); + $this->assertEquals('c', $predictions[2]); + } } From c40965848308c19638ecde78a6246a5016f5c23f Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 22:17:12 +0200 Subject: [PATCH 18/30] support vector classifier implementation --- src/Phpml/Classification/SVC.php | 59 +++------ .../SupportVectorMachine/DataTransformer.php | 14 ++- .../SupportVectorMachine.php | 119 ++++++++++++++++-- tests/Phpml/Classification/SVCTest.php | 45 +++++++ 4 files changed, 182 insertions(+), 55 deletions(-) create mode 100644 tests/Phpml/Classification/SVCTest.php diff --git a/src/Phpml/Classification/SVC.php b/src/Phpml/Classification/SVC.php index 5279539..8dcb28f 100644 --- a/src/Phpml/Classification/SVC.php +++ b/src/Phpml/Classification/SVC.php @@ -4,50 +4,27 @@ declare (strict_types = 1); namespace Phpml\Classification; -use Phpml\Classification\Traits\Predictable; -use Phpml\Classification\Traits\Trainable; -use Phpml\Math\Kernel; +use Phpml\SupportVectorMachine\SupportVectorMachine; +use Phpml\SupportVectorMachine\Type; -class SVC implements Classifier +class SVC extends SupportVectorMachine implements Classifier { - use Trainable, Predictable; - /** - * @var int + * @param int $kernel + * @param float $cost + * @param int $degree + * @param float|null $gamma + * @param float $coef0 + * @param float $tolerance + * @param int $cacheSize + * @param bool $shrinking + * @param bool $probabilityEstimates */ - private $kernel; - - /** - * @var float - */ - private $cost; - - /** - * @param int $kernel - * @param float $cost - */ - public function __construct(int $kernel, float $cost) - { - $this->kernel = $kernel; - $this->cost = $cost; - } - - /** - * @param array $samples - * @param array $labels - */ - public function train(array $samples, array $labels) - { - $this->samples = $samples; - $this->labels = $labels; - } - - /** - * @param array $sample - * - * @return mixed - */ - protected function predictSample(array $sample) - { + public function __construct( + int $kernel, float $cost = 1.0, int $degree = 3, float $gamma = null, float $coef0 = 0.0, + float $tolerance = 0.001, int $cacheSize = 100, bool $shrinking = true, + bool $probabilityEstimates = false + ) { + parent::__construct(Type::C_SVC, $kernel, $cost, 0.5, $degree, $gamma, $coef0, 0.1, $tolerance, $cacheSize, $shrinking, $probabilityEstimates); } } diff --git a/src/Phpml/SupportVectorMachine/DataTransformer.php b/src/Phpml/SupportVectorMachine/DataTransformer.php index 1ce4bee..155f564 100644 --- a/src/Phpml/SupportVectorMachine/DataTransformer.php +++ b/src/Phpml/SupportVectorMachine/DataTransformer.php @@ -30,6 +30,10 @@ class DataTransformer */ public static function testSet(array $samples): string { + if (!is_array($samples[0])) { + $samples = [$samples]; + } + $set = ''; foreach ($samples as $sample) { $set .= sprintf('0 %s %s', self::sampleRow($sample), PHP_EOL); @@ -39,17 +43,19 @@ class DataTransformer } /** - * @param string $resultString + * @param string $rawPredictions * @param array $labels * * @return array */ - public static function results(string $resultString, array $labels): array + public static function predictions(string $rawPredictions, array $labels): array { $numericLabels = self::numericLabels($labels); $results = []; - foreach (explode(PHP_EOL, $resultString) as $result) { - $results[] = array_search($result, $numericLabels); + foreach (explode(PHP_EOL, $rawPredictions) as $result) { + if (strlen($result) > 0) { + $results[] = array_search($result, $numericLabels); + } } return $results; diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index e9bd8c8..7a47db7 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -21,6 +21,51 @@ class SupportVectorMachine */ private $cost; + /** + * @var float + */ + private $nu; + + /** + * @var int + */ + private $degree; + + /** + * @var float + */ + private $gamma; + + /** + * @var float + */ + private $coef0; + + /** + * @var float + */ + private $epsilon; + + /** + * @var float + */ + private $tolerance; + + /** + * @var int + */ + private $cacheSize; + + /** + * @var bool + */ + private $shrinking; + + /** + * @var bool + */ + private $probabilityEstimates; + /** * @var string */ @@ -42,15 +87,36 @@ class SupportVectorMachine private $labels; /** - * @param int $type - * @param int $kernel - * @param float $cost + * @param int $type + * @param int $kernel + * @param float $cost + * @param float $nu + * @param int $degree + * @param float|null $gamma + * @param float $coef0 + * @param float $epsilon + * @param float $tolerance + * @param int $cacheSize + * @param bool $shrinking + * @param bool $probabilityEstimates */ - public function __construct(int $type, int $kernel, float $cost) - { + public function __construct( + int $type, int $kernel, float $cost = 1.0, float $nu = 0.5, int $degree = 3, + float $gamma = null, float $coef0 = 0.0, float $epsilon = 0.1, float $tolerance = 0.001, + int $cacheSize = 100, bool $shrinking = true, bool $probabilityEstimates = false + ) { $this->type = $type; $this->kernel = $kernel; $this->cost = $cost; + $this->nu = $nu; + $this->degree = $degree; + $this->gamma = $gamma; + $this->coef0 = $coef0; + $this->epsilon = $epsilon; + $this->tolerance = $tolerance; + $this->cacheSize = $cacheSize; + $this->shrinking = $shrinking; + $this->probabilityEstimates = $probabilityEstimates; $rootPath = realpath(implode(DIRECTORY_SEPARATOR, [dirname(__FILE__), '..', '..', '..'])).DIRECTORY_SEPARATOR; @@ -69,7 +135,7 @@ class SupportVectorMachine file_put_contents($trainingSetFileName = $this->varPath.uniqid(), $trainingSet); $modelFileName = $trainingSetFileName.'-model'; - $command = sprintf('%ssvm-train%s -s %s -t %s -c %s %s %s', $this->binPath, $this->getOSExtension(), $this->type, $this->kernel, $this->cost, $trainingSetFileName, $modelFileName); + $command = $this->buildTrainCommand($trainingSetFileName, $modelFileName); $output = ''; exec(escapeshellcmd($command), $output); @@ -96,21 +162,26 @@ class SupportVectorMachine { $testSet = DataTransformer::testSet($samples); file_put_contents($testSetFileName = $this->varPath.uniqid(), $testSet); - $modelFileName = $testSetFileName.'-model'; - file_put_contents($modelFileName, $this->model); + file_put_contents($modelFileName = $testSetFileName.'-model', $this->model); $outputFileName = $testSetFileName.'-output'; $command = sprintf('%ssvm-predict%s %s %s %s', $this->binPath, $this->getOSExtension(), $testSetFileName, $modelFileName, $outputFileName); $output = ''; exec(escapeshellcmd($command), $output); - $predictions = file_get_contents($outputFileName); + $rawPredictions = file_get_contents($outputFileName); unlink($testSetFileName); unlink($modelFileName); unlink($outputFileName); - return DataTransformer::results($predictions, $this->labels); + $predictions = DataTransformer::predictions($rawPredictions, $this->labels); + + if (!is_array($samples[0])) { + return $predictions[0]; + } + + return $predictions; } /** @@ -124,4 +195,32 @@ class SupportVectorMachine return ''; } + + /** + * @param $trainingSetFileName + * @param $modelFileName + * + * @return string + */ + private function buildTrainCommand(string $trainingSetFileName, string $modelFileName): string + { + return sprintf('%ssvm-train%s -s %s -t %s -c %s -n %s -d %s%s -r %s -p %s -m %s -e %s -h %d -b %d \'%s\' \'%s\'', + $this->binPath, + $this->getOSExtension(), + $this->type, + $this->kernel, + $this->cost, + $this->nu, + $this->degree, + $this->gamma !== null ? ' -g '.$this->gamma : '', + $this->coef0, + $this->epsilon, + $this->cacheSize, + $this->tolerance, + $this->shrinking, + $this->probabilityEstimates, + $trainingSetFileName, + $modelFileName + ); + } } diff --git a/tests/Phpml/Classification/SVCTest.php b/tests/Phpml/Classification/SVCTest.php new file mode 100644 index 0000000..1ddcdd0 --- /dev/null +++ b/tests/Phpml/Classification/SVCTest.php @@ -0,0 +1,45 @@ +train($samples, $labels); + + $this->assertEquals('b', $classifier->predict([3, 2])); + $this->assertEquals('b', $classifier->predict([5, 1])); + $this->assertEquals('b', $classifier->predict([4, 3])); + $this->assertEquals('b', $classifier->predict([4, -5])); + + $this->assertEquals('a', $classifier->predict([2, 3])); + $this->assertEquals('a', $classifier->predict([1, 2])); + $this->assertEquals('a', $classifier->predict([1, 5])); + $this->assertEquals('a', $classifier->predict([3, 10])); + } + + public function testPredictArrayOfSamplesWithLinearKernel() + { + $trainSamples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; + $trainLabels = ['a', 'a', 'a', 'b', 'b', 'b']; + + $testSamples = [[3, 2], [5, 1], [4, 3], [4, -5], [2, 3], [1, 2], [1, 5], [3, 10]]; + $testLabels = ['b', 'b', 'b', 'b', 'a', 'a', 'a', 'a']; + + $classifier = new SVC(Kernel::LINEAR, $cost = 1000); + $classifier->train($trainSamples, $trainLabels); + $predictions = $classifier->predict($testSamples); + + $this->assertEquals($testLabels, $predictions); + } +} From 430c1078cfbbdfe2343d1d057dbdb1b2beb7d5b5 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 23:04:58 +0200 Subject: [PATCH 19/30] implement support vector regression --- .../Classification/KNearestNeighbors.php | 4 +- src/Phpml/Classification/NaiveBayes.php | 4 +- src/Phpml/Classification/SVC.php | 3 +- .../Traits => Helper}/Predictable.php | 2 +- .../Traits => Helper}/Trainable.php | 2 +- src/Phpml/Regression/LeastSquares.php | 4 +- src/Phpml/Regression/Regression.php | 4 +- src/Phpml/Regression/SVR.php | 31 ++++++++++++ .../SupportVectorMachine/DataTransformer.php | 10 ++-- .../SupportVectorMachine.php | 10 ++-- tests/Phpml/Regression/SVRTest.php | 50 +++++++++++++++++++ 11 files changed, 108 insertions(+), 16 deletions(-) rename src/Phpml/{Classification/Traits => Helper}/Predictable.php (94%) rename src/Phpml/{Classification/Traits => Helper}/Trainable.php (90%) create mode 100644 src/Phpml/Regression/SVR.php create mode 100644 tests/Phpml/Regression/SVRTest.php diff --git a/src/Phpml/Classification/KNearestNeighbors.php b/src/Phpml/Classification/KNearestNeighbors.php index 93991ae..f1a87cf 100644 --- a/src/Phpml/Classification/KNearestNeighbors.php +++ b/src/Phpml/Classification/KNearestNeighbors.php @@ -4,8 +4,8 @@ declare (strict_types = 1); namespace Phpml\Classification; -use Phpml\Classification\Traits\Predictable; -use Phpml\Classification\Traits\Trainable; +use Phpml\Helper\Predictable; +use Phpml\Helper\Trainable; use Phpml\Math\Distance; use Phpml\Math\Distance\Euclidean; diff --git a/src/Phpml/Classification/NaiveBayes.php b/src/Phpml/Classification/NaiveBayes.php index ae98e1d..9726b40 100644 --- a/src/Phpml/Classification/NaiveBayes.php +++ b/src/Phpml/Classification/NaiveBayes.php @@ -4,8 +4,8 @@ declare (strict_types = 1); namespace Phpml\Classification; -use Phpml\Classification\Traits\Predictable; -use Phpml\Classification\Traits\Trainable; +use Phpml\Helper\Predictable; +use Phpml\Helper\Trainable; class NaiveBayes implements Classifier { diff --git a/src/Phpml/Classification/SVC.php b/src/Phpml/Classification/SVC.php index 8dcb28f..2350d5d 100644 --- a/src/Phpml/Classification/SVC.php +++ b/src/Phpml/Classification/SVC.php @@ -4,6 +4,7 @@ declare (strict_types = 1); namespace Phpml\Classification; +use Phpml\SupportVectorMachine\Kernel; use Phpml\SupportVectorMachine\SupportVectorMachine; use Phpml\SupportVectorMachine\Type; @@ -21,7 +22,7 @@ class SVC extends SupportVectorMachine implements Classifier * @param bool $probabilityEstimates */ public function __construct( - int $kernel, float $cost = 1.0, int $degree = 3, float $gamma = null, float $coef0 = 0.0, + int $kernel = Kernel::LINEAR, float $cost = 1.0, int $degree = 3, float $gamma = null, float $coef0 = 0.0, float $tolerance = 0.001, int $cacheSize = 100, bool $shrinking = true, bool $probabilityEstimates = false ) { diff --git a/src/Phpml/Classification/Traits/Predictable.php b/src/Phpml/Helper/Predictable.php similarity index 94% rename from src/Phpml/Classification/Traits/Predictable.php rename to src/Phpml/Helper/Predictable.php index 804b54a..4bf2a2e 100644 --- a/src/Phpml/Classification/Traits/Predictable.php +++ b/src/Phpml/Helper/Predictable.php @@ -2,7 +2,7 @@ declare (strict_types = 1); -namespace Phpml\Classification\Traits; +namespace Phpml\Helper; trait Predictable { diff --git a/src/Phpml/Classification/Traits/Trainable.php b/src/Phpml/Helper/Trainable.php similarity index 90% rename from src/Phpml/Classification/Traits/Trainable.php rename to src/Phpml/Helper/Trainable.php index 8fa97f2..36b8993 100644 --- a/src/Phpml/Classification/Traits/Trainable.php +++ b/src/Phpml/Helper/Trainable.php @@ -2,7 +2,7 @@ declare (strict_types = 1); -namespace Phpml\Classification\Traits; +namespace Phpml\Helper; trait Trainable { diff --git a/src/Phpml/Regression/LeastSquares.php b/src/Phpml/Regression/LeastSquares.php index cd0251f..83a6a65 100644 --- a/src/Phpml/Regression/LeastSquares.php +++ b/src/Phpml/Regression/LeastSquares.php @@ -4,10 +4,12 @@ declare (strict_types = 1); namespace Phpml\Regression; +use Phpml\Helper\Predictable; use Phpml\Math\Matrix; class LeastSquares implements Regression { + use Predictable; /** * @var array */ @@ -45,7 +47,7 @@ class LeastSquares implements Regression * * @return mixed */ - public function predict($sample) + public function predictSample(array $sample) { $result = $this->intercept; foreach ($this->coefficients as $index => $coefficient) { diff --git a/src/Phpml/Regression/Regression.php b/src/Phpml/Regression/Regression.php index a7837d4..12d2f52 100644 --- a/src/Phpml/Regression/Regression.php +++ b/src/Phpml/Regression/Regression.php @@ -13,9 +13,9 @@ interface Regression public function train(array $samples, array $targets); /** - * @param float $sample + * @param array $samples * * @return mixed */ - public function predict($sample); + public function predict(array $samples); } diff --git a/src/Phpml/Regression/SVR.php b/src/Phpml/Regression/SVR.php new file mode 100644 index 0000000..07b1459 --- /dev/null +++ b/src/Phpml/Regression/SVR.php @@ -0,0 +1,31 @@ + $label) { - $set .= sprintf('%s %s %s', $numericLabels[$label], self::sampleRow($samples[$index]), PHP_EOL); + $set .= sprintf('%s %s %s', ($targets ? $label : $numericLabels[$label]), self::sampleRow($samples[$index]), PHP_EOL); } return $set; diff --git a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php index 7a47db7..ef52d29 100644 --- a/src/Phpml/SupportVectorMachine/SupportVectorMachine.php +++ b/src/Phpml/SupportVectorMachine/SupportVectorMachine.php @@ -131,7 +131,7 @@ class SupportVectorMachine public function train(array $samples, array $labels) { $this->labels = $labels; - $trainingSet = DataTransformer::trainingSet($samples, $labels); + $trainingSet = DataTransformer::trainingSet($samples, $labels, in_array($this->type, [Type::EPSILON_SVR, Type::NU_SVR])); file_put_contents($trainingSetFileName = $this->varPath.uniqid(), $trainingSet); $modelFileName = $trainingSetFileName.'-model'; @@ -169,13 +169,17 @@ class SupportVectorMachine $output = ''; exec(escapeshellcmd($command), $output); - $rawPredictions = file_get_contents($outputFileName); + $predictions = file_get_contents($outputFileName); unlink($testSetFileName); unlink($modelFileName); unlink($outputFileName); - $predictions = DataTransformer::predictions($rawPredictions, $this->labels); + if (in_array($this->type, [Type::C_SVC, Type::NU_SVC])) { + $predictions = DataTransformer::predictions($predictions, $this->labels); + } else { + $predictions = explode(PHP_EOL, trim($predictions)); + } if (!is_array($samples[0])) { return $predictions[0]; diff --git a/tests/Phpml/Regression/SVRTest.php b/tests/Phpml/Regression/SVRTest.php new file mode 100644 index 0000000..d794062 --- /dev/null +++ b/tests/Phpml/Regression/SVRTest.php @@ -0,0 +1,50 @@ +train($samples, $targets); + + $this->assertEquals(4.03, $regression->predict([64]), '', $delta); + + $samples = [[9300], [10565], [15000], [15000], [17764], [57000], [65940], [73676], [77006], [93739], [146088], [153260]]; + $targets = [7100, 15500, 4400, 4400, 5900, 4600, 8800, 2000, 2750, 2550, 960, 1025]; + + $regression = new SVR(Kernel::LINEAR); + $regression->train($samples, $targets); + + $this->assertEquals(6236.12, $regression->predict([9300]), '', $delta); + $this->assertEquals(4718.29, $regression->predict([57000]), '', $delta); + $this->assertEquals(4081.69, $regression->predict([77006]), '', $delta); + $this->assertEquals(6236.12, $regression->predict([9300]), '', $delta); + $this->assertEquals(1655.26, $regression->predict([153260]), '', $delta); + } + + public function testPredictMultiFeaturesSamples() + { + $delta = 0.01; + + $samples = [[73676, 1996], [77006, 1998], [10565, 2000], [146088, 1995], [15000, 2001], [65940, 2000], [9300, 2000], [93739, 1996], [153260, 1994], [17764, 2002], [57000, 1998], [15000, 2000]]; + $targets = [2000, 2750, 15500, 960, 4400, 8800, 7100, 2550, 1025, 5900, 4600, 4400]; + + $regression = new SVR(Kernel::LINEAR); + $regression->train($samples, $targets); + + $this->assertEquals(4109.82, $regression->predict([60000, 1996]), '', $delta); + $this->assertEquals(4112.28, $regression->predict([60000, 2000]), '', $delta); + } +} From 078f543146847f477f5ce85fc159be66ccce77bd Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 23:17:46 +0200 Subject: [PATCH 20/30] add word tokenizer --- tests/Phpml/Regression/SVRTest.php | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/tests/Phpml/Regression/SVRTest.php b/tests/Phpml/Regression/SVRTest.php index d794062..dd3518d 100644 --- a/tests/Phpml/Regression/SVRTest.php +++ b/tests/Phpml/Regression/SVRTest.php @@ -20,18 +20,6 @@ class SVRTest extends \PHPUnit_Framework_TestCase $regression->train($samples, $targets); $this->assertEquals(4.03, $regression->predict([64]), '', $delta); - - $samples = [[9300], [10565], [15000], [15000], [17764], [57000], [65940], [73676], [77006], [93739], [146088], [153260]]; - $targets = [7100, 15500, 4400, 4400, 5900, 4600, 8800, 2000, 2750, 2550, 960, 1025]; - - $regression = new SVR(Kernel::LINEAR); - $regression->train($samples, $targets); - - $this->assertEquals(6236.12, $regression->predict([9300]), '', $delta); - $this->assertEquals(4718.29, $regression->predict([57000]), '', $delta); - $this->assertEquals(4081.69, $regression->predict([77006]), '', $delta); - $this->assertEquals(6236.12, $regression->predict([9300]), '', $delta); - $this->assertEquals(1655.26, $regression->predict([153260]), '', $delta); } public function testPredictMultiFeaturesSamples() @@ -44,7 +32,6 @@ class SVRTest extends \PHPUnit_Framework_TestCase $regression = new SVR(Kernel::LINEAR); $regression->train($samples, $targets); - $this->assertEquals(4109.82, $regression->predict([60000, 1996]), '', $delta); - $this->assertEquals(4112.28, $regression->predict([60000, 2000]), '', $delta); + $this->assertEquals([4109.82, 4112.28], $regression->predict([[60000, 1996], [60000, 2000]]), '', $delta); } } From 46197eba7b53c9eb48d16b3420ca0b091aaf0a31 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 23:17:52 +0200 Subject: [PATCH 21/30] add word tokenizer --- src/Phpml/Tokenization/WordTokenizer.php | 21 ++++++++++ .../Phpml/Tokenization/WordTokenizerTest.php | 40 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/Phpml/Tokenization/WordTokenizer.php create mode 100644 tests/Phpml/Tokenization/WordTokenizerTest.php diff --git a/src/Phpml/Tokenization/WordTokenizer.php b/src/Phpml/Tokenization/WordTokenizer.php new file mode 100644 index 0000000..c384c39 --- /dev/null +++ b/src/Phpml/Tokenization/WordTokenizer.php @@ -0,0 +1,21 @@ +assertEquals($tokens, $tokenizer->tokenize($text)); + } + + public function testTokenizationOnUtf8() + { + $tokenizer = new WordTokenizer(); + + $text = '鋍鞎 鳼 鞮鞢騉 袟袘觕, 炟砏 蒮 謺貙蹖 偢偣唲 蒛 箷箯緷 鑴鱱爧 覮轀, + 剆坲 煘煓瑐 鬐鶤鶐 飹勫嫢 銪 餀 枲柊氠 鍎鞚韕 焲犈, + 殍涾烰 齞齝囃 蹅輶 鄜, 孻憵 擙樲橚 藒襓謥 岯岪弨 蒮 廞徲 孻憵懥 趡趛踠 槏'; + + $tokens = ['鋍鞎', '鞮鞢騉', '袟袘觕', '炟砏', '謺貙蹖', '偢偣唲', '箷箯緷', '鑴鱱爧', '覮轀', + '剆坲', '煘煓瑐', '鬐鶤鶐', '飹勫嫢', '枲柊氠', '鍎鞚韕', '焲犈', + '殍涾烰', '齞齝囃', '蹅輶', '孻憵', '擙樲橚', '藒襓謥', '岯岪弨', '廞徲', '孻憵懥', '趡趛踠', ]; + + $this->assertEquals($tokens, $tokenizer->tokenize($text)); + } +} From 365a9baeca2c4394fff8a1dabdbe8d1c78185187 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 7 May 2016 23:53:42 +0200 Subject: [PATCH 22/30] update docs --- README.md | 4 ++ docs/index.md | 6 ++- docs/machine-learning/classification/svc.md | 47 +++++++++++++++++ .../token-count-vectorizer.md | 50 +++++++++++++++++++ docs/machine-learning/regression/svr.md | 44 ++++++++++++++++ mkdocs.yml | 4 ++ 6 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 docs/machine-learning/classification/svc.md create mode 100644 docs/machine-learning/feature-extraction/token-count-vectorizer.md create mode 100644 docs/machine-learning/regression/svr.md diff --git a/README.md b/README.md index 4b0e6a8..20cb9ca 100644 --- a/README.md +++ b/README.md @@ -37,15 +37,19 @@ composer require php-ai/php-ml ## Features * Classification + * [SVC](http://php-ml.readthedocs.io/en/latest/machine-learning/classification/svc/) * [k-Nearest Neighbors](http://php-ml.readthedocs.io/en/latest/machine-learning/classification/k-nearest-neighbors/) * [Naive Bayes](http://php-ml.readthedocs.io/en/latest/machine-learning/classification/naive-bayes/) * Regression * [Least Squares](http://php-ml.readthedocs.io/en/latest/machine-learning/regression/least-squares/) + * [SVR](http://php-ml.readthedocs.io/en/latest/machine-learning/regression/svr/) * Clustering * [k-Means](http://php-ml.readthedocs.io/en/latest/machine-learning/clustering/k-means) * [DBSCAN](http://php-ml.readthedocs.io/en/latest/machine-learning/clustering/dbscan) * Cross Validation * [Random Split](http://php-ml.readthedocs.io/en/latest/machine-learning/cross-validation/random-split) +* Feature Extraction + * [Token Count Vectorizer](http://php-ml.readthedocs.io/en/latest/machine-learning/feature-extraction/token-count-vectorizer) * Datasets * [CSV](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/csv-dataset) * Ready to use: diff --git a/docs/index.md b/docs/index.md index d3f65b7..20cb9ca 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -# PHP Machine Learning library +# PHP-ML - Machine Learning library for PHP [![Build Status](https://scrutinizer-ci.com/g/php-ai/php-ml/badges/build.png?b=develop)](https://scrutinizer-ci.com/g/php-ai/php-ml/build-status/develop) [![Documentation Status](https://readthedocs.org/projects/php-ml/badge/?version=develop)](http://php-ml.readthedocs.org/en/develop/?badge=develop) @@ -37,15 +37,19 @@ composer require php-ai/php-ml ## Features * Classification + * [SVC](http://php-ml.readthedocs.io/en/latest/machine-learning/classification/svc/) * [k-Nearest Neighbors](http://php-ml.readthedocs.io/en/latest/machine-learning/classification/k-nearest-neighbors/) * [Naive Bayes](http://php-ml.readthedocs.io/en/latest/machine-learning/classification/naive-bayes/) * Regression * [Least Squares](http://php-ml.readthedocs.io/en/latest/machine-learning/regression/least-squares/) + * [SVR](http://php-ml.readthedocs.io/en/latest/machine-learning/regression/svr/) * Clustering * [k-Means](http://php-ml.readthedocs.io/en/latest/machine-learning/clustering/k-means) * [DBSCAN](http://php-ml.readthedocs.io/en/latest/machine-learning/clustering/dbscan) * Cross Validation * [Random Split](http://php-ml.readthedocs.io/en/latest/machine-learning/cross-validation/random-split) +* Feature Extraction + * [Token Count Vectorizer](http://php-ml.readthedocs.io/en/latest/machine-learning/feature-extraction/token-count-vectorizer) * Datasets * [CSV](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/csv-dataset) * Ready to use: diff --git a/docs/machine-learning/classification/svc.md b/docs/machine-learning/classification/svc.md new file mode 100644 index 0000000..d502dac --- /dev/null +++ b/docs/machine-learning/classification/svc.md @@ -0,0 +1,47 @@ +# Support Vector Classification + +Classifier implementing Support Vector Machine based on libsvm. + +### Constructor Parameters + +* $kernel (int) - kernel type to be used in the algorithm (default Kernel::LINEAR) +* $cost (float) - parameter C of C-SVC (default 1.0) +* $degree (int) - degree of the Kernel::POLYNOMIAL function (default 3) +* $gamma (float) - kernel coefficient for ‘Kernel::RBF’, ‘Kernel::POLYNOMIAL’ and ‘Kernel::SIGMOID’. If gamma is ‘null’ then 1/features will be used instead. +* $coef0 (float) - independent term in kernel function. It is only significant in ‘Kernel::POLYNOMIAL’ and ‘Kernel::SIGMOID’ (default 0.0) +* $tolerance (float) - tolerance of termination criterion (default 0.001) +* $cacheSize (int) - cache memory size in MB (default 100) +* $shrinking (bool) - whether to use the shrinking heuristics (default true) +* $probabilityEstimates (bool) - whether to enable probability estimates (default false) + +``` +$classifier = new SVC(Kernel::LINEAR, $cost = 1000); +$classifier = new SVC(Kernel::RBF, $cost = 1000, $degree = 3, $gamma = 6); +``` + +### Train + +To train a classifier simply provide train samples and labels (as `array`). Example: + +``` +use Phpml\Classification\SVC; +use Phpml\SupportVectorMachine\Kernel; + +$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]]; +$labels = ['a', 'a', 'a', 'b', 'b', 'b']; + +$classifier = new SVC(Kernel::LINEAR, $cost = 1000); +$classifier->train($samples, $labels); +``` + +### Predict + +To predict sample label use `predict` method. You can provide one sample or array of samples: + +``` +$classifier->predict([3, 2]); +// return 'b' + +$classifier->predict([[3, 2], [1, 5]]); +// return ['b', 'a'] +``` diff --git a/docs/machine-learning/feature-extraction/token-count-vectorizer.md b/docs/machine-learning/feature-extraction/token-count-vectorizer.md new file mode 100644 index 0000000..83c6aaa --- /dev/null +++ b/docs/machine-learning/feature-extraction/token-count-vectorizer.md @@ -0,0 +1,50 @@ +# Token Count Vectorizer + +Transform a collection of text samples to a vector of token counts. + +### Constructor Parameters + +* $tokenizer (Tokenizer) - tokenizer object (see below) +* $minDF (float) - ignore tokens that have a samples frequency strictly lower than the given threshold. This value is also called cut-off in the literature. (default 0) + +``` +use Phpml\FeatureExtraction\TokenCountVectorizer; +use Phpml\Tokenization\WhitespaceTokenizer; + +$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer()); +``` + +### Transformation + +To transform a collection of text samples use `transform` method. Example: + +``` +$samples = [ + 'Lorem ipsum dolor sit amet dolor', + 'Mauris placerat ipsum dolor', + 'Mauris diam eros fringilla diam', +]; + +$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer()); +$vectorizer->transform($samples) +// return $vector = [ +// [0 => 1, 1 => 1, 2 => 2, 3 => 1, 4 => 1], +// [5 => 1, 6 => 1, 1 => 1, 2 => 1], +// [5 => 1, 7 => 2, 8 => 1, 9 => 1], +//]; + +``` + +### Vocabulary + +You can extract vocabulary using `getVocabulary()` method. Example: + +``` +$vectorizer->getVocabulary(); +// return $vocabulary = ['Lorem', 'ipsum', 'dolor', 'sit', 'amet', 'Mauris', 'placerat', 'diam', 'eros', 'fringilla']; +``` + +### Tokenizers + +* WhitespaceTokenizer - select tokens by whitespace. +* WordTokenizer - select tokens of 2 or more alphanumeric characters (punctuation is completely ignored and always treated as a token separator). diff --git a/docs/machine-learning/regression/svr.md b/docs/machine-learning/regression/svr.md new file mode 100644 index 0000000..ed2d10f --- /dev/null +++ b/docs/machine-learning/regression/svr.md @@ -0,0 +1,44 @@ +# Support Vector Regression + +Class implementing Epsilon-Support Vector Regression based on libsvm. + +### Constructor Parameters + +* $kernel (int) - kernel type to be used in the algorithm (default Kernel::LINEAR) +* $degree (int) - degree of the Kernel::POLYNOMIAL function (default 3) +* $epsilon (float) - epsilon in loss function of epsilon-SVR (default 0.1) +* $cost (float) - parameter C of C-SVC (default 1.0) +* $gamma (float) - kernel coefficient for ‘Kernel::RBF’, ‘Kernel::POLYNOMIAL’ and ‘Kernel::SIGMOID’. If gamma is ‘null’ then 1/features will be used instead. +* $coef0 (float) - independent term in kernel function. It is only significant in ‘Kernel::POLYNOMIAL’ and ‘Kernel::SIGMOID’ (default 0.0) +* $tolerance (float) - tolerance of termination criterion (default 0.001) +* $cacheSize (int) - cache memory size in MB (default 100) +* $shrinking (bool) - whether to use the shrinking heuristics (default true) + +``` +$regression = new SVR(Kernel::LINEAR); +$regression = new SVR(Kernel::LINEAR, $degree = 3, $epsilon=10.0); +``` + +### Train + +To train a model simply provide train samples and targets values (as `array`). Example: + +``` +use Phpml\Regression\SVR; +use Phpml\SupportVectorMachine\Kernel; + +$samples = [[60], [61], [62], [63], [65]]; +$targets = [3.1, 3.6, 3.8, 4, 4.1]; + +$regression = new SVR(Kernel::LINEAR); +$regression->train($samples, $targets); +``` + +### Predict + +To predict sample target value use `predict` method. You can provide one sample or array of samples: + +``` +$regression->predict([64]) +// return 4.03 +``` diff --git a/mkdocs.yml b/mkdocs.yml index a596d91..f833fc3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,15 +3,19 @@ pages: - Home: index.md - Machine Learning: - Classification: + - SVC: machine-learning/classification/svc.md - KNearestNeighbors: machine-learning/classification/k-nearest-neighbors.md - NaiveBayes: machine-learning/classification/naive-bayes.md - Regression: - LeastSquares: machine-learning/regression/least-squares.md + - SVR: machine-learning/regression/svr.md - Clustering: - KMeans: machine-learning/clustering/k-means.md - DBSCAN: machine-learning/clustering/dbscan.md - Cross Validation: - RandomSplit: machine-learning/cross-validation/random-split.md + - Feature Extraction: + - Token Count Vectorizer: machine-learning/feature-extraction/token-count-vectorizer.md - Datasets: - Array Dataset: machine-learning/datasets/array-dataset.md - CSV Dataset: machine-learning/datasets/csv-dataset.md From b0ab236ab9cdefe5c1822449a03391807556b50b Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sun, 8 May 2016 14:47:17 +0200 Subject: [PATCH 23/30] create imputer tool for completing missing values --- src/Phpml/Preprocessing/Imputer.php | 86 +++++++++++++++++++ src/Phpml/Preprocessing/Imputer/Strategy.php | 15 ++++ .../Imputer/Strategy/MeanStrategy.php | 16 ++++ src/Phpml/Preprocessing/Preprocessor.php | 13 +++ tests/Phpml/Preprocessing/ImputerTest.php | 55 ++++++++++++ 5 files changed, 185 insertions(+) create mode 100644 src/Phpml/Preprocessing/Imputer.php create mode 100644 src/Phpml/Preprocessing/Imputer/Strategy.php create mode 100644 src/Phpml/Preprocessing/Imputer/Strategy/MeanStrategy.php create mode 100644 src/Phpml/Preprocessing/Preprocessor.php create mode 100644 tests/Phpml/Preprocessing/ImputerTest.php diff --git a/src/Phpml/Preprocessing/Imputer.php b/src/Phpml/Preprocessing/Imputer.php new file mode 100644 index 0000000..355ff14 --- /dev/null +++ b/src/Phpml/Preprocessing/Imputer.php @@ -0,0 +1,86 @@ +missingValue = $missingValue; + $this->strategy = $strategy; + $this->axis = $axis; + } + + /** + * @param array $samples + */ + public function preprocess(array &$samples) + { + foreach ($samples as &$sample) { + $this->preprocessSample($sample, $samples); + } + } + + /** + * @param array $sample + * @param array $samples + */ + private function preprocessSample(array &$sample, array $samples) + { + foreach ($sample as $column => &$value) { + if ($value === $this->missingValue) { + $value = $this->strategy->replaceValue($this->getAxis($column, $sample, $samples)); + } + } + } + + /** + * @param int $column + * @param array $currentSample + * @param array $samples + * + * @return array + */ + private function getAxis(int $column, array $currentSample, array $samples): array + { + if (self::AXIS_ROW === $this->axis) { + return array_diff($currentSample, [$this->missingValue]); + } + + $axis = []; + foreach ($samples as $sample) { + if ($sample[$column] !== $this->missingValue) { + $axis[] = $sample[$column]; + } + } + + return $axis; + } +} diff --git a/src/Phpml/Preprocessing/Imputer/Strategy.php b/src/Phpml/Preprocessing/Imputer/Strategy.php new file mode 100644 index 0000000..2cf1144 --- /dev/null +++ b/src/Phpml/Preprocessing/Imputer/Strategy.php @@ -0,0 +1,15 @@ +preprocess($data); + + $this->assertEquals($imputeData, $data, '', $delta = 0.01); + } + + public function testCompletingMissingValuesWithMeanStrategyOnRowAxis() + { + $data = [ + [1, null, 3, 4], + [4, 3, 2, 1], + [null, 6, 7, 8], + [8, 7, null, 5], + ]; + + $imputeData = [ + [1, 2.66, 3, 4], + [4, 3, 2, 1], + [7, 6, 7, 8], + [8, 7, 6.66, 5], + ]; + + $imputer = new Imputer(null, new MeanStrategy(), Imputer::AXIS_ROW); + $imputer->preprocess($data); + + $this->assertEquals($imputeData, $data, '', $delta = 0.01); + } +} From ed1e07e803bda538c6295bb882d0259674a932f6 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sun, 8 May 2016 19:12:39 +0200 Subject: [PATCH 24/30] median function in statistic --- src/Phpml/Math/Statistic/Mean.php | 33 +++++++++++++++++-- .../Imputer/Strategy/MeanStrategy.php | 5 +++ tests/Phpml/Math/Statistic/MeanTest.php | 23 +++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/Phpml/Math/Statistic/Mean.php b/src/Phpml/Math/Statistic/Mean.php index 2716b78..0988e01 100644 --- a/src/Phpml/Math/Statistic/Mean.php +++ b/src/Phpml/Math/Statistic/Mean.php @@ -4,15 +4,42 @@ declare (strict_types = 1); namespace Phpml\Math\Statistic; +use Phpml\Exception\InvalidArgumentException; + class Mean { /** - * @param array $a + * @param array $numbers * * @return float */ - public static function arithmetic(array $a) + public static function arithmetic(array $numbers) { - return array_sum($a) / count($a); + return array_sum($numbers) / count($numbers); } + + /** + * @param array $numbers + * + * @return float|mixed + * + * @throws InvalidArgumentException + */ + public static function median(array $numbers) { + $count = count($numbers); + if (0 == $count) { + throw InvalidArgumentException::arrayCantBeEmpty(); + } + + $middleIndex = floor($count / 2); + sort($numbers, SORT_NUMERIC); + $median = $numbers[$middleIndex]; + + if (0 == $count % 2) { + $median = ($median + $numbers[$middleIndex - 1]) / 2; + } + + return $median; + } + } diff --git a/src/Phpml/Preprocessing/Imputer/Strategy/MeanStrategy.php b/src/Phpml/Preprocessing/Imputer/Strategy/MeanStrategy.php index b9ffdec..12a732b 100644 --- a/src/Phpml/Preprocessing/Imputer/Strategy/MeanStrategy.php +++ b/src/Phpml/Preprocessing/Imputer/Strategy/MeanStrategy.php @@ -9,6 +9,11 @@ use Phpml\Math\Statistic\Mean; class MeanStrategy implements Strategy { + /** + * @param array $currentAxis + * + * @return float + */ public function replaceValue(array $currentAxis) { return Mean::arithmetic($currentAxis); diff --git a/tests/Phpml/Math/Statistic/MeanTest.php b/tests/Phpml/Math/Statistic/MeanTest.php index f0dca3b..d56f965 100644 --- a/tests/Phpml/Math/Statistic/MeanTest.php +++ b/tests/Phpml/Math/Statistic/MeanTest.php @@ -15,4 +15,27 @@ class MeanTest extends \PHPUnit_Framework_TestCase $this->assertEquals(41.16, Mean::arithmetic([43, 21, 25, 42, 57, 59]), '', $delta); $this->assertEquals(1.7, Mean::arithmetic([0.5, 0.5, 1.5, 2.5, 3.5]), '', $delta); } + + /** + * @expectedException \Phpml\Exception\InvalidArgumentException + */ + public function testThrowExceptionOnEmptyArrayMedian() + { + Mean::median([]); + } + + public function testMedianOnOddLengthArray() + { + $numbers = [5, 2, 6, 1, 3]; + + $this->assertEquals(3, Mean::median($numbers)); + } + + public function testMedianOnEvenLengthArray() + { + $numbers = [5, 2, 6, 1, 3, 4]; + + $this->assertEquals(3.5, Mean::median($numbers)); + } + } From a761d0e8f2286b832345147fbd545c6e687615a6 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sun, 8 May 2016 19:23:54 +0200 Subject: [PATCH 25/30] mode (dominant) from numbers --- src/Phpml/Math/Statistic/Mean.php | 39 ++++++++++++++++++++++--- tests/Phpml/Math/Statistic/MeanTest.php | 26 ++++++++++++++++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/Phpml/Math/Statistic/Mean.php b/src/Phpml/Math/Statistic/Mean.php index 0988e01..9d87a97 100644 --- a/src/Phpml/Math/Statistic/Mean.php +++ b/src/Phpml/Math/Statistic/Mean.php @@ -12,9 +12,13 @@ class Mean * @param array $numbers * * @return float + * + * @throws InvalidArgumentException */ public static function arithmetic(array $numbers) { + self::checkArrayLength($numbers); + return array_sum($numbers) / count($numbers); } @@ -26,11 +30,10 @@ class Mean * @throws InvalidArgumentException */ public static function median(array $numbers) { - $count = count($numbers); - if (0 == $count) { - throw InvalidArgumentException::arrayCantBeEmpty(); - } + self::checkArrayLength($numbers); + + $count = count($numbers); $middleIndex = floor($count / 2); sort($numbers, SORT_NUMERIC); $median = $numbers[$middleIndex]; @@ -42,4 +45,32 @@ class Mean return $median; } + /** + * @param array $numbers + * + * @return mixed + * + * @throws InvalidArgumentException + */ + public static function mode(array $numbers) + { + self::checkArrayLength($numbers); + + $values = array_count_values($numbers); + + return array_search(max($values), $values); + } + + /** + * @param array $array + * + * @throws InvalidArgumentException + */ + private static function checkArrayLength(array $array) + { + if (0 == count($array)) { + throw InvalidArgumentException::arrayCantBeEmpty(); + } + } + } diff --git a/tests/Phpml/Math/Statistic/MeanTest.php b/tests/Phpml/Math/Statistic/MeanTest.php index d56f965..289f9a3 100644 --- a/tests/Phpml/Math/Statistic/MeanTest.php +++ b/tests/Phpml/Math/Statistic/MeanTest.php @@ -8,6 +8,15 @@ use Phpml\Math\Statistic\Mean; class MeanTest extends \PHPUnit_Framework_TestCase { + + /** + * @expectedException \Phpml\Exception\InvalidArgumentException + */ + public function testArithmeticThrowExceptionOnEmptyArray() + { + Mean::arithmetic([]); + } + public function testArithmeticMean() { $delta = 0.01; @@ -19,7 +28,7 @@ class MeanTest extends \PHPUnit_Framework_TestCase /** * @expectedException \Phpml\Exception\InvalidArgumentException */ - public function testThrowExceptionOnEmptyArrayMedian() + public function testMedianThrowExceptionOnEmptyArray() { Mean::median([]); } @@ -38,4 +47,19 @@ class MeanTest extends \PHPUnit_Framework_TestCase $this->assertEquals(3.5, Mean::median($numbers)); } + /** + * @expectedException \Phpml\Exception\InvalidArgumentException + */ + public function testModeThrowExceptionOnEmptyArray() + { + Mean::mode([]); + } + + public function testModeOnArray() + { + $numbers = [5, 2, 6, 1, 3, 4, 6, 6, 5]; + + $this->assertEquals(6, Mean::mode($numbers)); + } + } From 65cdfe64b2c307b223fd90f160e49d90e9cc4321 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sun, 8 May 2016 19:33:39 +0200 Subject: [PATCH 26/30] implement Median and MostFrequent strategy for imputer --- src/Phpml/Math/Statistic/Mean.php | 5 +- .../Imputer/Strategy/MedianStrategy.php | 21 ++++ .../Imputer/Strategy/MostFrequentStrategy.php | 21 ++++ tests/Phpml/Math/Statistic/MeanTest.php | 2 - tests/Phpml/Preprocessing/ImputerTest.php | 98 ++++++++++++++++++- 5 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 src/Phpml/Preprocessing/Imputer/Strategy/MedianStrategy.php create mode 100644 src/Phpml/Preprocessing/Imputer/Strategy/MostFrequentStrategy.php diff --git a/src/Phpml/Math/Statistic/Mean.php b/src/Phpml/Math/Statistic/Mean.php index 9d87a97..3804848 100644 --- a/src/Phpml/Math/Statistic/Mean.php +++ b/src/Phpml/Math/Statistic/Mean.php @@ -29,8 +29,8 @@ class Mean * * @throws InvalidArgumentException */ - public static function median(array $numbers) { - + public static function median(array $numbers) + { self::checkArrayLength($numbers); $count = count($numbers); @@ -72,5 +72,4 @@ class Mean throw InvalidArgumentException::arrayCantBeEmpty(); } } - } diff --git a/src/Phpml/Preprocessing/Imputer/Strategy/MedianStrategy.php b/src/Phpml/Preprocessing/Imputer/Strategy/MedianStrategy.php new file mode 100644 index 0000000..3746760 --- /dev/null +++ b/src/Phpml/Preprocessing/Imputer/Strategy/MedianStrategy.php @@ -0,0 +1,21 @@ +assertEquals(6, Mean::mode($numbers)); } - } diff --git a/tests/Phpml/Preprocessing/ImputerTest.php b/tests/Phpml/Preprocessing/ImputerTest.php index 630f4b1..9da9765 100644 --- a/tests/Phpml/Preprocessing/ImputerTest.php +++ b/tests/Phpml/Preprocessing/ImputerTest.php @@ -6,10 +6,12 @@ namespace tests\Preprocessing; use Phpml\Preprocessing\Imputer; use Phpml\Preprocessing\Imputer\Strategy\MeanStrategy; +use Phpml\Preprocessing\Imputer\Strategy\MedianStrategy; +use Phpml\Preprocessing\Imputer\Strategy\MostFrequentStrategy; class ImputerTest extends \PHPUnit_Framework_TestCase { - public function testCompletingMissingValuesWithMeanStrategyOnColumnAxis() + public function testComplementsMissingValuesWithMeanStrategyOnColumnAxis() { $data = [ [1, null, 3, 4], @@ -31,7 +33,7 @@ class ImputerTest extends \PHPUnit_Framework_TestCase $this->assertEquals($imputeData, $data, '', $delta = 0.01); } - public function testCompletingMissingValuesWithMeanStrategyOnRowAxis() + public function testComplementsMissingValuesWithMeanStrategyOnRowAxis() { $data = [ [1, null, 3, 4], @@ -52,4 +54,96 @@ class ImputerTest extends \PHPUnit_Framework_TestCase $this->assertEquals($imputeData, $data, '', $delta = 0.01); } + + public function testComplementsMissingValuesWithMediaStrategyOnColumnAxis() + { + $data = [ + [1, null, 3, 4], + [4, 3, 2, 1], + [null, 6, 7, 8], + [8, 7, null, 5], + ]; + + $imputeData = [ + [1, 6, 3, 4], + [4, 3, 2, 1], + [4, 6, 7, 8], + [8, 7, 3, 5], + ]; + + $imputer = new Imputer(null, new MedianStrategy(), Imputer::AXIS_COLUMN); + $imputer->preprocess($data); + + $this->assertEquals($imputeData, $data, '', $delta = 0.01); + } + + public function testComplementsMissingValuesWithMediaStrategyOnRowAxis() + { + $data = [ + [1, null, 3, 4], + [4, 3, 2, 1], + [null, 6, 7, 8], + [8, 7, null, 5], + ]; + + $imputeData = [ + [1, 3, 3, 4], + [4, 3, 2, 1], + [7, 6, 7, 8], + [8, 7, 7, 5], + ]; + + $imputer = new Imputer(null, new MedianStrategy(), Imputer::AXIS_ROW); + $imputer->preprocess($data); + + $this->assertEquals($imputeData, $data, '', $delta = 0.01); + } + + public function testComplementsMissingValuesWithMostFrequentStrategyOnColumnAxis() + { + $data = [ + [1, null, 3, 4], + [4, 3, 2, 1], + [null, 6, 7, 8], + [8, 7, null, 5], + [8, 3, 2, 5], + ]; + + $imputeData = [ + [1, 3, 3, 4], + [4, 3, 2, 1], + [8, 6, 7, 8], + [8, 7, 2, 5], + [8, 3, 2, 5], + ]; + + $imputer = new Imputer(null, new MostFrequentStrategy(), Imputer::AXIS_COLUMN); + $imputer->preprocess($data); + + $this->assertEquals($imputeData, $data); + } + + public function testComplementsMissingValuesWithMostFrequentStrategyOnRowAxis() + { + $data = [ + [1, null, 3, 4, 3], + [4, 3, 2, 1, 7], + [null, 6, 7, 8, 6], + [8, 7, null, 5, 5], + [8, 3, 2, 5, 4], + ]; + + $imputeData = [ + [1, 3, 3, 4, 3], + [4, 3, 2, 1, 7], + [6, 6, 7, 8, 6], + [8, 7, 5, 5, 5], + [8, 3, 2, 5, 4], + ]; + + $imputer = new Imputer(null, new MostFrequentStrategy(), Imputer::AXIS_ROW); + $imputer->preprocess($data); + + $this->assertEquals($imputeData, $data); + } } From fb04b578535ad17f303cc508bde0e771e2c194ea Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sun, 8 May 2016 20:35:01 +0200 Subject: [PATCH 27/30] implement data Normalizer with L1 and L2 norm --- src/Phpml/Exception/NormalizerException.php | 16 ++++ src/Phpml/Preprocessing/Normalizer.php | 83 ++++++++++++++++++++ tests/Phpml/Preprocessing/NormalizerTest.php | 58 ++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 src/Phpml/Exception/NormalizerException.php create mode 100644 src/Phpml/Preprocessing/Normalizer.php create mode 100644 tests/Phpml/Preprocessing/NormalizerTest.php diff --git a/src/Phpml/Exception/NormalizerException.php b/src/Phpml/Exception/NormalizerException.php new file mode 100644 index 0000000..9f88f0c --- /dev/null +++ b/src/Phpml/Exception/NormalizerException.php @@ -0,0 +1,16 @@ +norm = $norm; + } + + /** + * @param array $samples + */ + public function preprocess(array &$samples) + { + $method = sprintf('normalizeL%s', $this->norm); + foreach ($samples as &$sample) { + $this->$method($sample); + } + } + + /** + * @param array $sample + */ + private function normalizeL1(array &$sample) + { + $norm1 = 0; + foreach ($sample as $feature) { + $norm1 += abs($feature); + } + + if (0 == $norm1) { + $count = count($sample); + $sample = array_fill(0, $count, 1.0 / $count); + } else { + foreach ($sample as &$feature) { + $feature = $feature / $norm1; + } + } + } + + /** + * @param array $sample + */ + private function normalizeL2(array &$sample) + { + $norm2 = 0; + foreach ($sample as $feature) { + $norm2 += $feature * $feature; + } + $norm2 = sqrt($norm2); + + if (0 == $norm2) { + $sample = array_fill(0, count($sample), 1); + } else { + foreach ($sample as &$feature) { + $feature = $feature / $norm2; + } + } + } +} diff --git a/tests/Phpml/Preprocessing/NormalizerTest.php b/tests/Phpml/Preprocessing/NormalizerTest.php new file mode 100644 index 0000000..b373944 --- /dev/null +++ b/tests/Phpml/Preprocessing/NormalizerTest.php @@ -0,0 +1,58 @@ +preprocess($samples); + + $this->assertEquals($normalized, $samples, '', $delta = 0.01); + } + + public function testNormalizeSamplesWithL1Norm() + { + $samples = [ + [1, -1, 2], + [2, 0, 0], + [0, 1, -1], + ]; + + $normalized = [ + [0.25, -0.25, 0.5], + [1.0, 0.0, 0.0], + [0.0, 0.5, -0.5], + ]; + + $normalizer = new Normalizer(Normalizer::NORM_L1); + $normalizer->preprocess($samples); + + $this->assertEquals($normalized, $samples, '', $delta = 0.01); + } +} From 77647fda45c0ff8876447b337cf33b5c39ae3db5 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Mon, 9 May 2016 23:52:09 +0200 Subject: [PATCH 28/30] update readme --- README.md | 4 ++++ docs/index.md | 4 ++++ .../preprocessing/imputation-missing-values.md | 0 docs/machine-learning/preprocessing/normalization.md | 0 docs/math/statistic.md | 7 +++++++ 5 files changed, 15 insertions(+) create mode 100644 docs/machine-learning/preprocessing/imputation-missing-values.md create mode 100644 docs/machine-learning/preprocessing/normalization.md create mode 100644 docs/math/statistic.md diff --git a/README.md b/README.md index 20cb9ca..dc65c09 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,9 @@ composer require php-ai/php-ml * [DBSCAN](http://php-ml.readthedocs.io/en/latest/machine-learning/clustering/dbscan) * Cross Validation * [Random Split](http://php-ml.readthedocs.io/en/latest/machine-learning/cross-validation/random-split) +* Preprocessing + * [Normalization](http://php-ml.readthedocs.io/en/latest/machine-learning/preprocessing/normalization) + * [Imputation missing values](http://php-ml.readthedocs.io/en/latest/machine-learning/preprocessing/imputation-missing-values) * Feature Extraction * [Token Count Vectorizer](http://php-ml.readthedocs.io/en/latest/machine-learning/feature-extraction/token-count-vectorizer) * Datasets @@ -57,6 +60,7 @@ composer require php-ai/php-ml * Math * [Distance](http://php-ml.readthedocs.io/en/latest/math/distance/) * [Matrix](http://php-ml.readthedocs.io/en/latest/math/matrix/) + * [Statistic](http://php-ml.readthedocs.io/en/latest/math/statistic/) ## Contribute diff --git a/docs/index.md b/docs/index.md index 20cb9ca..dc65c09 100644 --- a/docs/index.md +++ b/docs/index.md @@ -48,6 +48,9 @@ composer require php-ai/php-ml * [DBSCAN](http://php-ml.readthedocs.io/en/latest/machine-learning/clustering/dbscan) * Cross Validation * [Random Split](http://php-ml.readthedocs.io/en/latest/machine-learning/cross-validation/random-split) +* Preprocessing + * [Normalization](http://php-ml.readthedocs.io/en/latest/machine-learning/preprocessing/normalization) + * [Imputation missing values](http://php-ml.readthedocs.io/en/latest/machine-learning/preprocessing/imputation-missing-values) * Feature Extraction * [Token Count Vectorizer](http://php-ml.readthedocs.io/en/latest/machine-learning/feature-extraction/token-count-vectorizer) * Datasets @@ -57,6 +60,7 @@ composer require php-ai/php-ml * Math * [Distance](http://php-ml.readthedocs.io/en/latest/math/distance/) * [Matrix](http://php-ml.readthedocs.io/en/latest/math/matrix/) + * [Statistic](http://php-ml.readthedocs.io/en/latest/math/statistic/) ## Contribute diff --git a/docs/machine-learning/preprocessing/imputation-missing-values.md b/docs/machine-learning/preprocessing/imputation-missing-values.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/machine-learning/preprocessing/normalization.md b/docs/machine-learning/preprocessing/normalization.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/math/statistic.md b/docs/math/statistic.md new file mode 100644 index 0000000..89cc00e --- /dev/null +++ b/docs/math/statistic.md @@ -0,0 +1,7 @@ +# Statistic + +### Correlation + +### Mean + +### Standard Deviation From ccfa38ba4d3689f3fbf4ee4a1ed7e23d5c27dd18 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Tue, 10 May 2016 23:44:28 +0200 Subject: [PATCH 29/30] wine and glass demo dataset docs --- README.md | 2 + docs/index.md | 2 + docs/machine-learning/datasets/demo/glass.md | 42 +++++++++++++++++++ docs/machine-learning/datasets/demo/iris.md | 2 + docs/machine-learning/datasets/demo/wine.md | 35 ++++++++++++++++ .../imputation-missing-values.md | 1 + .../preprocessing/normalization.md | 1 + 7 files changed, 85 insertions(+) create mode 100644 docs/machine-learning/datasets/demo/glass.md create mode 100644 docs/machine-learning/datasets/demo/wine.md diff --git a/README.md b/README.md index dc65c09..da95839 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,8 @@ composer require php-ai/php-ml * [CSV](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/csv-dataset) * Ready to use: * [Iris](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/demo/iris/) + * [Wine](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/demo/wine/) + * [Glass](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/demo/glass/) * Math * [Distance](http://php-ml.readthedocs.io/en/latest/math/distance/) * [Matrix](http://php-ml.readthedocs.io/en/latest/math/matrix/) diff --git a/docs/index.md b/docs/index.md index dc65c09..da95839 100644 --- a/docs/index.md +++ b/docs/index.md @@ -57,6 +57,8 @@ composer require php-ai/php-ml * [CSV](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/csv-dataset) * Ready to use: * [Iris](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/demo/iris/) + * [Wine](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/demo/wine/) + * [Glass](http://php-ml.readthedocs.io/en/latest/machine-learning/datasets/demo/glass/) * Math * [Distance](http://php-ml.readthedocs.io/en/latest/math/distance/) * [Matrix](http://php-ml.readthedocs.io/en/latest/math/matrix/) diff --git a/docs/machine-learning/datasets/demo/glass.md b/docs/machine-learning/datasets/demo/glass.md new file mode 100644 index 0000000..1ad84d3 --- /dev/null +++ b/docs/machine-learning/datasets/demo/glass.md @@ -0,0 +1,42 @@ +# Glass Dataset + +From USA Forensic Science Service; 6 types of glass; defined in terms of their oxide content (i.e. Na, Fe, K, etc) + +### Specification + +| Classes | 6 | +| Samples total | 214 | +| Features per sample | 9 | + +Samples per class: + * 70 float processed building windows + * 17 float processed vehicle windows + * 76 non-float processed building windows + * 13 containers + * 9 tableware + * 29 headlamps + +### Load + +To load Glass dataset simple use: + +``` +use Phpml\Dataset\Demo\Glass; + +$dataset = new Glass(); +``` + +### Several samples example + +``` +RI: refractive index,Na: Sodium,Mg: Magnesium,Al: Aluminum,Si: Silicon,K: Potassium,Ca: Calcium,Ba: Barium,Fe: Iron,type of glass +1.52101,13.64,4.49,1.10,71.78,0.06,8.75,0.00,0.00,building_windows_float_processed +1.51761,13.89,3.60,1.36,72.73,0.48,7.83,0.00,0.00,building_windows_float_processed +1.51618,13.53,3.55,1.54,72.99,0.39,7.78,0.00,0.00,building_windows_float_processed +1.51766,13.21,3.69,1.29,72.61,0.57,8.22,0.00,0.00,building_windows_float_processed +1.51742,13.27,3.62,1.24,73.08,0.55,8.07,0.00,0.00,building_windows_float_processed +1.51596,12.79,3.61,1.62,72.97,0.64,8.07,0.00,0.26,building_windows_float_processed +1.51743,13.30,3.60,1.14,73.09,0.58,8.17,0.00,0.00,building_windows_float_processed +1.51756,13.15,3.61,1.05,73.24,0.57,8.24,0.00,0.00,building_windows_float_processed +1.51918,14.04,3.58,1.37,72.08,0.56,8.30,0.00,0.00,building_windows_float_processed +``` diff --git a/docs/machine-learning/datasets/demo/iris.md b/docs/machine-learning/datasets/demo/iris.md index 5972f1b..8baf731 100644 --- a/docs/machine-learning/datasets/demo/iris.md +++ b/docs/machine-learning/datasets/demo/iris.md @@ -14,6 +14,8 @@ Most popular and widely available dataset of iris flower measurement and class n To load Iris dataset simple use: ``` +use Phpml\Dataset\Demo\Iris; + $dataset = new Iris(); ``` diff --git a/docs/machine-learning/datasets/demo/wine.md b/docs/machine-learning/datasets/demo/wine.md new file mode 100644 index 0000000..5b3f999 --- /dev/null +++ b/docs/machine-learning/datasets/demo/wine.md @@ -0,0 +1,35 @@ +# Wine Dataset + +These data are the results of a chemical analysis of wines grown in the same region in Italy but derived from three different cultivars. The analysis determined the quantities of 13 constituents found in each of the three types of wines. + +### Specification + +| Classes | 3 | +| Samples per class | class 1 59; class 2 71; class 3 48 | +| Samples total | 178 | +| Features per sample | 13 | + +### Load + +To load Wine dataset simple use: + +``` +use Phpml\Dataset\Demo\Wine; + +$dataset = new Wine(); +``` + +### Several samples example + +``` +alcohol,malic acid,ash,alcalinity of ash,magnesium,total phenols,flavanoids,nonflavanoid phenols,proanthocyanins,color intensity,hue,OD280/OD315 of diluted wines,proline,class +14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065,1 +13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050,1 +13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185,1 +14.37,1.95,2.5,16.8,113,3.85,3.49,.24,2.18,7.8,.86,3.45,1480,1 +13.24,2.59,2.87,21,118,2.8,2.69,.39,1.82,4.32,1.04,2.93,735,1 +14.2,1.76,2.45,15.2,112,3.27,3.39,.34,1.97,6.75,1.05,2.85,1450,1 +14.39,1.87,2.45,14.6,96,2.5,2.52,.3,1.98,5.25,1.02,3.58,1290,1 +14.06,2.15,2.61,17.6,121,2.6,2.51,.31,1.25,5.05,1.06,3.58,1295,1 +14.83,1.64,2.17,14,97,2.8,2.98,.29,1.98,5.2,1.08,2.85,1045,1 +``` diff --git a/docs/machine-learning/preprocessing/imputation-missing-values.md b/docs/machine-learning/preprocessing/imputation-missing-values.md index e69de29..db64d8d 100644 --- a/docs/machine-learning/preprocessing/imputation-missing-values.md +++ b/docs/machine-learning/preprocessing/imputation-missing-values.md @@ -0,0 +1 @@ +# Imputation missing values diff --git a/docs/machine-learning/preprocessing/normalization.md b/docs/machine-learning/preprocessing/normalization.md index e69de29..a0dbc80 100644 --- a/docs/machine-learning/preprocessing/normalization.md +++ b/docs/machine-learning/preprocessing/normalization.md @@ -0,0 +1 @@ +# Normalization From 325427c72382dbe8c2ce6ba7490959f8ff6b9e35 Mon Sep 17 00:00:00 2001 From: Arkadiusz Kondas Date: Sat, 14 May 2016 21:30:13 +0200 Subject: [PATCH 30/30] update missing docs --- .../imputation-missing-values.md | 44 +++++++++++ .../preprocessing/normalization.md | 58 ++++++++++++++ docs/math/statistic.md | 79 ++++++++++++++++++- 3 files changed, 178 insertions(+), 3 deletions(-) diff --git a/docs/machine-learning/preprocessing/imputation-missing-values.md b/docs/machine-learning/preprocessing/imputation-missing-values.md index db64d8d..186f424 100644 --- a/docs/machine-learning/preprocessing/imputation-missing-values.md +++ b/docs/machine-learning/preprocessing/imputation-missing-values.md @@ -1 +1,45 @@ # Imputation missing values + +For various reasons, many real world datasets contain missing values, often encoded as blanks, NaNs or other placeholders. +To solve this problem you can use the `Imputer` class. + +## Constructor Parameters + +* $missingValue (mixed) - this value will be replaced (default null) +* $strategy (Strategy) - imputation strategy (read to use: MeanStrategy, MedianStrategy, MostFrequentStrategy) +* $axis (int) - axis for strategy, Imputer::AXIS_COLUMN or Imputer::AXIS_ROW + +``` +$imputer = new Imputer(null, new MeanStrategy(), Imputer::AXIS_COLUMN); +$imputer = new Imputer(null, new MedianStrategy(), Imputer::AXIS_ROW); +``` + +## Strategy + +* MeanStrategy - replace missing values using the mean along the axis +* MedianStrategy - replace missing values using the median along the axis +* MostFrequentStrategy - replace missing using the most frequent value along the axis + +## Example of use + +``` +$data = [ + [1, null, 3, 4], + [4, 3, 2, 1], + [null, 6, 7, 8], + [8, 7, null, 5], +]; + +$imputer = new Imputer(null, new MeanStrategy(), Imputer::AXIS_COLUMN); +$imputer->preprocess($data); + +/* +$data = [ + [1, 5.33, 3, 4], + [4, 3, 2, 1], + [4.33, 6, 7, 8], + [8, 7, 4, 5], +]; +*/ + +``` diff --git a/docs/machine-learning/preprocessing/normalization.md b/docs/machine-learning/preprocessing/normalization.md index a0dbc80..61b1a8d 100644 --- a/docs/machine-learning/preprocessing/normalization.md +++ b/docs/machine-learning/preprocessing/normalization.md @@ -1 +1,59 @@ # Normalization + +Normalization is the process of scaling individual samples to have unit norm. + +## L2 norm + +[http://mathworld.wolfram.com/L2-Norm.html](http://mathworld.wolfram.com/L2-Norm.html) + +Example: + +``` +use Phpml\Preprocessing\Normalizer; + +$samples = [ + [1, -1, 2], + [2, 0, 0], + [0, 1, -1], +]; + +$normalizer = new Normalizer(); +$normalizer->preprocess($samples); + +/* +$samples = [ + [0.4, -0.4, 0.81], + [1.0, 0.0, 0.0], + [0.0, 0.7, -0.7], +]; +*/ + +``` + +## L1 norm + +[http://mathworld.wolfram.com/L1-Norm.html](http://mathworld.wolfram.com/L1-Norm.html) + +Example: + +``` +use Phpml\Preprocessing\Normalizer; + +$samples = [ + [1, -1, 2], + [2, 0, 0], + [0, 1, -1], +]; + +$normalizer = new Normalizer(Normalizer::NORM_L1); +$normalizer->preprocess($samples); + +/* +$samples = [ + [0.25, -0.25, 0.5], + [1.0, 0.0, 0.0], + [0.0, 0.5, -0.5], +]; +*/ + +``` diff --git a/docs/math/statistic.md b/docs/math/statistic.md index 89cc00e..626828e 100644 --- a/docs/math/statistic.md +++ b/docs/math/statistic.md @@ -1,7 +1,80 @@ # Statistic -### Correlation +Selected statistical methods. -### Mean +## Correlation -### Standard Deviation +Correlation coefficients are used in statistics to measure how strong a relationship is between two variables. There are several types of correlation coefficient. + +### Pearson correlation + +Pearson’s correlation or Pearson correlation is a correlation coefficient commonly used in linear regression. + +Example: + +``` +use Phpml\Math\Statistic\Correlation; + +$x = [43, 21, 25, 42, 57, 59]; +$y = [99, 65, 79, 75, 87, 82]; + +Correlation::pearson($x, $y); +// return 0.549 +``` + +## Mean + +### Arithmetic + +Example: + +``` +use Phpml\Math\Statistic\Mean; + +Mean::arithmetic([2, 5]; +// return 3.5 + +Mean::arithmetic([0.5, 0.5, 1.5, 2.5, 3.5]; +// return 1.7 +``` + +## Median + +Example: + +``` +use Phpml\Math\Statistic\Mean; + +Mean::median([5, 2, 6, 1, 3, 4]); +// return 3.5 + +Mean::median([5, 2, 6, 1, 3]); +// return 3 +``` + +## Mode + +Example: + +``` +use Phpml\Math\Statistic\Mean; + +Mean::mode([5, 2, 6, 1, 3, 4, 6, 6, 5]); +// return 6 +``` + +## Standard Deviation + +Example: + +``` +use Phpml\Math\Statistic\StandardDeviation; + +$population = [5, 6, 8, 9]; +StandardDeviation::population($population) +// return 1.825 + +$population = [7100, 15500, 4400, 4400, 5900, 4600, 8800, 2000, 2750, 2550, 960, 1025]; +StandardDeviation::population($population) +// return 4079 +```