このトピックでは、Alibabaによって作成されたSwingアルゴリズムについて説明します。
Swingアルゴリズムの概要
Swingは、Alibabaによって作成された新しいマッチングアルゴリズムです。共通の隣接ノード、Adamic/Adar、コサイン類似度、Jaccard類似度、コサイン、Rooted PageRankなど、ノードの近接性に基づいてノードの類似度を計算する従来のアルゴリズムとは異なり、Swingはグラフ構造を考慮し、高次元グラフ構造を持つ2ホップノードに拡張できます。 Swingはノイズに強く、従来の協調フィルタリングアルゴリズムと比較して精度が大幅に向上します。
Swingによって取得されたアイテム間(I2I)インデックスは、最も重要な基本データとして、モバイルフォンやPCの淘宝網の多くのレコメンデーションシーンで広く使用されています。 Swingは、AlibabaグループのTTPODおよびAlimamaの広告サービスでも使用されており、明らかなメリットをもたらしています。
サンプルの準備
入力テーブルを作成します。
CREATE TABLE IF NOT EXISTS swing_test_input
(
user_id bigint,
item_list string -- item_listは必須フィールドであり、少なくともitem_id、timestamp、およびnormサブフィールドで構成されます。 item_listには、ユーザーがクリックしたアイテムが順番に含まれています。
)
lifecycle 7; item_list 内のアイテムはセミコロン (;) で区切られます。各アイテムの情報は、item_id、norm、timestamp の少なくとも 3 つのサブフィールドで構成されます。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 'アンカーアイテムID',
item_list STRING COMMENT '類似アイテムのリスト'
)
LIFECYCLE 7;出力テーブルは、item_id と item_list の 2 つの列で構成されます。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 | クリック間の最大日数。この範囲内であれば、2つのクリックされたアイテムは隣接関係にあると見なされます。 | 整数。 デフォルト値:1。 |
maxUserPerItem | 各アイテムをクリックしたユーザーの数。 この数は、各アイテムのk近傍を計算するために使用されます。 | 整数。 デフォルト値:700。 |
topk | 各トリガーアイテム用に予約されているk近傍の数。 | 整数。 デフォルト値:200。 |
alpha1 | Swingアルゴリズムパラメーター。 詳細については、式[1]をご参照ください。 | 整数。 デフォルト値:5。 |
beta | Swingアルゴリズムパラメーター。 詳細については、式[1]をご参照ください。 | 実数。 デフォルト値:0.3。 |
alpha2 | Swingアルゴリズムパラメーター。 詳細については、式[1]をご参照ください。 | 整数。 デフォルト値:1。 |
pos_time | タイムスタンプに対応するフィールドのシリアル番号。 0から始まります。 前の例では、フィールドのシリアル番号は2です。 | 整数。 デフォルト値:2。 |
pos_norm | アイテムの人気度に対応するフィールドのシリアル番号。 0から始まります。 前の例では、値は1です。 | 整数。 デフォルト値:1。 |
式[1]: