基于swing和cf的推荐相似度SQL实现

对于cf和swing算法的介绍可以参考ItemCF的演进:狭义 VS 广义

基于cf的推荐相似度

这里介绍这样一个场景,我们有了大量的电商购买数据,希望通过cf算法计算不同的类目之间的相似度,以方便对用户购买进行兴趣探索。
使用SQL实现需要通过join来完成user和cate构成矩阵计算cate之间的余弦相似度,公式如下,而这里又分成三步
cos ⁡ ( A , B ) = a 1 b 1 + a 2 b 2 + … + a n b n ( a 1 a 1 + a 2 a 2 + … + a n a n ) ( b 1 b 1 + b 2 b 2 + … + b n ∗ b n ) \cos(A, B)=\dfrac{a_1b_1+a_2b_2+…+a_nb_n}{\sqrt{(a_1a_1+a_2a_2+…+a_na_n)(b_1b_1+b_2b_2+…+b_n*b_n)}} cos(A,B)=(a1a1+a2a2++anan)(b1b1+b2b2++bnbn) a1b1+a2b2++anbn

  1. user_cate获得user对每个cate的score:普通的score可以设计为用户的订单量,但这会导致高活跃用户对相似度计算贡献太多导致失真,因此这里设计score为用户订单量对数的倒数,即对高活跃用户对相似度的贡献进行惩罚;同时为了防止高热类目计算量过大,使用随机采样保证每个类目下订单量少于10000000
  2. cc_prod计算同user下的cate交叉score乘积,里面包含余弦相似度矩阵的分子(即内积)和分母(即模)
  3. 最后计算余弦相似度,内积除以两个模
with user_cate as (
    select
        t1.user_id,
        t1.cate_id,
        sum(1 / log(t2.act + 1)) as score
    from (
        select
            user_id,
            category_id as cate_id,
            row_number() over(partition by category_id order by rand(47)) as rn
        from
            project.my_table
        where
            p_date > '{{ds_nodash - 30}}' and p_date <= '{{ds_nodash}}'
            and user_id > 0
            and category_id > 0
            and pay_order_cnt > 0
    ) t1
    join (
        select
            user_id,
            count(1) as act
        from
            project.my_table
        where
            p_date > '{{ds_nodash - 30}}' and p_date <= '{{ds_nodash}}'
            and user_id > 0
            and category_id > 0
            and pay_order_cnt > 0
        group by user_id
    ) t2 on t1.user_id = t2.user_id
    where t1.rn < 10000000
    group by t1.user_id,
        t1.cate_id
),
cc_prod as (
    SELECT cate1, cate2, sum(score_prod) AS prod
    FROM (
        SELECT t1.cate_id AS cate1, t2.cate_id AS cate2, t1.score*t2.score as score_prod
        FROM user_cate t1
        JOIN user_cate t2
        ON t1.user_id = t2.user_id
    ) t
    GROUP BY cate1, cate2
)

SELECT t1.cate1, t1.cate2, t1.prod/SQRT(t2.prod*t3.prod) AS sim 
FROM cc_prod t1
JOIN cc_prod t2 ON t1.cate1=t2.cate1 AND t1.cate1=t2.cate2
JOIN cc_prod t3 ON t1.cate2=t3.cate1 AND t1.cate2=t3.cate2
where t1.cate1 != t1.cate2

基于swing的推荐物品相似度

swing算法的核心公式如下,其中 U i U_i Ui表示购买类目 i i i的用户集合, U j U_j Uj表示购买类目 j j j的用户集合, I u I_u Iu表示用户 u u u购买的类目集合, I v I_v Iv表示用户 v v v购买的类目集合,具体算法解释可以参考swing:一种工业界广泛使用的召回算法,用SQL实现时也分为三步
swing

  1. user_cate获得user和cate建立的边关系,注意这里不考虑订单量了;这里测试发现cate能接受的数据量最多采样为20000,再多就基本跑不动了
  2. uu_cate计算任意两个user共同购买cate的配对
  3. 最后计算任意两个user共同购买的任意两个cate的配对(t1)和任意两个user共同购买cate的数量cate_cnt(t2),将1 / (1 + cate_cnt)在任意两个cate的配对里累加,即为最后的cate相似度
