协同过滤-皮尔逊相关系数算法

来源:互联网 发布:java游戏引擎 编辑:程序博客网 时间:2024/06/12 02:45
<?php   /**     * 皮尔逊相关系数的算法-求乘积之和     * @param  array $a 用户a商品浏览秒数或评分数     * @param  array $b 用户b商品浏览秒数或评分数     * @return int    乘积之和     */    function multipl($a, $b)    {        $sumfab = 0;        foreach ($a as $k => $v) {            $sumfab += $v * $b[$k];        }        return $sumfab;    }    /**     * 求平方和     * @param  array $a 用户a商品浏览评分数组     * @return int    平方和     */    function sum_of_squares($a)    {        if (!$a) {            return false;        }        $sum = 0;        foreach ($a as $v) {            $sum += pow($v, 2);        }        return $sum;    }    /**     * 皮尔逊相关系数的算法-求出相关系数     * @param  array $a 用户a商品浏览秒数或评分数     * @param  array $b 用户b商品浏览秒数或评分数     * @return float    相关系数     */    function corrcoef($a, $b)    {        if (count($a) != count($b)) return false;        $n = count($a);        // 求总和        $sum_a = array_sum($a);        $sum_b = array_sum($b);        // 乘积和        $sum_of_ab = multipl($a, $b);        // 平方和        $sum_of_a = sum_of_squares($a);        $sum_of_b = sum_of_squares($b);        $up = $sum_of_ab - (number_format($sum_a, 2, '.', '')*number_format($sum_b, 2, '.', '')/$n);        $down = sqrt(($sum_of_a - number_format(pow($sum_a, 2), 2, '.', '')/$n) * ($sum_of_b - number_format(pow($sum_b, 2), 2, '.', '')/$n));        return $up/$down;    }     $x = [3.3,6.5];    $y = [3.4,5.8];    print_r(corrcoef($x,$y)); // 得出结果是: 1

算法来源文章

原创粉丝点击