for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
namespace stojg\recommend\strategy;
/**
* Use if the data is subject to grade-inflation (different users may be using different scales).
*/
class Paerson
{
* Single pass version of the paerson.
*
* @param array $ratings1
* @param array $ratings2
* @return float
public function run($ratings1, $ratings2)
$numCoRatedItems = 0;
$dotProduct = 0;
$rating1Sum = 0;
$rating1SumSqr = 0;
$rating2Sum = 0;
$rating2SumSqr = 0;
foreach ($ratings1 as $item => $rating1) {
if (!isset($ratings2[$item])) {
continue;
}
$numCoRatedItems += 1;
$dotProduct += $rating1 * $ratings2[$item];
$rating1Sum += $rating1;
$rating1SumSqr += pow($rating1, 2);
$rating2Sum += $ratings2[$item];
$rating2SumSqr += pow($ratings2[$item], 2);
// There is no correlation at all
if ($numCoRatedItems == 0) {
return false;
$denominator = sqrt(
($rating1SumSqr - (pow($rating1Sum, 2) / $numCoRatedItems)) *
($rating2SumSqr - (pow($rating2Sum, 2) / $numCoRatedItems))
);
if ($denominator == 0) {
// the closer abs(paerson) is to 1 to better correlation is it
$paerson = ($dotProduct - ($rating1Sum * $rating2Sum / $numCoRatedItems)) / $denominator;
return 1 - abs($paerson);