免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1954 | 回复: 1
打印 上一主题 下一主题

构建基于相似用户的推荐 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-12 17:49 |只看该作者 |倒序浏览
构建基于相似用户的推荐





计算用户相似度:两个用户相似度就简单等同两者一致性评分次数除以两者共同评分过的条目

02data.php

Php代码
  1. 1.<?php   
  2. 2.$data = array(   
  3. 3.    'Frank'=>array(   
  4. 4.        'Tears'=>5,   
  5. 5.        'La'=>4,   
  6. 6.        'Robinson'=>5,   
  7. 7.        'Yesterday'=>4,   
  8. 8.        'Wizard'=>5,   
  9. 9.        'Mozart'=>5,   
  10. 10.        'Bethoven'=>5,   
  11. 11.        ),   
  12. 12.    'Constantine'=>array(   
  13. 13.        'Tears'=>5,   
  14. 14.        'Fiddler'=>5,   
  15. 15.        'Robinson'=>5,   
  16. 16.        'Wonderful World'=>4,   
  17. 17.        'Wizard'=>4,   
  18. 18.        'Let It Be'=>5,   
  19. 19.        'Mozart'=>5   
  20. 20.        ),   
  21. 21.    'Catherine'=>array(   
  22. 22.        'Tears'=>1,   
  23. 23.        'Robinson'=>2,   
  24. 24.        'Yesterday'=>2,   
  25. 25.        'Beethoven'=>3,   
  26. 26.        'Sunnday'=>1,   
  27. 27.        'Let It Be'=>2,   
  28. 28.        ),   
  29. 29.     'David'=>array(   
  30. 30.        'Tears'=>1,   
  31. 31.        'Robinson'=>2,   
  32. 32.        'Yesterday'=>2,   
  33. 33.        'Let It Be'=>2,   
  34. 34.        'Bethoven'=>5,   
  35. 35.        'love'=>1,   
  36. 36.        'world'=>1   
  37. 37.        ),   
  38. 38.      'lei'=>array(   
  39. 39.        'love'=>1,   
  40. 40.        'Bethoven'=>5   
  41. 41.        )   
  42. 42.);   
  43. 43.?>  
  44. <?php
  45. $data = array(
  46.     'Frank'=>array(
  47.             'Tears'=>5,
  48.             'La'=>4,
  49.             'Robinson'=>5,
  50.             'Yesterday'=>4,
  51.             'Wizard'=>5,
  52.             'Mozart'=>5,
  53.             'Bethoven'=>5,
  54.         ),
  55.     'Constantine'=>array(
  56.             'Tears'=>5,
  57.         'Fiddler'=>5,
  58.         'Robinson'=>5,
  59.         'Wonderful World'=>4,
  60.         'Wizard'=>4,
  61.         'Let It Be'=>5,
  62.         'Mozart'=>5
  63.         ),
  64.     'Catherine'=>array(
  65.         'Tears'=>1,
  66.         'Robinson'=>2,
  67.         'Yesterday'=>2,
  68.         'Beethoven'=>3,
  69.         'Sunnday'=>1,
  70.         'Let It Be'=>2,
  71.         ),
  72.      'David'=>array(
  73.         'Tears'=>1,
  74.         'Robinson'=>2,
  75.         'Yesterday'=>2,
  76.         'Let It Be'=>2,
  77.         'Bethoven'=>5,
  78.         'love'=>1,
  79.         'world'=>1
  80.         ),
  81.       'lei'=>array(
  82.         'love'=>1,
  83.         'Bethoven'=>5
  84.         )
  85. );
  86. ?>

复制代码
03.php

