1 Star 1 Fork 4

GoAI / 推荐系统

forked from 啦啦村大帅 / 推荐系统 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
Loading...
README
MulanPSL-1.0

推荐系统

推荐概念

信息过滤系统解决信息过载用户需求不明确的问题

  • 利用一定的规则将物品排序展示给需求不明确的用户

推荐搜索区别

  • 推荐个性化较强,用户被动的接受,希望能够提供持续的服务
  • 搜索个性化弱,用户主动搜索,快速满足用户的需求

推荐和web项目区别

  • 构建稳定的信息流通通道
  • 推荐信息过滤系统
  • web对结果有明确预期
  • 推荐结果是概率问题

Lambda架构介绍

  • 离线计算和实时计算共同提供服务的问题

  • 离线计算优缺点

    • 优点 能够处理的数据量可以很大比如pb级别
    • 缺点 速度比较慢分钟级别的延迟
  • 实时计算

    • 优点 响应快来一条数据处理一条 ms级别响应
    • 缺点 处理的数据量小一些
  • 离线计算的框架

    • hadoop
    • spark core , spark sq|
    • hive
  • 实时计算框架

    • spark streaming
    • storm
    • flink
  • 消息中间件

    • flume日志采集系统
    • kafka 消息队列
  • 存储相关

    • hbase noq|数据库
    • hive sq|操作hdfs数据
  • 推荐算法框架

    • 召回->排序->策略调整

推荐算法架构

  • 召回
    • 协同过滤
      • 算相似度 memory base
      • 基于模型的 model base 矩阵分解
    • 基于内容
      • 分词
      • 词权重(提取关键词)tf-idf
      • word2Vec 词向量
      • 物品向量
  • 排序
    • 逻辑回归
  • 策略调整

推荐模型构建流程

  • 数据收集
    • 显性评分
    • 隐性数据
  • 特征工程
    • 协同过滤:用户-物品 评分矩阵
    • 基于内容:分词tf-idf word2Vec
  • 训练模型
    • 协同过滤
      • KNN
      • 矩阵分解 梯度下降
  • 评估、模型上线

协同过滤思路介绍

CF(collaborative filtering )物以类聚人以群分,做协同过滤的话首先特征工程把用户-物品的评分矩阵创建出来

  • 基于用户的协同过滤

    1. 给用户A找到最相似的N个用户
    2. N个用户消费过哪些物品
    3. N个用户消费过的物品中-A用户消费过的就是推荐结果
  • 基于物品的协同过滤

    1. 给物品A找到最相似的N个物品
    2. A用户消费记录找到这些物品的相似物品
    3. 从这些相似物品先去重-A用户消费过的就是推荐结果

