阿里手淘猜你喜欢Swing算法介绍

2023-11-01

Swing算法原理比较简单,是阿里早期使用到的一种召回算法,在阿里多个业务被验证过非常有效的一种召回方式,它认为 user-item-user 的结构比 itemCF 的单边结构更稳定。

Swing指的是秋千,例如用户 u uu 和用户 v vv ,都购买过同一件商品i ii,则三者之间会构成一个类似秋千的关系图。若用户 u 和用户 v 之间除了购买过 i 外,还购买过商品 j ,则认为两件商品是具有某种程度上的相似的。

也就是说,商品与商品之间的相似关系,是通过用户关系来传递的。为了衡量物品 i 和 j j的相似性,考察都购买了物品 i 和 j 的用户 u和用户 v , 如果这两个用户共同购买的物品越少,则物品 i和 j 的相似性越高。

Swing算法的表达式如下:
在这里插入图片描述
swing python 实现:

# -*- coding: utf-8 -*-

"""
    Author  : Thinkgamer
    File    : Swing.py
    Software: PyCharm
    Desc    : 基于movie lens数据集实现Swing算法
"""

import pandas as pd
from itertools import combinations
import json
import os

alpha = 0.5
top_k = 20

def load_data(train_path, test_path):
    train_data = pd.read_csv(train_path, sep="\t", engine="python", names=["userid", "movieid", "rate", "event_timestamp"])
    test_data = pd.read_csv(test_path, sep="\t", engine="python", names=["userid", "movieid", "rate", "event_timestamp"])

    print(train_data.head(5))
    print(test_data.head(5))
    return train_data, test_data

def get_uitems_iusers(train):
    u_items = dict()
    i_users = dict()
    for index, row in train.iterrows():
        u_items.setdefault(row["userid"], set())
        i_users.setdefault(row["movieid"], set())

        u_items[row["userid"]].add(row["movieid"])
        i_users[row["movieid"]].add(row["userid"])
    print("使用的用户个数为:{}".format(len(u_items)))
    print("使用的item个数为:{}".format(len(i_users)))
    return u_items, i_users

def cal_similarity(u_items, i_users):
    item_pairs = list(combinations(i_users.keys(), 2))
    print("item pairs length:{}".format(len(item_pairs))) # 1410360
    item_sim_dict = dict()
    cnt = 0
    for (i, j) in item_pairs:
        cnt += 1
        print(cnt)
        user_pairs = list(combinations(i_users[i] & i_users[j], 2))
        result = 0.0
        for (u, v) in user_pairs:
            result += 1 / (alpha + list(u_items[u] & u_items[v]).__len__())

        item_sim_dict.setdefault(i, dict())
        item_sim_dict[i][j] = result
        # print(item_sim_dict[i][j])

    return item_sim_dict

def save_item_sims(item_sim_dict, path):
    new_item_sim_dict = dict()
    for item, sim_items in item_sim_dict.items():
        new_item_sim_dict.setdefault(item, dict())
        new_item_sim_dict[item] = dict(sorted(sim_items.items(), key = lambda k:k[1], reverse=True)[:top_k])
    json.dump(new_item_sim_dict, open(path, "w"))
    print("item 相似 item({})保存成功!".format(top_k))
    return new_item_sim_dict

def evaluate(item_sim_dict, test):
    # 可以参考《推荐系统开发实战》中的cf验证方式

    pass

if __name__ == "__main__":
    train_data_path = "../../data/ml-100k/ua.base"
    test_data_path = "../../data/ml-100k/ua.test"
    item_sim_save_path = "../../model/swing/item_sim_dict.json"

    train, test = load_data(train_data_path, test_data_path)
    if not os.path.exists(item_sim_save_path):
        u_items, i_users = get_uitems_iusers(train)
        item_sim_dict = cal_similarity(u_items, i_users)

        new_item_sim_dict = save_item_sims(item_sim_dict, item_sim_save_path)
    else:
        new_item_sim_dict = json.load(open(item_sim_save_path, "r"))

    evaluate(new_item_sim_dict, test)

————————————————

.Swing Spark实现
创建Swing类,其中的评估函数和predict函数这里并未提供,感兴趣的可以自己实现

/**
  * @ClassName: Swing
  * @Description: 实现Swing算法
  * @author: Thinkgamer
  **/

class SwingModel(spark: SparkSession) extends Serializable{
    var alpha: Option[Double] = Option(0.0)
    var items: Option[ArrayBuffer[String]] = Option(new ArrayBuffer[String]())
    var userIntersectionMap: Option[Map[String, Map[String, Int]]] = Option(Map[String, Map[String, Int]]())

    /*
     * @Description 给参数 alpha赋值
     * @Param double
     * @return cf.SwingModel
     **/
    def setAlpha(alpha: Double): SwingModel = {
        this.alpha = Option(alpha)
        this
    }

    /*
     * @Description 给所有的item进行赋值
     * @Param [array]
     * @return cf.SwingModel
     **/
    def setAllItems(array: Array[String]): SwingModel = {
        this.items = Option(array.toBuffer.asInstanceOf[ArrayBuffer[String]])
        this
    }

    /*
     * @Description 获取两两用户有行为的item交集个数
     * @Param [spark, data]
     * @return scala.collection.immutable.Map<java.lang.String,scala.collection.immutable.Map<java.lang.String,java.lang.Object>>
     **/
    def calUserRateItemIntersection(data: RDD[(String, String, Double)]): Map[String, Map[String, Int]] = {
        val rdd = data.map(l => (l._1, l._2)).groupByKey().map(l => (l._1, l._2.toSet))
        val map = (rdd cartesian rdd).map(l => (l._1._1, (l._2._1, (l._1._2 & l._2._2).toArray.length)))
            .groupByKey()
            .map(l => (l._1, l._2.toMap))
            .collectAsMap().toMap
        map.take(10).foreach(println)
        map
    }

    def fit(data: RDD[(String, String, Double)]): RDD[(String, String, Double)]= {
        this.userIntersectionMap = Option(this.calUserRateItemIntersection(data))
        println(this.userIntersectionMap.take(10))

        val rdd = data.map(l => (l._2, l._1)).groupByKey().map(l => (l._1, l._2.toSet))
        val result: RDD[(String, String, Double)] = (rdd cartesian rdd).map(l => {
            val item1 = l._1._1
            val item2 = l._2._1
            val intersectionUsers = l._1._2 & l._2._2
            var score = 0.0
            for(u1 <- intersectionUsers){
                for(u2 <- intersectionUsers){
                    score += 1.0 / (this.userIntersectionMap.get.get(u1).get(u2).toDouble + this.alpha.get)
                }
            }
            (item1, item2, score) // (item1, item2, swingsocre)
        })
        result
    }

    def evalute(test: RDD[(String, String, Double)]) = { }

    def predict(userid: String) = { }

    def predict(userids: Array[String]) = { }
    
}

main函数调用

object Swing {
    def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder().master("local[10]").appName("Swing").enableHiveSupport().getOrCreate()
        Logger.getRootLogger.setLevel(Level.WARN)

        val trainDataPath = "data/ml-100k/ua.base"
        val testDataPath = "data/ml-100k/ua.test"

      	import spark.sqlContext.implicits._
        val train: RDD[(String, String, Double)] = spark.sparkContext.textFile(trainDataPath).map(_.split("\t")).map(l => (l(0), l(1), l(2).toDouble))
        val test: RDD[(String, String, Double)] = spark.sparkContext.textFile(testDataPath).map(_.split("\t")).map(l => (l(0), l(1), l(2).toDouble))

        val items: Array[String] = train.map(_._2).collect()

        val swing = new SwingModel(spark).setAlpha(1).setAllItems(items)
        val itemSims: RDD[(String, String, Double)] = swing.fit(train)

        swing.evalute(test)
        swing.predict("")
        swing.predict(Array("", ""))

        spark.close()
    }
}

