diff --git a/src/AnomalyDetectors/GaussianMLE.php b/src/AnomalyDetectors/GaussianMLE.php index 560a2963d..97155fb39 100644 --- a/src/AnomalyDetectors/GaussianMLE.php +++ b/src/AnomalyDetectors/GaussianMLE.php @@ -254,13 +254,15 @@ public function partial(Dataset $dataset) : void $oldVariance -= $this->epsilon; + $delta = $n * ($oldMean - $mean); + $this->means[$column] = (($this->n * $oldMean) + ($n * $mean)) / $weight; $this->variances[$column] = ($this->n * $oldVariance + ($n * $variance) + ($this->n / ($n * $weight)) - * ($n * $oldMean - $n * $mean) ** 2) + * ($delta * $delta)) / $weight; } @@ -346,7 +348,10 @@ protected function logLikelihood(array $sample) : float $variance = $this->variances[$column]; $pdf = 0.5 * log(TWO_PI * $variance); - $pdf += 0.5 * (($value - $mean) ** 2) / $variance; + + $delta = $value - $mean; + + $pdf += 0.5 * ($delta * $delta) / $variance; $likelihood += $pdf; } diff --git a/src/Classifiers/GaussianNB.php b/src/Classifiers/GaussianNB.php index 201987e50..ebda4ca0c 100644 --- a/src/Classifiers/GaussianNB.php +++ b/src/Classifiers/GaussianNB.php @@ -273,6 +273,8 @@ public function partial(Dataset $dataset) : void [$mean, $variance] = Stats::meanVar($values); + $delta = $n * ($oldMean - $mean); + $means[] = (($n * $mean) + ($oldWeight * $oldMean)) / $weight; @@ -280,7 +282,7 @@ public function partial(Dataset $dataset) : void $variances[] = ($oldWeight * $oldVariance + ($n * $variance) + ($oldWeight / ($n * $weight)) - * ($n * $oldMean - $n * $mean) ** 2) + * ($delta * $delta)) / $weight; } } else { @@ -418,7 +420,8 @@ protected function jointLogLikelihood(array $sample) : array $variance = $variances[$column]; $pdf = -0.5 * log(TWO_PI * $variance); - $pdf -= 0.5 * (($value - $mean) ** 2) / $variance; + $delta = $value - $mean; + $pdf -= 0.5 * ($delta * $delta) / $variance; $likelihood += $pdf; } diff --git a/src/Clusterers/GaussianMixture.php b/src/Clusterers/GaussianMixture.php index 1c6e8d0f0..7ce152caa 100644 --- a/src/Clusterers/GaussianMixture.php +++ b/src/Clusterers/GaussianMixture.php @@ -355,7 +355,9 @@ public function train(Dataset $dataset) : void $mean = $sigma / $total; foreach ($column as $i => $value) { - $ssd += $affinities[$i] * ($value - $mean) ** 2; + $delta = $value - $mean; + + $ssd += $affinities[$i] * ($delta * $delta); } $variance = $ssd / $total; @@ -505,7 +507,10 @@ protected function jointLogLikelihood(array $sample) : array $variance = $variances[$column]; $pdf = -0.5 * log(TWO_PI * $variance); - $pdf -= 0.5 * (($feature - $mean) ** 2) / $variance; + + $delta = $feature - $mean; + + $pdf -= 0.5 * ($delta * $delta) / $variance; $likelihood += $pdf; } diff --git a/src/Helpers/Stats.php b/src/Helpers/Stats.php index ff63f2807..3716d9848 100644 --- a/src/Helpers/Stats.php +++ b/src/Helpers/Stats.php @@ -173,7 +173,8 @@ public static function variance(array $values, ?float $mean = null) : float $ssd = 0.0; foreach ($values as $value) { - $ssd += ($value - $mean) ** 2; + $delta = $value - $mean; + $ssd += $delta * $delta; } return $ssd / count($values); diff --git a/src/Kernels/Distance/Cosine.php b/src/Kernels/Distance/Cosine.php index 0635a20ce..09c54145c 100644 --- a/src/Kernels/Distance/Cosine.php +++ b/src/Kernels/Distance/Cosine.php @@ -54,8 +54,8 @@ public function compute(array $a, array $b) : float $sigma += $valueA * $valueB; - $ssA += $valueA ** 2; - $ssB += $valueB ** 2; + $ssA += $valueA * $valueA; + $ssB += $valueB * $valueB; } if ($ssA === 0.0 and $ssB === 0.0) { diff --git a/src/Kernels/Distance/Euclidean.php b/src/Kernels/Distance/Euclidean.php index 5f27dc84b..c8023aa93 100644 --- a/src/Kernels/Distance/Euclidean.php +++ b/src/Kernels/Distance/Euclidean.php @@ -44,7 +44,9 @@ public function compute(array $a, array $b) : float $distance = 0.0; foreach ($a as $i => $value) { - $distance += ($value - $b[$i]) ** 2; + $delta = $value - $b[$i]; + + $distance += $delta * $delta; } return sqrt($distance); diff --git a/src/Kernels/Distance/SafeEuclidean.php b/src/Kernels/Distance/SafeEuclidean.php index b8bc9d009..aa8e90802 100644 --- a/src/Kernels/Distance/SafeEuclidean.php +++ b/src/Kernels/Distance/SafeEuclidean.php @@ -68,7 +68,9 @@ public function compute(array $a, array $b) : float continue; } - $distance += ($valueA - $valueB) ** 2; + $delta = $valueA - $valueB; + + $distance += $delta * $delta; } $n = count($a); diff --git a/src/Kernels/Distance/SparseCosine.php b/src/Kernels/Distance/SparseCosine.php index 52e547c04..9575d7d1c 100644 --- a/src/Kernels/Distance/SparseCosine.php +++ b/src/Kernels/Distance/SparseCosine.php @@ -48,15 +48,15 @@ public function compute(array $a, array $b) : float if ($valueA != 0 and $valueB != 0) { $sigma += $valueA * $valueB; - $ssA += $valueA ** 2; - $ssB += $valueB ** 2; + $ssA += $valueA * $valueA; + $ssB += $valueB * $valueB; } else { if ($valueA != 0) { - $ssA += $valueA ** 2; + $ssA += $valueA * $valueA; } if ($valueB != 0) { - $ssB += $valueB ** 2; + $ssB += $valueB * $valueB; } } } diff --git a/src/Transformers/ZScaleStandardizer.php b/src/Transformers/ZScaleStandardizer.php index 39886a8be..c48552939 100644 --- a/src/Transformers/ZScaleStandardizer.php +++ b/src/Transformers/ZScaleStandardizer.php @@ -173,13 +173,15 @@ public function update(Dataset $dataset) : void [$mean, $variance] = Stats::meanVar($values); + $delta = $n * ($oldMean - $mean); + $this->means[$column] = (($this->n * $oldMean) + ($n * $mean)) / $weight; $this->variances[$column] = ($this->n * $oldVariance + ($n * $variance) + ($this->n / ($n * $weight)) - * ($n * $oldMean - $n * $mean) ** 2) + * ($delta * $delta)) / $weight; }