/** * @param Observations $observations * @param array $coefficients * @return array */ protected function calculateGradient(Observations $observations, array $coefficients) : array { $gradient = array_fill(0, count($observations->getObservation(0)->getFeatures()), 0.0); $batchElementIndices = (array) array_rand(range(0, count($observations) - 1), $this->batchSize); foreach ($batchElementIndices as $index) { $observation = $observations->getObservation($index); $observationGradient = $this->gradient->gradient($coefficients, $observation->getFeatures(), $observation->getOutcome()); foreach ($observationGradient as $i => $observationSlope) { $gradient[$i] += $observationSlope / $this->batchSize; } } return $gradient; }
/** * @param Observations $observations * @param array $coefficients * @return array */ protected function calculateGradient(Observations $observations, array $coefficients) : array { $observation = $observations->getObservation(mt_rand(0, count($observations) - 1)); return $this->gradient->gradient($coefficients, $observation->getFeatures(), $observation->getOutcome()); }
/** * @param Observations $observations * @param array $coefficients * @return array */ protected function calculateGradient(Observations $observations, array $coefficients) : array { $gradient = array_fill(0, count($observations->getObservation(0)->getFeatures()), 0.0); $batchSize = count($observations); /** @var Observation $observation */ foreach ($observations as $observation) { $observationGradient = $this->gradient->gradient($coefficients, $observation->getFeatures(), $observation->getOutcome()); foreach ($observationGradient as $i => $observationSlope) { $gradient[$i] += $observationSlope / $batchSize; } } return $gradient; }