转载
https://blog.csdn.net/Gamer_gyt/article/details/115678598

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里手淘猜你喜欢Swing算法介绍 的相关文章

  • 协同过滤(Collaborative Filtering):UserCF and Item CF

    具体的学习资料可以参考王喆老师的 深度学习推荐系统 已经梳理好了知识体系 我也将按照这个路线再次梳理一遍 同时做一些拓展和加深理解 一 前言 系统过滤曾是多年前推荐系统领域的应用最广泛的模型 也是基石一样的存在 重要 重要 这里推出两篇论文
  • 基于 itemCF (item collaborative filtering) 推荐(基于物品的协同过滤算法)的理解

    推荐系统 一般是用于电商 广告 内容 信息流等推荐平台 以挖掘数据的最大价值 可以提升用户粘性和转化率 而本文提及到的基于内容的协同过滤算法就是一个经典的算法 基本思想 首先 什么是协同呢 协同在这里指的就是 用集体的智慧来为个体过滤出他需
  • 搜狐新闻算法原理

    转载 搜狐新闻推荐算法原理 导读 在当前这个移动互联网时代 各种信息内容爆炸 面对海量数据 用户希望在有限的时间和空间内 找到自己感兴趣的内容 这就是推荐需要解决的问题 接下来主要讲解新闻推荐的算法原理 01 新闻推荐算法架构 新闻算法的核
  • 2022年4月8日字节跳动机抖音APP推荐实习面试题

    1 AUC是什么 如何计算AUC AUC 随机取一个正样本和一个负样本 正样本的预测值大于负样本预测值的概率 AUC计算的关键是找到所有正样本预测值大于负样本预测值的正负样本对 首先 需要将样本按照预测值进行从小到大排序 最小score对应
  • 2023年计算机毕设选题推荐

    同学们好 这里是海浪学长的毕设系列文章 对毕设有任何疑问都可以问学长哦 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难
  • 【推荐系统】geohash召回

    经纬度坐标 精度非常高 只能表述一个点 二维坐标 geohash 一种地理编码系统 划分成4 8的格子 编码长度越长 区域大小越小 位置描述的越精确 1km 一般编码长度用6 7长度 geohash比经纬度好在哪里 浮点数编码成字符串占用的
  • 阿里手淘猜你喜欢Swing算法介绍

    Swing算法原理比较简单 是阿里早期使用到的一种召回算法 在阿里多个业务被验证过非常有效的一种召回方式 它认为 user item user 的结构比 itemCF 的单边结构更稳定 Swing指的是秋千 例如用户 u uu 和用户 v
  • 【人工智能】推荐系统算法

    推荐系统算法详解 一 推荐系统详解 1 基于人口统计学的推荐算法 基于人口统计学的推荐机制 Demographic based Recommendation 是一种最易于实现的推荐方法 它只是简单的根据系统用户的基本信息发现用户的相关程度
  • 推荐系统(2)——评测指标

    根据评测体系来评价一个推荐系统的好坏 由于推荐系统是和实际收益挂钩 所以需要考虑三方 用户 物品提供者和平台 的利益 实现最大化的三方共赢 接下来从 实 验 方 法 评
  • 【推荐算法】推荐系统的评估

    一 离线评估的主要方法 1 Holdout检验 Holdout检验是基础的离线评估方法 它将原始的样本集合随机划分为训练集和验证集两部分 比如70 训练集 30 测试集 但现在很多机器学习框架 深度学习框架中都增加了验证集 即将整个数据集分
  • 广电大数据用户画像及营销推荐策略(四)——Python实现

    本次大数据项目数据及分析均做脱敏化和保密化 主要分享思路体系 全程用Python实现 数据和代码均不提供 如有建议欢迎讨论 4 模型构建 在实际应用中 构造推荐系统时 并不是采用单一的某种推荐方法进行推荐 为了实现较好的推荐效果 大部分都将
  • 个人总结:推荐算法篇(附协同过滤等) 综述

    现代推荐系统 对于在线部分来说 一般要经历几个阶段 首先通过召回环节 将给用户推荐的物品降到千以下规模 因为在具备一定规模的公司里 是百万到千万级别 甚至上亿 所以对于每一个用户 如果对于千万级别物品都使用先进的模型挨个进行排序打分 明显速
  • 【Tensorflow 2.12 电影推荐系统之排序模型】

    Tensorflow 2 12 电影推荐系统之排序模型 学习笔记 导入相关模块 准备数据 加载数据 数据预处理 获取词汇表 构建模型 定义评分排序模型 定义损失函数以及模型评估指标 定义完整的评分排序模型 训练和评估 创建排序模型实例 缓存
  • 毕业设计-基于大数据招聘岗位可视化系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 图书推荐管理系统Python,基于Django和协同过滤算法等实现

    一 介绍 图书推荐系统 图书管理系统 以Python作为开发语言 基于Django实现 使用协同过滤算法实现对登录用户的图书推荐 二 效果展示 三 演示视频 视频 代码 https www yuque com ziwu yygu3z gq5
  • 模拟实现 队列 - JAVA(使用链表,数组)

    以链表实现 以数组实现 以链表实现 class Node public int val public Node next public Node int val this val val public class MyQueue publi
  • 推荐算法(Recommended Algorithms)

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 每日一题分享

    数字以 0123456789101112131415 的格式作为一个字符序列 在这个序列中第 2 位 从下标 0 开始计算 是 2 第 10 位是 1 第 13 位是 1 以此类题 请你输出第 n 位对应的数字 分析 0 9 共10个 10
  • lr推荐模型 特征重要性分析

    在分析lr模型特征重要性之前 需要先明白lr模型是怎么回事儿 lr模型公式是sigmoid w1 x1 w2 x2 wn xn 其中w1 w2 wn就是模型参数 x1 x2 xn是输入的特征值 对于lr模型来说 特征可以分为两个粒度 一个是
  • lr推荐模型 特征重要性分析

    在分析lr模型特征重要性之前 需要先明白lr模型是怎么回事儿 lr模型公式是sigmoid w1 x1 w2 x2 wn xn 其中w1 w2 wn就是模型参数 x1 x2 xn是输入的特征值 对于lr模型来说 特征可以分为两个粒度 一个是

