机器学习人工智能-机器学习推荐系统修行之路

推荐算法笔记_机器学习【上】

2022-01-27  本文已影响0人  Nefelibatas

尽管深度学习推荐模型已经成了推荐、广告、搜索领域的主流,但传统推荐模型仍是基础。且在某些应用中仍使用广泛。

传统推荐模型

image-20211231213507090.png

蓝色部分使用的特征比较少,主要是用户、item、标签/评分,形式简单。

黄色部分为用户画像特征、上下文信息、商品画像等等,特征比较丰富。

倒排索引:

现在搜索引擎的核心技术之一,其核心目的是将从大量文档中查找包含某些词的文档集合这一任务用O(1)或O(log n)的时间复杂度完成。
步骤:

image-20211231213959442.png image-20211231214021538.png

http://mocilas.github.io/2015/11/18/Python-Inverted-Index-for-dummies/

搜索VS推荐

image-20211231214127332.png

主要功能:

基于邻域的推荐算法

UserCF算法

Jaccardd相似性

\frac{共同部分}{用户 + 物品} \

w_{uv} = |\frac{N(u)∩N(v)}{N(u)∪N(v)}|

余弦相似性

w_{uv} = |\frac{N(u)∩N(v)}{ \sqrt{N(u)||N(v)} }|

image-20211231214638809.png
def UserSimilarity(train): //用户相似性
    W = dict()
    for u in train.keys():
        for v in train.keys():
            if u == v:
                continue
         W[u][v] = len(train[u] & train[v])
         W[u][v] /= math.sqrt(len(train[u]) \* len(train[v]) * 1.0)
     return W

UserCF算法改进1

用户间产生交集的物品少,怎么办?

时间复杂度:𝑂(𝑈 ∗ 𝑈)

实际上,由于每个人的兴趣是个性化,很多用户相互之间 并没有对同样的物品产生过行为。

优化:

def UserSimilarity(train):
    item_users = dict()
    //建立倒排表
    for u, items in train.items():
        for i in items.keys():
            if i not in item_users:
                item_users[i] = set()
                item_users[i].add(u)
            C = dict()
            N = dict()
      //建立共现矩阵
        for i, users in item_users.items():
            for u in users:
                N[u] += 1 # 计算用户u有多少个用品
            for v in users:
                if u == v:
                    continue
                C[u][v] += 1
            W = dict()
            for u, related_users in C.items():
                for v, cuv in related_users.items():
                    W[u][v] = cuv / math.sqrt(N[u] * N[v]) # 计算余弦相似性
            return W

UserCF算法改进2

优化:

p(u,i) = \sum _{v∈S(u,k)∩N(i)} w_{uv}r_{vi}

给用户u推荐物品i判断其喜好程度,用户v属于用户u前k个相似度的用户并且同时拥有物品i \\ 得到用户v之后会有相似矩阵W_{uv}\\ r_{vi}:用户v对物品i的喜好程度

def Recommend(user, train, W):
    rank = dict()
    interacted_items = train[user] //待推荐的用户u
    for v, wuv in sorted(W[u].items,\     //与用户u最相似的前k个用户v的喜好
       key=itemgetter(1),reverse=True)[0:K]:
    for i, rvi in train[v].items:
      if i in interacted_items: // 物品i已经被用户u喜好过,不再推荐
        continue
      rank[i] += wuv * rvi //对物品i喜好程度累加
    return rank //物品i如果同时在相似物品中则排名会是最高

UserCF算法改进3:UserCF-IIF

热门物品不能差异化地度量人之间的相似性(IIF)

方法:喜好的人越多,降低权重。

更为实用,关注长尾效应

w_{uv} = |\frac{ \sum_{i∈N(u)∩N(v)} \frac{1}{log(1+|N(i)|)}} { \sqrt{N(u)||N(v)} }| \\ 物品i被越多人喜好, \frac{1}{log(1+|N(i)|)}越小

image-20211231221949616.png

ItermCF算法

一种通过分析用户行为记录,计算物品之间的相似度,并进行推荐的方法。

对每个用户建立一个包含他喜欢的物品的列表。 将物品列表中的物品两两在共现矩阵C中加1。

w_{ij} = |\frac{N(i)∩N(j)}{N(i)}| \\ 在同时喜好物品i的用户中有多少也是喜欢物品j的 Q:若物品j是热门物品,即N(j)为1时则w_{ij}=1,完全相似\\ 所以替换成下面形式:\\ 喜好物品i的用户中还喜好j的可能性\\ w_{uv} = |\frac{N(i)∩N(j)}{ \sqrt{N(i)||N(j)} }|\\

计算物品相似度

def ItemSimilarity(train):
#calculate co-rated users between items
    C = dict() # 共现矩阵
    N = dict() # i
    for u, items in train.items():
        for i in users:
            N[i] += 1
            for j in users:
                if i == j:
                    continue
                C[i][j] += 1
#calculate finial similarity matrix W
    W = dict()
    for i,related_items in C.items():
        for j, cij in related_items.items():
            W[u][v] = cij / math.sqrt(N[i] * N[j])
        return W

推荐过程

p_{uj} = \sum _{i∈N(u)∩S(j,k)} w_{ji}r_{ui}

image-20211231222708982.png

w = \frac{公共用户数}{\sqrt{N(i)*M(j)}}

def Recommendation(train, user_id, W, K):
    rank = dict()
    ru = train[user_id]
    for i,pi in ru.items(): # 用户i对每个物品的喜好程度pi
        for j, wj in sorted(W[i].items(), /
            key=itemgetter(1), reverse=True)[0:K]: # 与i相似的k个物品
            if j in ru:
                continue
            rank[j] += pi * wj # 打分
    return rank

ItermCF算法改进

用户活跃度对物品相似度量不具有代表性,IUF

w_{ij} = |\frac{ \sum_{i∈N(i)∩N(j)} \frac{1}{log(1+|N(u)|)}} { \sqrt{N(i)||N(j)} }| \\ 多加入了\frac{1}{|N(u)|},若用户u喜好的物品很多则降低权重\\ w`_{ij} = \frac{w_{ij}}{max_{j}w_{ij}}

def ItemSimilarity(train):
#calculate co-rated users between items
    C = dict()
    N = dict()
    for u, items in train.items():
        for i in users:
        N[i] += 1
         for j in users:
            if i == j:
                continue
            C[i][j] += 1 / math.log(1+len(items)*1.0) # 降低活跃用户的权重
#calculate finial similarity matrix W
    W = dict()
    for i,related_items in C.items():
        for j, cij in related_items.items():
            W[u][v] = cij / math.sqrt(N[i] * N[j])
    return W

CF算法对比

image-20211231223508887.png
上一篇 下一篇

猜你喜欢

热点阅读