21CTO导读:
Python在机器学习,推荐算法,数据抓取,大数据分析等领域,提供了很多不错的扩展模块。本文就为大家抛砖引玉,提供一个用户对电影兴趣的推荐算法,欢迎讨论。
目录:
过程
电影评价多重分类
用户信息录入
计算皮尔逊相关系数找出兴趣相投的用户插入自己的数据
向某用户推荐电影加权平均所有人的评价
-
结果与分析
过程: ??? 用爬虫抓取豆瓣电影用户信息 ??? 用多重分类法,定义电影评价等级 ??? 计算自己与用户的皮尔逊相关度 ??? 以人为主体分析相似度:找出志同道合的人,可以发现潜在喜欢的商品 ??? 以商品为主体分析相似度:找出相似的商品,可以发现潜在的客户(如亚马逊的‘买了商品A的用户还买了商品B’)
电影评价多重分类:
很差
较差
还行
推荐
力荐
代码:
#-*-?coding:?utf-8?-*-??
import?json??
import?sys??
reload(sys)??
sys.setdefaultencoding(?"utf-8"?)??
??
user_info?=?{}??
??
#爬取到的数据??
user_dict?=?{??
?????????????'ns2250225':[4,3,4,5,4],??
?????????????'justin':[3,2],??
?????????????'totox':[2,1,??
?????????????'fabrice':[4,5],??
?????????????'doreen':[3,2,3]??
?????????????}??
??
#录入用户数据??
def?user_data(user_dict):??
????for?name?in?user_dict:??
????????user_info[name]?=?{u'消失的爱人'?:?user_dict[name][0]}??
????????user_info[name][u'霍比特人3']?=?user_dict[name][1]??
????????user_info[name][u'神去村']?=?user_dict[name][2]??
????????user_info[name][u'泰坦尼克号']?=?user_dict[name][3]??
????????user_info[name][u'这个杀手不太冷']?=?user_dict[name][4]??
??????????
??
user_data(user_dict)??????
??
#存放用户数据??
try:??
????with?open('user_data.txt',?'w')?as?data:??
????????for?key?in?user_info:??
????????????data.write(key)??
????????????for?key2?in?user_info[key]:??
????????????????data.write('t')??
????????????????data.write(key2)??
????????????????data.write('t')??
????????????????data.write('t')??
????????????????data.write(str(user_info[key][key2]))??
????????????????data.write('n')??
????????????data.write('n')??
except?IOError?as?err:??
????print('File?error:?'?+?str(err)) ?
计算皮尔逊相关系数,找出兴趣相投的用户:(插入自己的数据)
from?math?import?sqrt???
??
#计算皮尔逊相关度(1为完全正相关,-1为完成负相关)??
def?sim_pearson(prefs,?p1,?p2):????
????#?Get?the?list?of?mutually?rated?items????
????si?=?{}????
????for?item?in?prefs[p1]:????
????????if?item?in?prefs[p2]:????
????????????si[item]?=?1????
????
????#?if?they?are?no?ratings?in?common,?return?0????
????if?len(si)?==?0:????
????????return?0????
????
????#?Sum?calculations????
????n?=?len(si)????
????
????#?Sums?of?all?the?preferences????
????sum1?=?sum([prefs[p1][it]?for?it?in?si])????
????sum2?=?sum([prefs[p2][it]?for?it?in?si])????
????
????#?Sums?of?the?squares????
????sum1Sq?=?sum([pow(prefs[p1][it],?2)?for?it?in?si])????
????sum2Sq?=?sum([pow(prefs[p2][it],?2)?for?it?in?si])????
????
????#?Sum?of?the?products????
????pSum?=?sum([prefs[p1][it]?*?prefs[p2][it]?for?it?in?si])????
????
????#?Calculate?r?(Pearson?score)????
????num?=?pSum?-?(sum1?*?sum2?/?n)????
????den?=?sqrt((sum1Sq?-?pow(sum1,?2)?/?n)?*?(sum2Sq?-?pow(sum2,?2)?/?n)) ?
??
????if?den?==?0:????
????????return?0????
????r?=?num?/?den??
??????
????return?r??
??
??
#插入自己的数据??
user_info['me']?=?{u'消失的爱人'?:?5,??
???????????????????u'神去村'?:?3,??
???????????????????u'炸裂鼓手'?:?5}??
??
??
????????????
#找出皮尔逊相关系数>0的用户,说明该用户与自己的电影品味比较相近??
for?user?in?user_info:??
????res?=?sim_pearson(user_info,?'me',?user)??
????if?res?>?0:??
????????print('the?user?like?%s?is?:?%s'?%?('me',?user))??
????????print('result?:%fn'?%?res) ?
向某用户推荐电影(加权平均所有人的评价)
#向某个用户推荐电影(加权平均所有人的评价值)??
def?getRecommendations(prefs,person,similarity=sim_pearson):??
??totals={}??
??simSums={}??
??for?other?in?prefs:??
????#?don't?compare?me?to?myself??
????if?other==person:?continue??
????sim=similarity(prefs,other)??
??
????#?ignore?scores?of?zero?or?lower??
????if?sim<=0:?continue??
????for?item?in?prefs[other]:??
??????????
??????#?only?score?movies?I?haven't?seen?yet??
??????if?item?not?in?prefs[person]?or?prefs[person][item]==0:??
????????#?Similarity?*?Score??
????????totals.setdefault(item,0)??
????????totals[item]+=prefs[other][item]*sim??
????????#?Sum?of?similarities??
????????simSums.setdefault(item,0)??
????????simSums[item]+=sim??
??
??#?Create?the?normalized?list??
??rankings=[(total/simSums[item],item)?for?item,total?in?totals.items()]??
??
??#?Return?the?sorted?list??
??rankings.sort()??
??rankings.reverse()??
??return?rankings??
??
??
#向我推荐电影??
res?=?getRecommendations(user_info,?"me")??
print('Recommand?watching?the?movie:')??
print?json.dumps(res,?encoding='UTF-8',?ensure_ascii=False)??
结果与分析:
与我电影口味相近的用户有:doreen,fabrice?
推荐我看的电影有:泰坦尼克号,这个杀手不太冷
以人为主体分析, 找出有相似爱好的人, 并向这些人推荐商品,可以发现潜在喜欢的商品
而若以商品为主体分析, 找出相似的商品, 找出喜欢这个产品的人, 可以发现商品潜在的客户

来源:数据挖掘入门与实战
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|