随机推荐

  • 【知识点总结】电力电子技术——第二讲

    电力电子技术 第二讲 总结内容 逆变电路 电压型逆变电路 电流型逆变电路 直流斩波器 Buck电路 Boost电路 升降压斩波电路 Cuk斩波电路 Sepic斩波电路 Zeta斩波电路 扩展 电赛 双向DC DC电路 隔离电源 多重斩波电路
  • GDB调试器常用命令

    1 l命令 list 列出所有程序源码 2 b命令 break 用于设置断点 break main 表示在 main 函数处设置断点 break 11 在第 11 行设置断点 3 c命令用于运行到断点处 输入 c 命令程序就会运行 直到下一
  • 来聊聊DenseNet及其变体PeleeNet、VoVNet

    关注公众号 AI算法修炼营 选择 星标 公众号 精选作品 第一时间送达 前面 基础积累系列的文章讲了ResNet网络及其变体 具体可以参考文章 来聊聊ResNet及其变体 ResNet通过前层与后层的 短路连接 Shortcuts 加强了前
  • Pytorch清空显存缓冲区(torch.cuda.empty_cache)

    torch cuda empty cache 因为PyTorch是有缓存区的设置的 意思就是一个Tensor就算被释放了 进程也不会把空闲出来的显存还给GPU 而是等待下一个Tensor来填入这一片被释放的空间 所以我们用nvidia sm
  • P4环境搭建

    P4的运行环境包括以下组件 protobuf p4c behavioral model grpc PI mininet 一 安装全新的Ubuntu 在vmware上安装Ubuntu的过程这篇文章就不写了 大伙可以找其他博主的教程 我建议的版
  • 商用服务器SMP、NUMA及MPP体系介绍

    今天给大家介绍一下常见的三种商用服务器 SMP NUMA以及MPP 一 SMP详解 所谓SMP 即Symmetric Multi processor 对称多处理器结构 x86服务器及其他双路服务器就属于这种结构 PC机 手机和笔记本电脑也属
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 操作系统 — 进程的退出(exit)

    进程退出 linux下正常的退出方式 1 在main函数中使用了return返回 return之后把控制权交给调用函数 2 调用exit 或者 exit exit 之后把控制权交给系统 异常退出 1 调用abort函数 2 进程收到某个信号
  • 双重祖先【树链剖分】

    题目链接 51nod 2553 双重祖先 给定两棵有根树 两棵树均有 n个节点 且根均为 11号点 问有多少对 u v 满足 在给定的两棵树中 u均为 v的祖先 数据范围 1 105 1 首先 我们可以考虑第一棵树 向下dfs的过程中 我们
  • ng 无法加载文件 C:\Users\hl\AppData\Roaming\npm\ng.ps1 解决方法

    错误提示 一 我们在win10 系统中有一个搜索框 输入 Windos PowerShell noted 一定要选择 管理员身份运行 二 打开了命令行之后 输入 set ExecutionPolicy RemoteSigned 然后更改权限
  • Java 常用命令、文档注释、命令行参数

    目录 注释 常用命令 生成API文档 命令行参数 注释 单行注释 多 行 注 释 文档注释 一般标注在类 接口 对外暴露的成员上 描述功能 使用说明 订单业务服务 author chy xxx xxx com version 1 0 sin
  • python 出现socket.gaierror: [Errno 11004] getaddrinfo failed错误

    python 出现socket gaierror Errno 11004 getaddrinfo failed错误 报错详情 Traceback most recent call last File D JiCaiZhuanTi Case
  • 短信开发中的MT、MO是什么意思?

    MO Mobile originate MT Mobile Terminate MT 下行 即SP端下发给用户的信息 MO 上行 即用户上发给SP的信息 上行 mo提交短信到短信中心 下行 mt短信中心向特定的用户转发短信 你的短信是这样的
  • redis4.0集群搭建

    1 安装单机版Redis centos7可以yum直接安装 也可以通过源码包安装 以下仅展示源码编译安装 安装依赖 root localhost yum install gcc y 下载redis4 0 root localhost wge
  • 【习题四】【数据库原理】

    文章目录 一 单选题 二 填空题 三 简答题 Reference 一 单选题 1 表达了数据和处理过程的关系 A 数据字典 B 数据流图 C 逻辑设计 D 概念设计 正确答案 B 2 设计子模式属于数据库设计的 A 需求分析 B 概念设计
  • 为什么计算机采用二进制而不是八进制或者十六进制

    电子计算机能以极高速度进行信息处理和加工 包括数据处理和加工 而且有极大的信息存储能力 数据在计算机中以器件的物理状态表示 采用二进制数字系统 计算机处理所有的字符或符号也要用二进制编码来表示 用二进制的优点是容易表示 运算规则简单 节省设
  • 21亿春节红包撒出去,能缓解快手的流量焦虑吗?

    来源 连线Insight 编辑 李信 抖音作为央视春晚合作伙伴 着实火了一把 官方数据显示 春晚期间 抖音红包的总互动次数达到703亿 在抖音宣布成为2021年春晚独家红包互动合作伙伴时 最焦虑的莫过于快手 1月28日 快手官方微博宣布拿下
  • 类默认成员函数 - 析构函数

    析构函数与构造函数就是功能截然相反的两个函数了 析构函数就是将对象内部的资源进行清理 如malloc开辟的等 值得注意的是 很多人误以为析构函数是销毁对象 对象的销毁工作是由编译器完成的 我们现在说说析构函数的有那些特性 1 还是重析构函数
  • 咖说丨一文了解区块链在医疗领域的应用案例

    收集一众行业大咖观点 探索区块链商业及应用 百家争鸣 百花齐放 说理 解密 预测和八卦 了解行业内幕 看咖说就够了 投稿请联系 tougao conflux chain org 本文转自 白话区块链 作者 Wayne 换了一家医院就诊就要重
  • 阿里手淘猜你喜欢Swing算法介绍

    Swing算法原理比较简单 是阿里早期使用到的一种召回算法 在阿里多个业务被验证过非常有效的一种召回方式 它认为 user item user 的结构比 itemCF 的单边结构更稳定 Swing指的是秋千 例如用户 u uu 和用户 v