- 浏览: 1655905 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
根据前面的两个相似度的函数,我们可以计算和你相同电影的口味的top N了:
下面我们看看如何推荐你没有看过的电影,我们平时的想法是,如果这部电影
大家评论很好,我们就认为值得我们看,但是你的口味可能和这些评论很高的
的人不同,所以和你口味相似的人评论很高的电影,推荐给你效果会很好。
我们这样虽然一个人对一部电影的评价很高,但是由于他和你的口味不同,那么
这个评价对于你的贡献也不会太多。结合相似度和评价的一种方法是:
相似度与评价的成绩作为这个电影评论的一个贡献,同时为了避免评论的人越多
最终的总分越高,可以用这个公式:
所有人(相似度与评论分的成绩) 之和 / 相似度之和,于是我们可以得到如下
代码:
如何根据用户的评论来看产品的相似度呢?一种方法是通过看一个人喜欢某个产品,再看看他喜欢
的其他产品,这其实和前面的方法一样,你只需要把people和items交换一下位置。这样我们只需要
对前面的字典做一下转置操作即可:
然后我们就可以向前面的代码一样做top match和recommendation了:
二、Item-Based Filtering:
前面介绍的算法被称为user-based collaborative filtering,每次都要计算一下
Customer之间的相似度,伸缩性不够好,一种更好的方法是事先把Item之间相似度
计算出来,然后排序好,保存下来,用户每次请求的时候只需要直接把top N返回给
用户就可以了,这个算法是基于 Items之间的相似性比较与Users之间的比较变化要
少这个事实的。
根据这个思想,我们可以事先把Items之间的相似性计算出来并保存下来,下面就是
算法的实现:
现在你可以直接使用我们前面已经保存下来的Item之间的相似度来做推荐了:
def top_matches(prefs,person,n=5,similarity="sim_pearson") scores = [] #计算相似度 prefs.each_key{|other| scores << eval("[#{similarity}(prefs,person,other),other]") if other != person} #返回相似读最高的top n return scores.sort.reverse[0...n] end
下面我们看看如何推荐你没有看过的电影,我们平时的想法是,如果这部电影
大家评论很好,我们就认为值得我们看,但是你的口味可能和这些评论很高的
的人不同,所以和你口味相似的人评论很高的电影,推荐给你效果会很好。
我们这样虽然一个人对一部电影的评价很高,但是由于他和你的口味不同,那么
这个评价对于你的贡献也不会太多。结合相似度和评价的一种方法是:
相似度与评价的成绩作为这个电影评论的一个贡献,同时为了避免评论的人越多
最终的总分越高,可以用这个公式:
所有人(相似度与评论分的成绩) 之和 / 相似度之和,于是我们可以得到如下
代码:
def get_recommendations(prefs,person,similarity='sim_pearson') totals = {} simSums = {} prefs.each_key do |other| #跳过自己 next if person == other sim = eval("#{similarity}(prefs,person,other)") #去掉similarity为0的人 next if sim <= 0 prefs[other].each_key do |item| if (not prefs[person][item]) or (prefs[person][item] == 0) then #计算相似度和评论的成绩之和 totals[item] = if totals[item] then totals[item] + prefs[other][item] * sim else prefs[other][item] * sim end #相似度之和 simSums[item] = if simSums[item] then simSums[item] + sim else sim end end end end #计算每个电影的符合你口味的程度 rankings = totals.map{|item,total| [total/simSums[item],item]} return rankings.sort.reverse end
如何根据用户的评论来看产品的相似度呢?一种方法是通过看一个人喜欢某个产品,再看看他喜欢
的其他产品,这其实和前面的方法一样,你只需要把people和items交换一下位置。这样我们只需要
对前面的字典做一下转置操作即可:
def transform_prefs(prefs) result = {} prefs.each_key do |person| prefs[person].each_key do |item| result[item] ||= {} result[item][person] = prefs[person][item] end end result end
然后我们就可以向前面的代码一样做top match和recommendation了:
movies = transform_prefs(critics) p top_matches(movies,'Superman Returns') p get_recommendations(movies,'Just My Luck')
二、Item-Based Filtering:
前面介绍的算法被称为user-based collaborative filtering,每次都要计算一下
Customer之间的相似度,伸缩性不够好,一种更好的方法是事先把Item之间相似度
计算出来,然后排序好,保存下来,用户每次请求的时候只需要直接把top N返回给
用户就可以了,这个算法是基于 Items之间的相似性比较与Users之间的比较变化要
少这个事实的。
根据这个思想,我们可以事先把Items之间的相似性计算出来并保存下来,下面就是
算法的实现:
def calculate_similar_items(prefs,n=10) result = {} #把矩阵转置成item-centric的 item_prefs = transform_prefs(prefs) c = 0 item_prefs.each_key do |item| c += 1 printf("[%d / %d]",c,item_prefs.size) if c % 100 == 0 #把与item top n相似的记录下来,并保存在result map中 scores = top_matches(item_prefs,item,n,'sim_distance') result[item] = scores end return result end
现在你可以直接使用我们前面已经保存下来的Item之间的相似度来做推荐了:
def get_recommended_items(prefs,item_match,user) user_ratings = prefs[user] scores = {} total_sim = {} user_ratings.each do |item,rating| #已经计算出来的top n item item_match[item].each do |similarity,item2| #跳过已经rated的item next if user_ratings[item2] #所有rating的 相似度*rating 之和 scores[item2] = if scores[item2] then scores[item2] + similarity * rating else similarity * rating end #所有的相似度之和 total_sim[item2] = if total_sim[item2] then total_sim[item2] + similarity else similarity end end rankings = scores.map{|item,score| [score/total_sim[item],item]} return rankings.sort.reverse end end item_sim = calculate_similar_items(critics) p get_recommended_items(critics,item_sim,'Toby')
评论
1 楼
fuliang
2008-12-28
ruby1.8对函数作为参数的支持还是不够好,不像python可以很直观的像传递函数名字一样传递函数对象:def top_matches(prefs,person,n=5,similarity=sim_pearson)
然后调用的时候和普通的调用完全一样
我们这里使用了字符串,然后在eval一下,看起来比较丑陋了。这里当然可以使用Poc对象和lambda表达式,但我们有希望sim_pearson能够像普通的函数一样调用而不是使用call。一种更直接的方法是给Symbol添加to_proc方法:
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
然后就可以像python同样的用法了:
def top_matches(prefs,person,n=5,similarity= :sim_pearson)
事实上最近发布的ruby1.9内置了这个方法,这使得我们更加简洁:
result = names.map {|name| name.upcase}
现在可以这么做了:
result = names.map(&:upcase)
然后调用的时候和普通的调用完全一样
我们这里使用了字符串,然后在eval一下,看起来比较丑陋了。这里当然可以使用Poc对象和lambda表达式,但我们有希望sim_pearson能够像普通的函数一样调用而不是使用call。一种更直接的方法是给Symbol添加to_proc方法:
def to_proc
proc { |obj, *args| obj.send(self, *args) }
end
然后就可以像python同样的用法了:
def top_matches(prefs,person,n=5,similarity= :sim_pearson)
事实上最近发布的ruby1.9内置了这个方法,这使得我们更加简洁:
result = names.map {|name| name.upcase}
现在可以这么做了:
result = names.map(&:upcase)
发表评论
-
推荐系统note
2013-06-24 18:36 0推荐系统 第一章 Introduction 1.1基本概念 1 ... -
[zz]推荐系统-从入门到精通
2013-04-20 14:38 2499为了方便大家从理论到实践,从入门到精通,循序渐进系统地理解和掌 ... -
[ZZ]计算机视觉、模式识别、机器学习常用牛人主页链接
2012-11-30 13:13 12220牛人主页(主页有很多论文代码) Serge ... -
计算广告学
2012-08-12 13:53 0计算广告学一: 1、核 ... -
期望最大(EM)算法推导
2012-08-05 19:54 8432X是一个随机向量,我们希望找到 使得取得最大值,这就是关于的最 ... -
Large-Scale Support Vector Machines: Algorithms and Theory
2012-04-12 00:32 0支持向量机是一种流行 ... -
[zz]数据挖掘邻域的5篇经典文章
2011-05-12 13:50 1787转载自 http://www.dataminingblog.c ... -
大规模数据挖掘-第三章 学习笔记二
2011-05-02 21:12 34793.4 文档局部性敏感哈希 ... -
大规模数据挖掘-第三章 学习笔记一
2011-05-01 00:06 10859第三章 查找相似的Items 数据挖掘的一个基本问题是检测相似 ... -
HtmlUnit解析html会丢掉不可见的Element
2010-01-15 21:06 2915最近使用htmlunit来作为后端抽取数据,htmlunit的 ... -
信息抽取思考笔记
2009-12-07 21:48 1709信息抽取的两种方式:基于内嵌浏览器的navigation的抽取 ... -
基于模式发现的信息抽取(1)
2009-12-03 23:37 2687IEPAD:基于模式发现的 ... -
分享一本文本挖掘的书
2009-09-21 23:28 1702好不容易从国外找到的,有需要的可以下来看看。 The inf ... -
《Web Data Mining Exploring Hyperlinks, Contents, and Usage Data》列入读书单中
2009-09-10 18:00 2053liubing同学写的,web content mining的 ... -
机器学习的开放源代码项目mahout
2009-04-16 23:05 5447最近看了刚发布的开放源代码项目mahout,实现了很多机器学习 ... -
网页分析/挖掘中常用数据结构和算法
2008-12-30 11:28 2753网页在render的时候都生成DOM树的,所以树形的数据结构用 ... -
一个很好的Machine Learning的开源工具网站
2008-12-30 10:41 2226mloss.org http://www.mloss.org/ ... -
基于firefox浏览器的Deep Web Navigation总结
2008-12-29 12:24 2214先占个位置,这两天准备回家,办手续,定房子什么的,比较忙,先提 ... -
一份夭折了的Information Extraction的总体设计
2008-12-26 17:46 1302由于项目提前closed,我的一个Information Ex ... -
今天听了fanwei博士的Data Mining的讲座
2008-12-26 12:41 2057牛人,哥伦比亚大学PH.D,在 IBM T.J.Watson ...
相关推荐
集体智慧编程/Programming Collective Intelligence 中英文版
集体智慧编程(Programming Collective Intelligence)中文版 pdf-part1机器学习相关书籍
Programming Collective Intelligence: Building Smart Web 2.0 Applications 英文epub版本
《集体智慧编程》(Programming Collective Intelligence)官方源代码,非手敲。
《programming collective intelligence》是一本使用Python语言学习机器学习的教材。全书以英文原版呈现,难度适中,非常适合自学的读者。这本书被一些业界专家广泛推荐,因为它不仅对于初学者来说容易理解,而且还...
《编程集体智能》(Programming Collective Intelligence)是一本旨在帮助读者掌握如何利用Python语言进行机器学习的技术书籍。本书深入浅出地介绍了各种复杂的机器学习算法,并通过实际案例将这些算法的应用变得简单...
集体智慧编程 English edition
Segaran -- Programming Collective Intelligence -- 2008 -- code.7z
集体智慧编程(Programming Collective Intelligence)中文版 pdf-part2机器学习 贝叶斯 决策树
《Programming Collective Intelligence》是一本深度探讨如何利用编程技术来挖掘和分析数据,从而实现集体智慧的书籍。这本书主要面向对Python编程有一定基础,并希望通过编程手段理解并应用大数据、机器学习和人工...
集体智慧编程的全部代码,本人自行全部学完并且基本上都实操运行过,可靠。现在分享给大家,象征性的收一个积分,希望大家学习愉快。
中文版电子书 + 英文版电子书 + 源代码 本书以机器学习与计算统计为主题背景,专门讲述如何挖掘和分析Web上的数据和资源,如何分析用户体验、市场营销、个人品味等诸多信息,并得出有用的结论,通过复杂的算法来从...
A new category of powerful programming techniques lets you discover the patterns, inter-relationships, and individual profiles-the collective intelligence–locked in the data people leave behind as ...
Collective Intelligence in Action (Manning 2008).pdf