基于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
  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server是一种关系型数据库管理系统,而Java Swing是一种用于构建图形用户界面(GUI)的Java库。如果要使用SQL Server和Java Swing实现图书管理系统,可以按照以下步骤进行: 1. 数据库设计:首先需要在SQL Server中创建一个数据库,设计图书表,包括图书编号、图书名称、作者、出版社、出版日期等字段。可以使用SQL语句创建表并设置主键、外键等约束。 2. 连接数据库:在Java Swing中,使用JDBC(Java Database Connectivity)连接SQL Server数据库。可以使用适当的JDBC驱动程序,如Microsoft SQL Server JDBC驱动程序。 3. GUI设计:使用Java Swing的各种组件和布局管理器来设计图书管理系统的用户界面。可以创建图书列表、添加图书、删除图书等功能的按钮,用文本框显示图书信息。 4. 数据操作:实现与数据库的交互,通过SQL查询语句从数据库中检索图书信息,并将其显示在界面上。当点击添加图书按钮时,通过SQL插入语句将图书信息插入到数据库中。 5. 事件处理:给按钮添加事件监听器,当用户点击按钮时,执行相应的操作。例如,当用户点击删除图书按钮时,执行SQL删除语句将图书从数据库中删除。 6. 错误处理:在实现过程中,需要添加适当的异常处理代码,捕获并处理可能出现的错误。例如,当数据库连接失败时,需要给出合适的提示信息。 通过SQL Server和Java Swing的组合,可以实现一个功能完善的图书管理系统。用户可以通过图形界面进行图书的添加、删除、查询等操作,并且这些操作会直接反映在数据库中。这样的系统可以提高图书管理的效率和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值