Swing 是阿里巴巴原创的一种新的match算法,不同于传统基于“点”的节点亲密度(proximity)计算方式,如:Common Neighbors, Adamic/Adar, Cosine Similarity, Jaccard Similarity, Wb-cosine, Rooted PageRank等,Swing会考虑网络结构信息,以高维的网络结构向二跳节点扩展,抗噪能力强,相比传统的CF准确性有大幅的提升。目前Swing i2i作为最重要的基础数据,广泛应用于手淘和PC众多的推荐场景中; 除此之外,swing还应用于集团天天动听和阿里妈妈广告业务中,并有显著提升。
Swing算法简介
Swing 是阿里巴巴原创的一种新的match算法,不同于传统基于“点”的节点亲密度(proximity)计算方式,如:Common Neighbors, Adamic/Adar, Cosine Similarity, Jaccard Similarity, Wb-cosine, Rooted PageRank等,Swing会考虑网络结构信息,以高维的网络结构向二跳节点扩展,抗噪能力强,相比传统的CF准确性有大幅的提升。
目前Swing i2i作为最重要的基础数据,广泛应用于手淘和PC众多的推荐场景中; 除此之外,swing还应用于集团天天动听和阿里妈妈广告业务中,并有显著提升。
样本准备
创建输入表
CREATE TABLE IF NOT EXISTS swing_test_input
(
user_id bigint,
item_list string --点击序列为必须字段,且至少提供item_id, timestamp和norm字段
)
lifecycle 7;
数据样例如下所示。点击序列由分号分割,每个点击商品由至少3个字段构成,即item_id, norm,timestamp.其中item_id需要在开头,timestamp遵循%Y%m%d%H%M%S
的格式,如不需要可以用同一个timestamp填充。norm代表商品近期的热度(点击量),如不需要,可以统一用1填充。应按照点击时间顺序由远至今组织item_list。
备注:item_id 必须为数字类型。
创建输出表
CREATE TABLE IF NOT EXISTS swing_test_result
(
item_id BIGINT COMMENT 'anchor物品ID',
item_list STRING COMMENT '相似物品列表'
)
LIFECYCLE 7;
输出表分为两列:item_id和item_list,其中 item_list 形如item_id1,score1,coccur1,ori_score1;item_id2,score2,coccur2,ori_score2
。其中,ori_score1
是原始相似度分数;score1
是最大值归一化之后的分数;coccur1
是共现次数。
PAI命令行
pai -name swing_rec_ext
-project algo_public
-DinputTable='swing_test_input'
-DoutputTable='swing_test_result'
-DmaxClickPerUser='500'
-DmaxUserPerItem='600'
-Dtopk='100'
-Dalpha1='5'
-Dalpha2='1'
-Dbeta='0.3'
算法参数
参数名称 | 参数描述 | 参数类型 |
inputTable | 输入表:用户点击序列 | |
inputPart | 输入表的分区 | |
outputTable | 输出表:i2i索引 | |
outputPart | 输出表的分区 | |
maxClickPerUser | 每个用户的最长序列长度,如果超过该长度会对最近进行截断保留 | 整数,默认值为600 |
maxTimeSpan | 认为两个商品存在邻居关系的最长点击间隔天数 | 整数,默认值为1 |
maxUserPerItem | 每个商品使用多少个用户的点击序列来计算k近邻 | 整数,默认值为700 |
topk | 每个trigger商品保留的k近邻数目 | 整数,默认值为200 |
alpha1 | swing算法参数,见公式[1] | 整数,默认值为5 |
beta | swing算法参数,见公式[1] | 实数,默认值为0.3 |
alpha2 | swing算法参数,见公式[1] | 整数,默认值为1 |
pos_time | timestamp对应的字段编号,从0开始,在上述样例中为2 | 整数,默认值为2 |
pos_norm | 商品热度所对应字段,从0开始,在上述样例中1 | 整数,默认值为1 |
公式[1]: