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]: