numFactors = $numFactors; $this->learningRate = $learningRate; $this->regularization = $regularization; } /** * Calculate random factors * * @return array * * @since 1.0.0 */ private function generateRandomFactors() : array { $factors = []; for ($i = 0; $i < $this->numFactors; ++$i) { $factors[$i] = \mt_rand() / \mt_getrandmax(); } return $factors; } /** * @todo implement */ public function predict($userId, $itemId) { $userFactor = $this->userFactors[$userId]; $itemFactor = $this->itemFactors[$itemId]; $score = 0; for ($i = 0; $i < $this->numFactors; ++$i) { $score += $userFactor[$i] * $itemFactor[$i]; } return $score; } /** * @todo implement */ public function updateFactors($userId, $posItemId, $negItemId) : void { if (!isset($this->userFactors[$userId])) { $this->userFactors[$userId] = $this->generateRandomFactors(); } if (!isset($this->itemFactors[$posItemId])) { $this->itemFactors[$posItemId] = $this->generateRandomFactors(); } if (!isset($this->itemFactors[$negItemId])) { $this->itemFactors[$negItemId] = $this->generateRandomFactors(); } $userFactor = $this->userFactors[$userId]; $posItemFactor = $this->itemFactors[$posItemId]; $negItemFactor = $this->itemFactors[$negItemId]; for ($i = 0; $i < $this->numFactors; ++$i) { $userFactor[$i] += $this->learningRate * ($posItemFactor[$i] - $negItemFactor[$i]) - $this->regularization * $userFactor[$i]; $posItemFactor[$i] += $this->learningRate * $userFactor[$i] - $this->regularization * $posItemFactor[$i]; $negItemFactor[$i] += $this->learningRate * (-$userFactor[$i]) - $this->regularization * $negItemFactor[$i]; } $this->userFactors[$userId] = $userFactor; $this->itemFactors[$posItemId] = $posItemFactor; $this->itemFactors[$negItemId] = $negItemFactor; } }