相似度计算

  • 余弦相似度、皮尔逊相关系数(矩阵需稠密型、连续型

    • 向量的夹角余弦值
    • 皮尔逊会对向量的每一个分量做中心化
    • 余弦只考虑方向不考虑向量长度
    • 如果评分数据是连续的数值比较适合中,余弦、皮尔逊计算相似度
  • 杰卡德相似度

    • 交集/并集
    • 计算评分是0、1布尔值的相似度
  • 使用不同相似度计算方式实现协同过滤

    1. 如果买/没买点/没点数据0/1适合使用杰卡德相似度

      from sklearn.metrics import jaccard_score

      jaccard_score(df[ltemA]df[ltemB'])

      from sklearn.metrics.pairwise import pairwise_distances

      user_ similar= 1-pairwise_distances(df.value,metric="jaccard)

    2. 一般用评分去做协同过滤推荐使用皮尔逊相关系数,评分预测基于用户和基于物品的协同过滤严格上说,属于两种算法,实践中可以都做出来,对比效果,选择最靠谱的

协同过滤基于模型的算法

  1. 用户-物品矩阵比较稀疏的时候,直接去取物品向量、用户向量,计算相似度不太适合
  2. 基于模型的方法可以解决用户-物品矩阵比较稀疏的问题
  3. 矩阵分解
    1. 把大的矩阵拆成两个小的 用户矩阵、物品矩阵 MxK KxN K<<M K<<N
    2. 大矩阵 约等于 用户矩阵 乘 物品矩阵
    3. 使用als(交替最小二乘法)来优化损失 spark ML recommandation 包封装了als
    4. 优化之后的用户矩阵 取出用户向量
    5. 优化之后的物品矩阵 取出物品向量
    6. 用户向量点乘物品向量 得到最终评分的预测

推荐系统的评价

  • 准确率 覆盖率
    • 准确率
      • 学术 点击率、预估精准率 平均绝对误差(MAE)、均方误差根(RMSE)、标准化平均误差(NMAE);以及覆盖率(Coverage)
      • 工程A/B test对比不同的算法在线上运行对关键指标的影响
  • EE
    • Exploitation & Exploration探索与利用问题
    • Exploitation 利用用户的历史行为只给他曾经看过的/消费过的相似物品
    • Exploration(探测 搜索)发现用户的新兴趣
    • ee问题实际上是矛盾
  • 评估手段
    1. 离线评估和在线评估结合,定期做问卷调查
    2. 在线评估 灰度发布&A/B测试50%全量上线
  • 信息熵越大,不确定性越高(推荐系统希望熵越大越好 )

推荐系统的冷启动

  • 用户冷启动

    • 尽可能收集用户信息构建用户画像(打标签)
    • 根据用户的标签可以做人群聚类,用以有用户的行为做推 荐
    • 更多的使用流行度推荐
  • 物品冷启动

    • 物品打标签 构建物品画像
    • 基于内容的推荐
  • 系统冷启动

    • 如果应用缺少用户行为数据->基于内容的推荐
    • 随着用户行为积累的越来越多->协同过滤
    • 基于内容和协同过滤共同工作

基于内容的推荐

  • 给物品打标签
    • 系统自己提取从业务数据库中提取
    • 用户填写
    • 中文分词利用算法计算词的权重
      • tf-idf(tf term frequency 词频、idf inverse document frequency 逆文档频率
        • tf 词频 文章中出现次数/全文总词数 5/100
        • idf 逆文档频率 log以10为底数,文本库篇数/出现关键词的文章篇数,1000篇中10篇出现python这个词,1000/10=100,idf=log10(100)=2
        • tf-idf = 5/100*2 = 0.1
        • 当每篇文章中都会出现的关键词 ,比如“的”,“我”,idf = 1000/1000 log(1) ,= 0
      • textrank
  • 利用标签的文字转换成词向量
    • word2Vec词->向量
    • 用向量来表示语义
    • 如果两个词的词向量相似度比较高,认为这两个词的语义相近
  • 利用词向量构建物品的向量
    • 一个物品有N个关键词,每个关键词对应一个词向量
    • 求和(权重*词向量)/ N
    • 利用N个关键词的词向量获取物品向量
  • 通过物品向量计算相似度
    • 皮尔逊相关系数 计算物品的相似度

基于内容的推荐 基于物品的协同过滤 区别

  • content_base : 词向量->物品向量->计算相似度
  • item_base cf : user-item matrix->物品向量->计算相似度
  • content_base item_base cf 来源不一样
    • 物品向量构建过程有区别
    • 基于内容的推荐,物品向量文本(物品描述信息,系统填标签,用户填标签)
    • 基于物品的协同过滤,用户对物品的评分矩阵用户的行为数据中来(需要上线一会,统计数据)

K近邻协同过滤

  • 用户向量物品向量计算相似度,MemoryBased CF
  • 之前没有考虑近邻问题而是利用所有正相关用户
  • 考虑K近邻只需要按照相似度找到相似度最高的N个用户
  • similar_users =self.similar[uid].drop([uid]).dropna().sort_values(ascending=False)[:self.k]

Baseline:基准预测

  • 所用物品评分平均值
  • 找到每一个用户对物品平均评分的bias bu
  • 找到每一个物品对平均分bias bi
  • 预测的得分mean+bu+bi u代表第u个用户,i代表第i个物品
  • 可以使用梯度下降来优化损失

Model-Based 协同过滤算法

  • baseline思想来解决协同过滤问题
    • 计算出所有用户对所有物品评分的平均值
    • 预测的评分 = 在平均值的基础上 + 用户评分偏置 + 物品的评分偏置
    • 求解所有用户的评分偏置 和 所有物品的得分偏置
    • 这个问题可以转化成损失优化的过程
  • 梯度下降
  • 交替最小二乘法

矩阵分解

  • SVD 奇异值分解
    • 一个大矩阵分成3个小矩阵中间的是一个k方阵
    • SVD只适用于没有缺失必须是稠密矩阵
  • Funk SVD
    • 一个大的分成两个小矩阵
    • LFM Latent factor model 隐语义原理
  • BiasSVD矩阵分解+ baseline
  • SVD++ 矩阵分解+baseline+其它影响(点击,收藏,购买)

基于内容的推荐

  • 画像构建给用户/物品打标签(至少50)
    • 物品画像
      • 分类信息
      • 标题
      • 电影/音乐主演、歌手
    • 用户画像
      • 喜好的物品类别 行为偏好
      • 基本人口学属性
      • 活跃程度
      • 风控纬度
  • PGC 应用自己生产
  • UGC 用户来生成
  • 基于内容推荐的算法流程
    • 用户画像/物品画像
    • 匹配用户画像 物品画像
  • 物品冷启动问题
    • 画像->词向量->物品向量->计算物品相似度了
    • 从文本描述的角度找相似的物品
    • 当用户在浏览A的时候 通过上述套路找到跟物品A相似的一系列物品

基于内容推荐流程

  • 建立物品画像
    • 数据来源:用户打tag 和 电影的分类值
    • 根据tf-idf的结果 为每部电影筛选出top-n(td-idf较大)个关键词
    • 电影id-关键词-关键词权重
  • 建立倒排索引
    • 通过关键词找到电影
    • 遍历 电影id-关键词-关键词权重 读取每一个关键词,用关键词作为key [(关键词对应电影id,tfidf)]作为value 保存到dict中
  • 用户画像
    • 看用户看过电影(打过分的),到电影的id-关键词-关键词权重数据中 找到所有的关键词
    • 把用户看过的所有关键词 放到一起 统计词频
    • 出现多的关键词 作为用户的兴趣词 实际上就是用户画像的关键词
  • 根据用户的兴趣词 找到兴趣词对应的电影 多个兴趣值可能对应一个电影 {电影id:[关键词1权重,关键词2权重]}
    • 把每一个电影对应的关键词权重求和 排序 推荐给用户

##词向量

  • 用向量来表示词语可以表示语义层面的含义
  • 如果用word2vec模型创建的词向量,两个词向量相似度比较高,说明这两个词是近义词
  • 词向量作用把含义相近的判断转换成向量的相似度计算
  • 使用gensim Word2Vec模块训练词向量模型
    • sentences = list(movie_profile['profile'].values) #准备所有用来训练词向量模型的文本
    • model = gensim.models.Word2Vec(sentences,window=3,min_count = 1,iter = 20) #参数1 文本 参数2 window 观察上下文关系的窗口长度 min_count 训练模型时要保留下的词语出现的频率 iter 迭代次数
  • 通过词向量模型找到topn相似词
    • model.wv.most_similar(positive=['要找到相似词的词语'],topn = 10)
  • 文档向量
    • from gensim.models.doc2vec import Doc2Vec,TaggedDocument
    • documents = [TaggedDocument(words,[movie_id]) for movie_id,words in movie_profile['profile'].iteritems()] #训练模型并保存 通过向量来表示一篇文档 一篇文档对应一个电影 向量的相似度代表 电影的相似度
    • model = Doc2Vec(documents,vector_size=100,window=3,min_count=1,workers=4,epochs=20)
    • words = movie_profile['profile'].loc[6]
    • inferred_vector = model.infer_vector(words) #传入电影的标签 找到电影文档所对应的向量
    • model.docvecs.most_similar([inferred_vector],topn=10) #找到最相似的n个向量
木兰宽松许可证, 第1版 木兰宽松许可证, 第1版 2019年8月 http://license.coscl.org.cn/MulanPSL 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第1版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的一方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括仅因您或他人修改“贡献”或其他结合而将必然会侵犯到的专利权利要求。如您或您的“关联实体”直接或间接地(包括通过代理、专利被许可人或受让人),就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 条款结束。 如何将木兰宽松许可证,第1版,应用到您的软件 如果您希望将木兰宽松许可证,第1版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [2019] [name of copyright holder] [Software Name] is licensed under the Mulan PSL v1. You can use this software according to the terms and conditions of the Mulan PSL v1. You may obtain a copy of Mulan PSL v1 at: http://license.coscl.org.cn/MulanPSL THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v1 for more details. Mulan Permissive Software License,Version 1 Mulan Permissive Software License,Version 1 (Mulan PSL v1) August 2019 http://license.coscl.org.cn/MulanPSL Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v1 (this License) with following terms and conditions: 0. Definition Software means the program and related documents which are comprised of those Contribution and licensed under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, or are controlled by, or are under common control with a party to this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. Contribution means the copyrightable work licensed by a particular Contributor under this License. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed, excluding of any patent claims solely be infringed by your or others’ modification or other combinations. If you or your Affiliates directly or indirectly (including through an agent, patent licensee or assignee), institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability The Software and Contribution in it are provided without warranties of any kind, either express or implied. In no event shall any Contributor or copyright holder be liable to you for any damages, including, but not limited to any direct, or indirect, special or consequential damages arising from your use or inability to use the Software or the Contribution in it, no matter how it’s caused or based on which legal theory, even if advised of the possibility of such damages. End of the Terms and Conditions How to apply the Mulan Permissive Software License,Version 1 (Mulan PSL v1) to your software To apply the Mulan PSL v1 to your work, for easy identification by recipients, you are suggested to complete following three steps: i. Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii. Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii. Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [2019] [name of copyright holder] [Software Name] is licensed under the Mulan PSL v1. You can use this software according to the terms and conditions of the Mulan PSL v1. You may obtain a copy of Mulan PSL v1 at: http://license.coscl.org.cn/MulanPSL THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v1 for more details.

简介

暂无描述 展开 收起
Python
MulanPSL-1.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/goalaaa/recommendation_system.git
git@gitee.com:goalaaa/recommendation_system.git
goalaaa
recommendation_system
推荐系统
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891