Php代码
  1. 1.<?php   
  2. 2./**  
  3. 3. *   
  4. 4. * 基于相似用户的推荐  
  5. 5. * @author lei  
  6. 6. *  
  7. 7. */  
  8. 8.class SimilarUsers   
  9. 9.{   
  10. 10.    public function estimateUserBasedRating($user, $anotherUser)   
  11. 11.    {   
  12. 12.        $pMatrix = array();   
  13. 13.        $sMatrix = array();   
  14. 14.        foreach ($anotherUser as $key=>$value){   
  15. 15.            $sim = $this->getSimilar($user, $value);   
  16. 16.            if($sim!=0){   
  17. 17.                //遍历对相似度不为0的其它用户,并对$user没有打分的项进行预测   
  18. 18.               foreach ($value as $key2=>$value2){   
  19. 19.                   if(!isset($user[$key2])){   
  20. 20.                       //根据相似度对分值加权   
  21. 21.                       isset($pMatrix[$key2])?($pMatrix[$key2]+=$sim*$value2):($pMatrix[$key2]=$sim*$value2);   
  22. 22.                       isset($sMatrix[$key2])?($sMatrix[$key2]+=$sim):($sMatrix[$key2]=$sim);   
  23. 23.                   }   
  24. 24.               }   
  25. 25.            }   
  26. 26.        }   
  27. 27.        foreach ($pMatrix as $key=>$value){   
  28. 28.            //以加权值与直接和之比作为预测分值   
  29. 29.            $estimatedRating[$key] = (double)$pMatrix[$key]/(double)$sMatrix[$key];   
  30. 30.        }   
  31. 31.        arsort($estimatedRating);   
  32. 32.        return $estimatedRating;   
  33. 33.    }   
  34. 34.      
  35. 35.      
  36. 36.    private function simMatrix($user1, $user2)   
  37. 37.    {   
  38. 38.        //假设网站打分区间1-5分   
  39. 39.        $matrix = array_fill(1, 5, array_fill(1, 5, 0));   
  40. 40.        foreach ($user1 as $key1=>$value1){   
  41. 41.            if (isset($user2[$key1]))   
  42. 42.                $matrix[$value1][$user2[$key1]]++;   
  43. 43.        }   
  44. 44.        return $matrix;   
  45. 45.    }   
  46. 46.      
  47. 47.    /*  
  48. 48.     * 两个用户相似度就简单等于两者一致性评分的次数除以两者共同评分过的条目  
  49. 49.     */  
  50. 50.    private function getSimilar($user1, $user2)   
  51. 51.    {   
  52. 52.        $sim = 0;   
  53. 53.        $matrix = $this->simMatrix($user1, $user2);   
  54. 54.        $total = $this->getTotalCount($matrix);   
  55. 55.        $agreement = $this->getAgreementCount($matrix);   
  56. 56.        if($total!=0)   
  57. 57.            $sim = (double)$agreement/(double)$total;   
  58. 58.        return $sim;   
  59. 59.    }   
  60. 60.      
  61. 61.    /*  
  62. 62.     * 不同计数器辅助方法  
  63. 63.     */  
  64. 64.    private function getTotalCount($matrix)   
  65. 65.    {   
  66. 66.        $ratingCount = 0;   
  67. 67.        foreach ($matrix as $key=>$value){   
  68. 68.            $ratingCount += array_sum($value);   
  69. 69.        }   
  70. 70.        return $ratingCount;   
  71. 71.    }   
  72. 72.      
  73. 73.    private function getAgreementCount($matrix)   
  74. 74.    {   
  75. 75.        $ratingCount = 0;   
  76. 76.        $n = count($matrix);   
  77. 77.        for($i=1; $i<=$n; $i++){   
  78. 78.            $ratingCount += $matrix[$i][$i];   
  79. 79.        }   
  80. 80.        return $ratingCount;   
  81. 81.    }   
  82. 82.      
  83. 83.      
  84. 84.}   
  85. 85.include_once '02data.php';   
  86. 86.$user = $data['Frank'];   
  87. 87.unset($data['Frank']);   
  88. 88.$another = $data;   
  89. 89.$estimate = new SimilarUsers;   
  90. 90.$p = $estimate->estimateUserBasedRating($user,$data);   
  91. 91.var_dump($p);   
  92. 92.  
  93. 93.?>  
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-11-14 09:16 |只看该作者
谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP