zoukankan      html  css  js  c++  java
  • 实战应用--基于物品的协同过滤算法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他们之间的转化

  • 相关阅读:
    CSS实现DIV水平自适应居中
    jQuery实现鼠标拖动改变Div高度
    Word2013创建目录
    raw,cow,qcow,qcow2镜像的比较
    Chrome浏览器官方下载地址
    OLE/COM 对象查看器 & OLE常用术语
    VmWare为Fedora虚拟机扩展磁盘
    Linux常用命令
    项目经理与客户沟通的宜与忌
    转 FileStream Read File
  • 原文地址:https://www.cnblogs.com/ToDoNow/p/9719064.html
Copyright © 2011-2022 走看看