with user_cate as (
    select
        user_id,
        cate_id
    from (
        select
            user_id,
            category_id as cate_id,
            row_number() over(partition by category_id order by rand(47)) as rn
        from
            project.my_table
        where
            p_date = '{{ds_nodash}}'
            and user_id > 0
            and category_id > 0
            and pay_order_cnt > 0
    ) t
    where rn < 20000
    group by user_id,
        cate_id
),
uu_cate as (
	select
	    uc1.user_id as u1,
	    uc2.user_id as u2,
	    uc1.cate_id as cate
	from user_cate as uc1
	left join user_cate as uc2
	on uc1.cate_id = uc2.cate_id
	where uc1.user_id != uc2.user_id
)

select 
    cate1,
    cate2,
    sum(1 / (1 + cate_cnt)) as sim
from (
    select 
        uuc1.u1,
        uuc1.u2,
        uuc1.cate as cate1,
        uuc2.cate as cate2
    from uu_cate as uuc1
    left join uu_cate as uuc2
    on uuc1.u1 = uuc2.u1 and uuc1.u2 = uuc2.u2
    where uuc1.cate != uuc2.cate
) t1
left join (
    select
        u1,
        u2,
        count(cate) as cate_cnt
    from uu_cate
    group by u1, u2
) t2 on t1.u1 = t2.u1 and t1.u2 = t2.u2
group by cate1, cate2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/377341.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10.0 Zookeeper 权限控制 ACL

zookeeper 的 ACL&#xff08;Access Control List&#xff0c;访问控制表&#xff09;权限在生产环境是特别重要的&#xff0c;所以本章节特别介绍一下。 ACL 权限可以针对节点设置相关读写等权限&#xff0c;保障数据安全性。 permissions 可以指定不同的权限范围及角色。 …

【STL】:priority_queue介绍和模拟实现

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关priority_queue的使用&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

C# ONNX使用入门教程

背景 有新入坑的老哥不太了解C# onnx 运行的机理&#xff0c;我这边详细介绍一下&#xff0c;之前直接放官方的样例有点草率了。 准备[python环境] 1、要使用onnx&#xff0c;首先我们就自己生成一个onnx文件&#xff0c;请大家准备一下以下需要的[python]环境 python 版本…

探索设计模式的魅力:揭秘享元模式-轻松实现资源高效利用的秘密武器

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 引言&#xff1a; 一、简介 二、实现资源的极致利用 公共自行车与享元模式的智慧共享 HOW 三、案例探讨 3.1 场景 3.2 不用模式实现&#xff1a;一坨坨代码实现 3.3 痛点 3.4 解决方案分析 注意 四、深入享…

Qt多线程与SocketTCP的简单实现

1.相关说明 多线程实现Qt的socket编程实现客户端发送文件&#xff0c;服务端接收文件&#xff0c;并且在客户端设置了心跳&#xff0c;用于监控服务端是否存活。因为Qt中socket套接字发送数据&#xff0c;会先把数据发送至缓冲区中&#xff0c;在发送数据过程中&#xff0c;soc…

寒假学习第24天---PythonPoc基础编写(二)

提示&#xff1a;所分享内容仅用于每一个爱好者之间的技术讨论及教育目的&#xff0c;所有渗透及工具的使用都需获取授权&#xff0c;禁止用于违法途径&#xff0c;否则需自行承担&#xff0c;本作者不承担相应的后果。 文章目录 前言一、 目标二、过程思路实践开始 总结完整代…

Java基于微信小程序的驾校报名小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

腾讯云游戏服务器购买入口,详细配置精准报价

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

创建网站的具体步骤是什么?

创建网站的具体步骤是什么 一.领取一个免费域名和SSL证书&#xff0c;和CDN 1.打开网站链接&#xff1a;https://www.rainyun.com/z22_ 2.在网站主页上&#xff0c;您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册"&#xff0c;然后选择"微信登…

假期刷题打卡--Day26

1、MT1212乘法表 请编写一个简单程序&#xff0c;输出九九乘法表。输入n&#xff0c;就输出乘法表到n的地方。 格式 输入格式&#xff1a; 输入整型 输出格式&#xff1a; 输出整型。形式如&#xff1a;1*11 样例 1 输入&#xff1a; 5输出&#xff1a; 1*11 2*12 …

格子表单GRID-FORM | 文档网站搭建(VitePress)与部署(Github Pages)

格子表单/GRID-FORM已在Github 开源&#xff0c;如能帮到您麻烦给个星&#x1f91d; GRID-FORM 系列文章 基于 VUE3 可视化低代码表单设计器嵌套表单与自定义脚本交互文档网站搭建&#xff08;VitePress&#xff09;与部署&#xff08;Github Pages&#xff09; 效果预览 格…

服装设计公司,如何用钉钉实现企业数字化成功转型?

钉钉作为数字化工作平台&#xff0c;为某服装设计公司实现了组织管理的数字化转型&#xff0c;构建了一站式的工作平台。通过钉钉赋能&#xff0c;有利于企业推进组织架构、员工沟通、产品运营和客户服务等方面的数字化、智能化转型。 借助钉钉平台&#xff0c;该服设公司轻松实…

【C++第二阶段】空指针访问成员函数常成员函数常成员属性

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 空指针访问成员函数常成员函数&常成员属性 空指针访问成员函数 类对象类型的空指针可以访问成员函数&#xff0c;但是不能够访问带有成员属性的成员函数。…

js-添加网页快捷方式

title: js-添加网页快捷方式 categories: Javascript tags: [p快捷方式] date: 2024-02-04 15:28:25 comments: false mathjax: true toc: true js-添加网页快捷方式 前篇 谷歌上包困难的情况, 只能通过投放落地页来缓解一下痛苦, web2app 那种形式有几个比较大的缺点就是需要…

人工智能基础部分24-人工智能的数学基础,汇集了人工智能数学知识最全面的概况

、 大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分24-人工智能的数学基础&#xff0c;汇集了人工智能数学知识最全面的概况&#xff0c;深度学习是一种利用多层神经网络对数据进行特征学习和表示学习的机器学习方法。要全面了解深度学习的数学基…

FlinkSql通用调优策略

历史文章迁移&#xff0c;稍后整理 使用DataGenerator 提前进行压测&#xff0c;了解数据的处理瓶颈、性能测试和消费能力 开启minibatch&#xff1a;"table.exec.mini-batch.enabled", "true" 开启LocalGlobal 两阶段聚合&#xff1a;"table.exec.m…

【力扣】快乐数,哈希集合+快慢指针+数学

快乐数原题地址 方法一&#xff1a;哈希集合 定义函数getNext(n)&#xff0c;返回n的所有位的平方和。一直执行ngetNext(n)&#xff0c;最终只有2种可能&#xff1a; n停留在1。无限循环且不为1。 证明&#xff1a;情况1是存在的&#xff0c;如力扣的示例一&#xff1a; 接…

怎么加密电脑磁盘?磁盘加密软件哪个好?

磁盘是电脑储存数据的基础工具&#xff0c;可以存放大量数据。为了避免数据泄露&#xff0c;可以使用专业的磁盘加密软件加密保护电脑磁盘。那么&#xff0c;磁盘加密软件哪个好呢&#xff1f;下面我们就来了解一下。 磁盘加锁专家 磁盘加锁专家是一款专业的磁盘加锁软件&…

阅读《极客时间 | Kafka核心技术与实战》(一)【Kafka入门】

阅读《极客时间 | Kafka核心技术与实战》 为什么要学习Kafka消息引擎系统ABC一篇文章带你快速搞定Kafka术语我应该选择哪种Kafka&#xff1f;聊聊Kafka的版本号 为什么要学习Kafka 如果你是一名软件开发工程师的话&#xff0c;掌握 Kafka 的第一步就是要根据你掌握的编程语言去…

使用CMSIS-DSP库进行嵌入式音频信号处理

在嵌入式环境下&#xff0c;使用CMSIS-DSP库进行音频信号处理是一种常见的应用场景。通过CMSIS-DSP库&#xff0c;开发人员可以利用嵌入式系统的处理能力来实现各种数字信号处理&#xff08;DSP&#xff09;功能&#xff0c;例如音频滤波、均衡器、噪音消除等。本文将介绍如何在…