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/ds=20250809'
-DoutputTable='swing_test_result/ds=20250809'
-DmaxClickPerUser='500'
-DmaxUserPerItem='600'
-Dtopk='100'
-Dalpha1='5'
-Dalpha2='1'
-Dbeta='0.3'演算法參數
參數名稱 | 參數描述 | 參數類型 |
inputTable | 輸入表:使用者點擊序列;支援 | 用 |
outputTable | 輸出表:i2i索引;支援 | 用 |
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]: