SVD'yi ortak filtrelemede nasıl kullanırım?


30

SVD'nin işbirlikçi filtrelemede nasıl kullanıldığına biraz karıştı. Sosyal bir grafiğim olduğunu ve kenarlardan bitişik bir matris oluşturduğumu ve ardından bir SVD (benim düzenlileştirme, öğrenme oranları, sparite optimizasyonları vb. Unutalım) unutacağımı varsayalım, önerilerimi geliştirmek için bu SVD'yi nasıl kullanırım?

Sosyal grafiğimin instagrama karşılık geldiğini ve yalnızca sosyal grafiğe dayanarak hizmette kullanıcı önerme sorumluluğuyla görev aldığımı varsayalım. İlk bir bitişiklik kuracak matris , SVD almak , ilk tercih sonra ne öz,?A (m×m)A=UsVk

Büyük olasılıkla yeni bir matris kümesi oluştururdum: o zaman ne yapar?

Unewm×ksnewk×kVnewk×m

İnternete baktım ve bağlantıların çoğu SVD'yi hesaplamaya odaklandı, ancak kimse size bununla ne yapacağınızı söylemiyor. Peki ne yapmalıyım?


1
Bu sorunuzu yanıtlayabilir: datascience.stackexchange.com/a/16523
avli

Yanıtlar:


7

Ancak: Saf vanilya SVD'sinde, eksik eşyalar için değerleri tahmin etmekten bağımsız olarak, orijinal matrisi yeniden oluşturmakta sorun yaşayabilirsiniz. Bu alandaki kullanışlı kural, film başına ortalama puanı hesaplamak ve bu ortalamayı her kullanıcı / film kombinasyonu için çıkarmak, yani her kullanıcıdan film önyargısını çıkarmaktır. Daha sonra, SVD'yi çalıştırmanız önerilir ve elbette, derecelendirmeleri yeniden oluşturmak veya bilinmeyen değerleri tahmin etmek için bu önyargı değerlerini bir yere kaydetmeniz gerekir. Öneriler için Simon Funk'ın SVD'deki yayınını okudum - Netflix yarışması sırasında artan bir SVD yaklaşımı icat etti.

http://sifter.org/~simon/journal/20061211.html

SVD'nin kuzeni PCA'nın da benzer şekilde çalıştığından, SVD'nin anlamsız hale gelmesinden önce A matrisini indirgemeyi düşünüyorum. Artımlı hesaplama açısından, Funk bana eğer demezseniz, ilk gradyan yönünün hesaplamanın geri kalanında egemen olduğunu söyledi. Bunu ilk elden gördüm, temelde işe yaramayan bir şey demeden.


24

Muhalif bir görüş bildirmek isterim:

Eksik Değerler Olarak Eksik Kenarlar

Ortak bir filtreleme sorunu olarak, mevcut olmayan bağlantılar (kullanım et alan henüz j , kişi x kişi friendede olan y ) genel olarak kabul edilir eksik değerler yerine sıfır olarak daha tahmin edilmesi. Kullanıcı eğer kendisine, ben öğe oy vermedi j , biz o takdirde o oranı ne olabileceğini tahmin etmek istiyorum etmişti olarak değerlendirdi. Kişi ise x friendede henüz y , biz onun ediyorum olma olasılığını tahmin etmek istiyorum istiyorum onu arkadaşına. Öneriler yeniden yapılandırılmış değerlere dayanmaktadır.benjxybenjxy

Sosyal grafiğin SVD'sini aldığınızda (örneğin, onu takın svd()), temelde tüm bu eksik noktalara sıfırlar yerleştirirsiniz. Bunun sorunlu olduğu, işbirlikçi filtrelemeye yönelik kullanıcı-madde derecelendirme kurulumunda daha belirgindir. Eksik olan girişleri güvenli bir şekilde doldurmamın bir yolu olsaydı, SVD kullanmam gerekmeyecekti. Sadece doldurduğum girişlere dayanarak tavsiyelerde bulunabilirim. Bunu yapacak bir yolum yoksa, SVD yapmadan önce onları doldurmamalıyım. *

Eksik Değerli SVD

Tabii ki, svd()işlev eksik değerlerle nasıl baş edeceğini bilmiyor. Peki tam olarak ne yapman gerekiyor? Sorunu tekrar çözmenin bir yolu var .

Msgstr "Orijinal matrise en yakın olan derecesinin matrisini bulun "k

Gerçekten çözmeye çalıştığınız sorun budur ve çözmek için kullanmayacaksınız svd(). Benim için çalışan bir yol (Netflix ödül verilerinde) şuydu:

  • Basit bir modelle girişlerini sığdırmak için deneyin X i , j = μ + α i + β j . Bu aslında iyi bir iş yapıyor.X^ben,j=μ+αben+βj

  • benkubenjkvjkΣubenmvjm

  • Orijinal matrise olan mesafeyi en aza indiren vektörleri bulmak için bazı algoritmalar kullanın. Örneğin, bu kağıdı kullanın

İyi şanslar!

*: Tenali'nin önerdiği şey temel olarak en yakın komşular. Benzer kullanıcıları bulmaya çalışın ve bu konuda önerilerde bulunun. Ne yazık ki, seyreklik problemi (matrisin ~% 99'u eksik değerler) kosinüs mesafesi veya jakar benzerliği veya benzerini kullanarak en yakın komşuları bulmayı zorlaştırıyor. Bu nedenle, ilk önce kullanıcıları daha küçük bir özellik alanına sıkıştırmak ve daha sonra orada karşılaştırma yapmak için matrisin bir SVD'sini (sıfır değerlere sahip sıfırlar dahil) yapmayı öneriyor. SVD'ye en yakın komşuları yapmak iyidir, ancak yine de SVD'yi doğru şekilde yapmanızı tavsiye ederim (demek istediğim ... benim yöntemim). Saçma sapan değer takdiri yapmanıza gerek yok!


Bu aslında aradığım cevaptı ve duymak istedim :) Çok teşekkür ederim!
Vishal

İşin garibi, "İnternete baktım ve bağlantıların çoğu SVD'yi hesaplamaya odaklandı, ancak kimse size bununla ne yapacağınızı söylemez." veya bu konuda, “SVD'yi işbirlikçi filtrelemede nasıl kullanırım?” diyor.
TenaliRaman 01:12

Evet ve cevabım işbirlikçi filtrelemede nasıl kullandığımı özetledi.
Stumpy Joe Pete

1
+1, anladığım kadarıyla, düşük dereceli matrisi SVD kullanarak hesaplamıyorsunuz, ancak kare hatasını en aza indirmek için yinelemeli bir yöntem değil mi? Bununla birlikte, eğer SVD kullanmak istersem, matris faktörizasyonunu yapmadan önce eksik girişleri bazı değerlerle doldurmam gerekir, değil mi?
avokado

1
svd()

14

Kimsenin size ne yapması gerektiğini söylememesi, SVD'nin ne yaptığını biliyorsanız, onunla ne yapacağınız biraz açıktır.

Satırlarınız ve sütunlarınız aynı küme olduğundan, bunu farklı bir A matrisi ile açıklayacağım. A matrisi A satırları kullanıcılar olacak ve sütunlar kullanıcının sevdiği öğeler olsun. Bu matrisin simetrik olması gerekmediğine dikkat edin, ancak sizin durumunuzda, simetrik olduğu ortaya çıkıyor. SVD'yi düşünmenin bir yolu aşağıdaki gibidir: SVD, beğendiği kullanıcıların ve öğelerin yakından hizalanmış özellik vektörlerine sahip olduğu gizli bir özellik alanı bulur.

bir=UxsxVUV

Şimdi, size aynı özellik uzayından iki vektör verir ve benzer olup olmadıklarını bulmanızı istersem, bunu başarmak için düşünebileceğiniz en basit şey nedir? Nokta ürün.

benjbenUj


İki soru: 1) SVD'yi çalıştırmadan önce eksik değerleri sıfır (i kullanıcı tarafından incelenmeyen j maddesi) ile dolduruyor musunuz? 2) Yeni bir kullanıcının j maddesini beğenip beğenmeyeceğini nasıl hesaplarsınız?
B_Miner

1
@B_Miner Merhaba, gecikmiş cevap için özür dilerim. Cevaplar: 1) Evet, evet, SVD'yi çalıştırmadan önce genellikle eksik olan değerleri sıfır ile doldururuz. Ancak, genellikle sıfır olmayan bir derecelendirmeyle doldurmanızı tavsiye ederim - örneğin, eksik değerleri kullanıcının şimdiye kadar vermiş olduğu ortalama derecelendirmeye göre doldurabilirsiniz. 2) SVD tabanlı yaklaşım yalnızca bilinen kullanıcılar ve bilinen öğeler içindir. Yeni kullanıcıları veya yeni öğeleri yönetemez. Ve eğer yeni bir kullanıcı gelirse, bu çerçevede onun hakkında hiçbir şey bilmiyoruz.
TenaliRaman

1
@B_Miner Yeni kullanıcılar / öğelerle çalışmak istiyorsanız, bazı kullanıcı özelliklerine ve öğe özelliklerine erişimimiz olduğunu varsaymalıyız. Ardından, PDLF (Predictive Discrete Latent Factor model) gibi daha sofistike bir model kullanabilirsiniz. Bu, bilinen bir özellik alanıyla çalıştığı için yeni kullanıcılar / öğeler kullanmanıza izin verecektir.
TenaliRaman

@TenaliRaman Bunu göreceğinizden emin değilim, ama işte gidiyor. Bu yüzden, okudukları belgelere dayanarak kullanıcılar için (tam anlamıyla kullanıcılar) özellikler oluşturmak için konu modellerini (LDA) kullanıyorum. Sadece "kullanıcı-konu vektörü" almak için konu vektörlerini ortalamalandırıyorum. SVD ile (veya muhtemelen ALS ile) benzer bir şey yapmak istiyorum. Diyelim ki, bilinen kullanıcı öğesi verilerini kullanarak SVD'yi hesapladım ve sonra bilinen birkaç öğeyi "ziyaret eden" yeni kullanıcılarım var. Bu durumda, madde vektörleri bilinmektedir, fakat kullanıcı vektörleri bilinmemektedir. Kullanıcı vektörünü hesaplamak için madde vektörlerini kullanabilir miyim yoksa tüm verileri kullanarak tekrar SVD'yi hesaplamalı mıyım?
thecity2

büyük cevap tenali. kavramı anlamak için çok yararlı
Nihal

3

Bu, seyrek SVD önerilerini pratikte uygulamak ya da ayrıntılar için kaynak kodunu incelemek isteyenler için sorunun "nasıl yapıldığını " denemek ve cevaplamaktır . Seyrek SVD'yi modellemek için kullanıma hazır bir FOSS yazılımı kullanabilirsiniz. Örneğin vowpal wabbit, libFMya da redsvd.

vowpal wabbit"SVD benzeri" algoritmaların 3 uygulaması vardır (her biri 3 komut satırı seçeneğinden biri tarafından seçilebilir). Şüphesiz bunlar, saf "klasik" SVD "den ziyade" yaklaşık, yinelemeli, matris çarpanlaştırılması "olarak adlandırılmalıdır, ancak bunlar SVD ile yakından ilişkilidir. sıfırlar) matris.

İşte Netflix tarzı film önerileri vowpal wabbitve --lrqbenim için en iyi sonuç veren "düşük dereceli ikinci dereceden" ( ) seçeneğiyle yapmak için tam bir çalışma tarifi :

Veri kümesi formatı dosyası ratings.vw(kullanıcı ve film tarafından bir satırdaki her derecelendirme):

5 |user 1 |movie 37
3 |user 2 |movie 1019
4 |user 1 |movie 25
1 |user 3 |movie 238
...

1'inci sayı (1 ile 5 yıldız arasında), ardından derecelendiren kullanıcının kimliği ve derecelendirilen film kimliği.

Test verileri aynı biçimdedir ancak (isteğe bağlı olarak) derecelendirme sütununu atlayabilir:

 |user 1 |movie 234
 |user 12 |movie 1019
...

isteğe bağlı olarak tahminleri değerlendirmek / test etmek için tahminleri karşılaştırmak için derecelendirmelere ihtiyacımız var. Derecelendirmeleri ihmal edersek vowpal wabbit, yine de derecelendirmeleri tahmin eder ancak tahmin hatasını tahmin edemez (tahmin edilen değerler ve verilerdeki gerçek değerler).

Sormak eğitmek vowpal wabbitbir dizi bulmak için Nonlar gibi (veya beğenmemek) kullanıcıları ve filmler arasındaki gizli etkileşim faktörlerinin. Bunu, benzer kullanıcıların bir film alt kümesini benzer şekilde derecelendirdiği ortak temalar bulmak ve bir kullanıcının henüz derecelendirmediği bir filmi nasıl derecelendireceğini tahmin etmek için bu ortak temaları kullanmak olarak düşünebilirsiniz .

vw kullanmamız gereken seçenekler ve argümanlar:

  • --lrq <x><y><N> "düşük dereceli ikinci dereceden" gizli faktörleri bulur.
  • <x><y>: "um", veri kümesindeki kullanıcıları ve m [ovie] ad alanlarını aşmak anlamına gelir. Her ad boşluğunda yalnızca 1. harfin --lrqseçenekle birlikte kullanıldığını unutmayın .
  • <N>: N=14aşağıda bulmak istediğimiz gizli faktörlerin sayısı
  • -f model_filename: son modeli yaz model_filename

Yani basit bir tam eğitim komutu olacaktır:

    vw --lrq um14 -d ratings.vw -f ratings.model

ratings.modelModel dosyasına sahip olduktan sonra , yeni bir veri setindeki ek derecelendirmeleri tahmin etmek için kullanabiliriz more_ratings.vw:

    vw -i ratings.model -d more_ratings.vw -p more_ratings.predicted

Tahminler dosyaya yazılacaktır more_ratings.predicted.

Kaynak ağacında kullanarak demo/movielens, 14 gizli faktörle (SVD orta matrisinin bir 14x14 satır x sütun matrisi olduğu anlamına gelir) ve bağımsız test üzerinde test vowpalwabbitedildikten sonra 1 milyon kullanıcı / film değerlendirmesiyle ~ 0.693 MAE (Ortalama Mutlak Hata) ml-1m.ratings.train.vwalıyorum test seti ml-1m.ratings.test.vw. 0,69 MAE ne kadar iyi? Tümleşik tahmin (0) durumu [0 - 5] dahil, olası tahminlerin tümü için, 0.69 hatası, tüm aralığın ~% 13.8'i (0.69 / 5.0), yani yaklaşık% 86.2 doğruluktur (1 - 0.138).

Benzer bir veri seti (movielens) için github'daki vowpal wabbitkaynak ağacında dokümantasyon içeren örnekler ve tam demo bulabilirsiniz :

Notlar:

  • movielensDemo benim örnekten (basitlik için) atlanmıştır çeşitli seçenekler kullanır: özellikle --loss_function quantile, --adaptiveve--invariant
  • --lrqİçinde uygulanması vwçok daha hızlı daha --rankdepolamak ve modelleri yüklerken özellikle.

Kredi:

  • --rank vw seçeneği Jake Hofman tarafından uygulandı
  • --lrq vw seçeneği (isteğe bağlı bırakma ile) Paul Minero tarafından uygulandı
  • vowpal wabbit (aka vw), John Langford'un beyin çocuğudur

1

İsmin SVDyanıltıcı olduğunu söyleyebilirim . Aslında, SVDöneri sistemindeki yöntem doğrudan SVD faktoringini kullanmaz. Bunun yerine önyargıları ve faktör vektörlerini eğitmek için stokastik degrade inişini kullanır.

Tavsiye sistemi için SVDve SVD++algoritmalarının detayları Bölümlerde 5.3.1ve 5.3.2kitabın içinde bulunabilir Francesco Ricci, Lior Rokach, Bracha Shapira, and Paul B. Kantor. Recommender Systems Handbook. 1st edition, 2010.

Python'da, bu algoritmaları adı verilen uygulanmış köklü bir paket var surprise. Onun içinde dokümantasyon , onlar da bu algoritmaların ayrıntıları söz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.