/** * Evaluate for x * Use the smoothness parameter α to determine the subset of data to consider for * local regression. Perform a weighted least squares regression and evaluate x. * * @param number $x * * @return number */ public function evaluate($x) { $α = $this->α; $λ = $this->λ; $n = $this->n; // The number of points considered in the local regression $Δx = Single::abs(Single::subtract($this->xs, $x)); $αᵗʰΔx = Average::kthSmallest($Δx, $this->number_of_points - 1); $arg = Single::min(Single::divide($Δx, $αᵗʰΔx * max($α, 1)), 1); // Kernel function: tricube = (1-arg³)³ $tricube = Single::cube(Single::multiply(Single::subtract(Single::cube($arg), 1), -1)); $weights = $tricube; // Local Regression Parameters $parameters = $this->leastSquares($this->ys, $this->xs, $weights, $λ); $X = new VandermondeMatrix([$x], $λ + 1); return $X->multiply($parameters)[0][0]; }
/** * Infinity norm (‖A‖∞) * Maximum absolute row sum of the matrix * * @return number */ public function infinityNorm() { $m = $this->m; $‖A‖∞ = array_sum(Map\Single::abs($this->A[0])); for ($i = 1; $i < $m; $i++) { $‖A‖∞ = max($‖A‖∞, array_sum(Map\Single::abs($this->A[$i]))); } return $‖A‖∞; }
/** * Max norm (infinity norm) (|x|∞) * * |x|∞ = max |x| * * @return number */ public function maxNorm() { return max(Map\Single::abs($this->A)); }