本文研究的主要是python协同过滤程序的相关内容,具体介绍如下。
关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看最近有什么好的电影推荐。在问的时候,都习惯于问跟自己口味差不多的朋友,这就是协同过滤的核心思想。
这个程序完全是为了应付大数据分析与计算的课程作业所写的一个小程序,先上程序,一共55行。不在意细节的话,55行的程序已经表现出了协同过滤的特性了。就是对每一个用户找4个最接近的用户,然后进行推荐,在选择推荐的时候是直接做的在4个用户中选择该用户item没包括的,当然这里没限制推荐数量,个人觉得如果要提高推荐准确率的画,起码,1,要对流行的item进行处理。2,将相邻的四个用户的item进行排序,从多到少的进行推荐。程序所用的数据是movielens上的(http://grouplens.org/datasets/movielens)。相似度的计算也很简单,直接用了交集和差集的比值。好吧,上程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#coding utf-8
import os
import sys
import re
f1 = open ( "/home/alber/data_base/bigdata/movielens_train_result.txt" , 'r' ) #读取train文件,已经处理成每一行代表一位用户的item,项之间用空格。
f2 = open ( "/home/alber/data_base/bigdata/movielens_train_result3.txt" , 'a' )
txt = f1.readlines()
contxt = []
f1.close()
userdic = {}
for line in txt:
line_clean = " " .join(line.split())
position = line_clean.index( "," )
ID = line_clean[ 0 :position]
item = line_clean[position + 1 :]
userdic.setdefault( ID ,item)
if len (item)> = 5 : #对观影量少于5的用户不计入相似性计算的范围
contxt.append(item)
for key in userdic.keys(): #计算每位用户的4个最相似用户
ID_num = key
value = userdic[key]
user_item = value.split( ' ' )
Sim_user = []
for lines in contxt:
lines_clean = lines.split( ' ' )
intersection = list ( set (lines_clean).intersection( set (user_item)))
lenth_intersection = len (intersection)
difference = list ( set (lines_clean).difference( set (user_item)))
lenth_difference = len (difference)
if lenth_difference! = 0 :
Similarity = float (lenth_intersection) / lenth_difference #交集除以差集作为相似性的判断条件
Sim_user.append(Similarity)
else :
Sim_user.append( "0" )
Sim_user_copy = Sim_user[:]
Sim_user_copy.sort()
Sim_best = Sim_user_copy[ - 4 :]
position1 = Sim_user.index(Sim_best[ 3 ])
position2 = Sim_user.index(Sim_best[ 2 ])
position3 = Sim_user.index(Sim_best[ 1 ])
position4 = Sim_user.index(Sim_best[ 0 ])
if position1! = 0 and position2! = 0 and position3! = 0 and position4! = 0 :
recommender = userdic[ str (position1)] + " " + userdic[ str (position2)] + " " + userdic[ str (position3)] + " " + userdic[ str (position4)] #将4位用户的看过的电影作为推荐
else :
recommender = "none" reco_list = recommender.split( ' ' )
recomm = []
for good in reco_list:
if good not in user_item:
recomm.append(good)
else :
pass
f2.write(( " " .join(recomm) + "\n" ))
f2.close()
|
总结
以上就是本文关于简单的python协同过滤程序实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:https://www.cnblogs.com/nlp-yekai/p/3770583.html