当前位置: 首页 > 推荐系统 > 正文

推荐系统实例(一)

1 星2 星3 星4 星5 星 (2 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share

表oso_user_ratings的结构如下:

1
2
3
4
5
6
7
CREATE TABLE `oso_user_ratings` (
  `user_id` varchar(32) NOT NULL,
  `item_id` int(11) NOT NULL,
  `rating` decimal(14,4) NOT NULL DEFAULT '0.0000',
  KEY `item_id` (`item_id`),
  KEY `user_id` (`user_id`,`item_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

表oso_slope_one的结构:

1
2
3
4
5
6
7
CREATE TABLE `oso_slope_one` (
  `item_id1` int(11) NOT NULL,
  `item_id2` int(11) NOT NULL,
  `times` int(11) NOT NULL,
  `rating` decimal(14,4) NOT NULL,
  KEY `item_id2` (`item_id2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

1.表oso_user_ratings中的数据结构

1
2
3
4
5
6
7
8
9
select * from oso_user_ratings;
user_id item_id rating
111    1    1.0000
111    2    0.2000
112    1    1.0000
112    2    0.5000
113    1    0.3300
113    2    0.6600
113    3    1.0000

2.表oso_slope_one中的数据结构

表oso_slope_one中的数据的算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private function _initSlopeOneTableByPHP()
    {        
        /**
         * Get distinct item_id
         */
        $sql = 'SELECT DISTINCT item_id FROM oso_user_ratings';
       //从表oso_user_ratings中取出不重复的item_id
        $rs = $this->_db->query($sql);
        while ($itemId = $rs->fetchColumn())
        {
            //分别将每一个item_id,与其它的item_id作一下对比,然后将计算以后的数据导入到表oso_slope_one中
            $slopeOneSql = 'insert into oso_slope_one (select a.item_id as item_id1,b.item_id as item_id2,count(*) as times, sum(a.rating-b.rating) as rating from oso_user_ratings a,oso_user_ratings b where a.item_id = '
                         . $itemId
                         .' and b.item_id != a.item_id and a.user_id=b.user_id group by a.item_id,b.item_id)';
            $this->_db->query($slopeOneSql);
        }
    }

这个sql语句的大致含义就:
取出不重复的item_id,循环获取同一个用户(a.user_id=b.user_id) 对不同歌曲(b.item_id != a.item_id)的打分的比率的差值,然后保存到表oso_slope_one中。

表oso_slope_one中的所有数据

1
2
3
4
5
6
7
8
select * from oso_slope_one;
item_id1 item_id2 times rating
1    2    3    0.9700
1    3    1    -0.6700
2    1    3    -0.9700
2    3    1    -0.3400
3    1    1    0.6700
3    2    1    0.3400

2中的sql语句中的数据分析

1
2
3
4
5
select a.item_id as item_id1,b.item_id as item_id2,count(*) as times, sum(a.rating-b.rating) as rating from oso_user_ratings a,oso_user_ratings b where a.item_id = '1' and b.item_id != a.item_id and a.user_id=b.user_id group by a.item_id,b.item_id
 
item_id1 item_id2 times rating
1    2    3    0.9700
1    3    1    -0.6700

表示
同时有3人为item_id为1与2的歌曲打分
同时有1人为item_id为1与3的歌曲打分
times字段表示同时为item_id为1与2的歌曲打分的次数
rating字段表示同时为item_id为1与2的歌曲打分的差值的和,差值为正说明1比2受欢迎,为负说明2比1受欢迎。

差值越小,说明item_id2的打分越高,则表示item_id2越受欢迎

打分越高,说明歌曲越受欢迎

其它的两个以此类推:

1
2
3
4
5
6
7
8
9
10
SELECT a.item_id AS item_id1,b.item_id AS item_id2,COUNT(*) AS times, SUM(a.rating-b.rating) AS rating FROM oso_user_ratings a,oso_user_ratings b WHERE a.item_id = '2' AND b.item_id != a.item_id AND a.user_id=b.user_id GROUP BY a.item_id,b.item_id
item_id1 item_id2 times rating
2    1    3    -0.9700
2    3    1    -0.3400
 
select a.item_id as item_id1,b.item_id as item_id2,count(*) as times, sum(a.rating-b.rating) as rating from oso_user_ratings a,oso_user_ratings b where a.item_id = '3' and b.item_id != a.item_id and a.user_id=b.user_id group by a.item_id,b.item_id
 
item_id1 item_id2 times rating
3    1    1    0.6700
3    2    1    0.3400

本文固定链接: http://www.chepoo.com/recommendation-system-demo-one.html | IT技术精华网

推荐系统实例(一):等您坐沙发呢!

发表评论