实战应用--基于物品的协同过滤算法itemCF

 要求根据数据库中历史招投标数据作潜在投标人预测

数据库数据类似于  投标(商品)--供应商名称(用户)

根据数据特性选择基于物品的协同过滤算法itemCF

itemCF算法核心只有两个步骤:

1、使用公式求出两件商品之间的相似度:商品A,B相似度=同时关注A和B的人数/根号下关注A的人数*关注B的人数

2.用户M对商品A的兴趣度=将 M关注的商品集合 与 商品A相似度前K项商品的集合 的交集中的各商品 与 商品A之间的相似度累加

(如果有一个类似评分的东西,评分应被标准化后乘相似度)

计算相似度方法如下:参数为字典,dict{商品:用户};

返回值为pandas的DataFrame类型,数值为根据公式计算的两物品的相似度

    商品A  商品B  商品C
商品A  1   0.56  0.25 

商品B  0.44  1  0.44

商品C  0  0.26  1

 1 def similarity(dic):
 2     dic_similar={}
 3     for key0 in dic.keys():
 4         dict_simi = {}
 5         for key1 in dic.keys():
 6             jiaoji = 0
 7             for i in range(len(dic.get(key0))):
 8                 if dic.get(key0)[i] in dic.get(key1):
 9                     jiaoji+=1
10             similar=jiaoji/math.sqrt(len(dic.get(key0))*len(dic.get(key1)))
11             dict_simi[key1]=similar
12         dic_similar[key0]=dict_simi
13     pd_similar=pd.DataFrame(dic_similar)
14     return pd_similar

计算兴趣度的方法如下

参数1为上方相似度函数的结果   pandas的DataFrame类型

参数2为pandas的DataFrame类型  用户物品表,数值表示该用户关注该商品的情况

    用户M 用户N 用户O 
商品A  1  1  0
商品B  0  0  1
商品C  0  1  1

返回值为pandas的DataFrame类型

  用户  商品  兴趣值
0  用户1  商品1  1

1  用户2  商品2  0.95

2  用户3  商品3  0.58

3  用户1  商品2  0.68

 1 #兴趣度
 2 def interest(pd_ptp,pd_utp):
 3     li_pro=[]
 4     li_user = []
 5     li_simi_sum = []
 6     for user in pd_utp.keys():
 7         li_u_pro=pd_utp[pd_utp[user]==1].index.tolist()
 8         for pro in pd_ptp.keys():
 9             li_p_pro=pd_ptp[pro].sort_values(ascending=False)[0:5].index.tolist()
10             tmp = [val for val in li_p_pro if val in li_u_pro]  # 交集
11             interest=0
12             for i in range(len(tmp)):
13                 interest+=pd_ptp[pro][tmp[i]]
14             if interest!=0:
15                 i_pro.append(pro)
16                 li_user.append(user)
17                 li_simi_sum.append(interest)
18     dict_interest = {
19         'pro':li_pro
20         'user': li_user,
21         'interest': li_simi_sum
22     }
23     pd_interest=pd.DataFrame(dict_interest)
24     return pd_interest

编程过程中遇到了很多格式转换的问题,原本使用遍历字典的方式进行运算,效率太低而后将字典转换为pandas的DataFrame格式

在python数据挖掘算法的使用中,要灵活运用数组、字典、pandas的DataFrame、numpy的array他们之间的转化

原文地址:https://www.cnblogs.com/ToDoNow/p/9719064.html