zoukankan      html  css  js  c++  java
  • 基于物品的协同过滤推荐算法

    基于物品的协同过滤算法(ItemCF)是业界应用最多的算法,主要思想是利用用户之前有过的行为,给用户推荐和之前物品类似的物品。

    基于物品的协同过滤算法主要分为两步:

    1)计算物品之间的相似度。

    2)根据物品的相似度和用户的历史行为给用户生成推荐列表。

    第一步的关键点在于计算物品之间的相似度,这里并不采用基于内容的相似性,而是去计算在喜欢物品i的用户中有多少是喜欢物品j的,这样计算的前提是 用户的兴趣爱好一般是比较确定的,不容易变,那么当一个用户对两个物品都喜欢的时候,我们往往可以认为这两个物品可能属于同一分类。令N(i)表示购买物 品i的用户数,则物品i和物品j的相似度可以用wij = |N(i)&N(j)|/N(i)来计算。


    第一步时间复杂度的改进方法:和UserCF类似,我们可以建立一张用户-物品的倒查表,这样每次去计算一个用户有过行为的那些物品间的相似度,能够保证计算的相似度都是有用的,而不用花大的计算量在那些0上面(肯定是个稀疏矩阵)

    第一步相似度的改进方法1:若根据上面的公式来计算相似度,你会发现,物品i跟流行物品j的相似度很高,因为流行读高,所以基本人人都会买,这样的 话流行度高的物品就比较没有区分度,所以我们需要惩罚流行物品j的权重wij = |N(i)&N(j)|/sqrt(N(i)*N(j))

    第一步相似度的改进方法2:需要惩罚用户的活跃度。若用户活跃度比较低,只买了有限的几本书,那么这几本书很有可能在一个或者两个兴趣范围内,对计 算物品相似度比较有用,但是如果说一书店卖家趁着打折把亚马逊90%的书都买了然后赚差价,那么该用户的行为对计算物品相似度就没什么作用,因为90%的 书肯定会覆盖很多范围,故应该像改进方法一中惩罚用户的活跃度。

    第一步相似度的改进方法3:物品相似度的归一话。归一化不仅仅能提高推荐的准确度,还可以提高推荐的覆盖率和多样性。比如亚马逊上,用户的兴趣爱好 肯定是分成几类的,很少说爱好集中在一类。假设有两类A和B,A类之间的相似度为0.5, B类之间的相似度为0.8,A和B之间的相似度为0.2, 当用户买了5本A类的书和5本B类的书后,我们要给用户来推荐书,如果按照之前的方法,最后按照相似度排序,那么推荐的应该都会是B类物品,就算B类中排 名比较低,但照样比A类要高阿,所以应该根据类别进行相似度的归一话,这样一来A的相似度为1,B的相似度也为1,这样的话排序后的推荐A,B类商品都 有,就大大提高了准确度,覆盖率和多样性。

    第二步则比较简单,计算物品与用户已买物品的相似度(权重和),然后根据相似度排序选出topN.


    ItemCF在实际系统中运用的比较多,主要有两个优点:

    1)item-item表相比如user-user表要小的多,处理起来比较容易

    2)itemCF容易提供推荐理由,比如给你推荐《机器学习》是因为你之前买过《数据挖掘》,这样能增加信任度,提高用户和推荐系统的交互,进一步增强个性化推荐

  • 相关阅读:
    Effective Java 19 Use interfaces only to define types
    Effective Java 18 Prefer interfaces to abstract classes
    Effective Java 17 Design and document for inheritance or else prohibit it
    Effective Java 16 Favor composition over inheritance
    Effective Java 15 Minimize mutability
    Effective Java 14 In public classes, use accessor methods, not public fields
    Effective Java 13 Minimize the accessibility of classes and members
    Effective Java 12 Consider implementing Comparable
    sencha touch SortableList 的使用
    sencha touch dataview 中添加 button 等复杂布局并添加监听事件
  • 原文地址:https://www.cnblogs.com/peizhe123/p/4634154.html
Copyright © 2011-2022 走看看