要求根据数据库中历史招投标数据作潜在投标人预测
数据库数据类似于 投标(商品)--供应商名称(用户)
根据数据特性选择基于物品的协同过滤算法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他们之间的转化