Topik ini menjelaskan algoritma Swing yang dikembangkan oleh Alibaba.
Pengenalan algoritma Swing
Swing adalah algoritma pencocokan baru yang dibuat oleh Alibaba. Tidak seperti algoritma tradisional yang menghitung kemiripan node berdasarkan kedekatan node, seperti tetangga umum, Adamic/Adar, kemiripan kosinus, kemiripan Jaccard, kosinus, dan Rooted PageRank, Swing mempertimbangkan struktur graf dan dapat diperluas ke node dua-hop dengan struktur graf dimensi tinggi. Swing anti-kebisingan dan secara signifikan meningkatkan akurasi dibandingkan dengan algoritma penyaringan kolaboratif tradisional.
Indeks item-to-item (I2I) yang dihasilkan melalui Swing, sebagai data dasar utama, banyak digunakan dalam berbagai skenario rekomendasi Taobao di perangkat seluler dan PC. Swing juga digunakan dalam layanan iklan TTPOD dan Alimama dari Alibaba Group, memberikan manfaat yang jelas.
Persiapan sampel
Buat tabel input.
CREATE TABLE IF NOT EXISTS swing_test_input
(
user_id bigint,
item_list string -- item_list adalah bidang wajib, dan terdiri dari setidaknya sub-bidang item_id, timestamp, dan norm. item_list berisi item secara berurutan yang diklik oleh pengguna.
)
lifecycle 7;Item dalam item_list dipisahkan dengan titik koma (;). Informasi setiap item terdiri dari minimal tiga sub-bidang: item_id, norm, dan timestamp. item_id harus menjadi sub-bidang pertama. Nilai sub-bidang timestamp harus dalam format %Y%m%d%H%M%S. Jika Anda tidak perlu menggunakan sub-bidang timestamp, Anda dapat menentukan nilai yang sama untuk semua item. norm mewakili popularitas terkini (jumlah klik) suatu item. Jika Anda tidak perlu menggunakannya, Anda dapat menentukan 1 untuk semua item. Item dalam item_list harus didaftarkan berdasarkan urutan waktu dari yang paling awal hingga yang paling baru sesuai dengan waktu ketika item tersebut diklik.
Nilai item_id harus bertipe numerik.
Buat tabel output.
CREATE TABLE IF NOT EXISTS swing_test_result
(
item_id BIGINT COMMENT 'ID item jangkar',
item_list STRING COMMENT 'Daftar item serupa'
)
LIFECYCLE 7;Tabel output terdiri dari dua kolom: item_id dan item_list. Kolom item_list memiliki format berikut: item_id1,score1,coccur1,ori_score1;item_id2,score2,coccur2,ori_score2. ori_score1 adalah skor kesamaan asli. score1 adalah skor yang dihasilkan setelah nilai maksimum dinormalisasi. coccur1 adalah jumlah kemunculan bersama.
Perintah 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'Parameter algoritma
Parameter | Deskripsi | Tipe Parameter |
inputTable | Tabel input: Urutan klik pengguna; mendukung tabel partisi dan non-partisi. | Gunakan "/" untuk menggabungkan nama tabel dan nilai partisi. |
outputTable | Tabel output: indeks i2i; mendukung tabel partisi dan non-partisi. | Gunakan "/" untuk menggabungkan nama tabel dan nilai partisi. |
maxClickPerUser | Panjang maksimum daftar item setiap pengguna. Jika panjang daftar item melebihi batas, item terbaru akan dipotong dan disimpan. | Bilangan bulat. Nilai default: 600. |
maxTimeSpan | Jumlah hari maksimum antara dua klik di mana dua item yang diklik dianggap memiliki hubungan tetangga. | Bilangan bulat. Nilai default: 1. |
maxUserPerItem | Jumlah pengguna yang mengklik setiap item. Angka ini digunakan untuk menghitung k tetangga terdekat setiap item. | Bilangan bulat. Nilai default: 700. |
topk | Jumlah k tetangga terdekat yang disimpan untuk setiap item pemicu. | Bilangan bulat. Nilai default: 200. |
alpha1 | Parameter algoritma Swing. Untuk informasi lebih lanjut, lihat Rumus [1]. | Bilangan bulat. Nilai default: 5. |
beta | Parameter algoritma Swing. Untuk informasi lebih lanjut, lihat Rumus [1]. | Bilangan real. Nilai default: 0,3. |
alpha2 | Parameter algoritma Swing. Untuk informasi lebih lanjut, lihat Rumus [1]. | Bilangan bulat. Nilai default: 1. |
pos_time | Nomor seri bidang yang sesuai dengan timestamp. Dimulai dari 0. Dalam contoh sebelumnya, nomor seri bidang adalah 2. | Bilangan bulat. Nilai default: 2. |
pos_norm | Nomor seri bidang yang sesuai dengan popularitas item. Dimulai dari 0. Dalam contoh sebelumnya, nilainya adalah 1. | Bilangan bulat. Nilai default: 1. |
Rumus [1]: