2015-04-25 6 views
6

Napotkałem problem "podobieństwa wszystkich par" w moim systemie rekomendacji. Dzięki this databricks blog wygląda na to, że usługa RowMatrix może pomóc.iskra - jak mogę odzyskać parę przedmiotów po obliczeniu podobieństwa za pomocą RowMatrix

Jednak RowMatrix to rodzaj macierzy bez znaczących indeksów wierszy, a tym samym nie wiem jak pobrać wynik podobieństwa po wywołaniu columnSimilarities(threshold) dla określonej pozycji I i J

Poniżej kilka szczegółów o tym, co ja robie:

1) Mój plik danych pochodzi z Movielens w formacie jak poniżej:

user::item::rating 

2) I zbudowania RowMatrix w którym każdy rzadki wektor i reprezentuje ratingi wszystkich użytkowników do tej pozycji i

val dataPath = ... 
val ratings: RDD[Rating] = sc.textFile(dataPath).map(_.split("::") match { 
    case Array(user, item, rate) => Rating(user.toInt, item.toInt, rate.toDouble) 
}) 
val rows = ratings.map(rating=>(rating.product, (rating.user, rating.rating))) 
    .groupByKey() 
    .map(p => Vectors.sparse(userAmount, p._2.map(r=>(r._1-1, r._2)).toSeq)) 

val mat = new RowMatrix(rows) 

val similarities = mat.columnSimilarities(0.5) 

Teraz dostać CoordinateMatrix similarities. Jak mogę uzyskać podobieństwo określonego elementu i j? Mimo że można go użyć do pobrania numeru RDD[MatrixEntry], nie jestem pewien, czy wiersz i kolumna j odpowiadają elementowi i i i j.

Odpowiedz

9

Napotkałem ten sam problem co Ty i rozwiązałem go w następujący sposób.

  1. Należy zauważyć, że kolumna Podobieństwa() to wywołanie podobieństwa wektorów kolumn. Jednak nasze "rzędy" zawsze składają się z wektorów wierszowych. Powinieneś więc uzyskać transpozycję "wierszy", załóżmy, że jest to "tran_rows". Następnie obliczyć tran_rows.columnSimilarities()

  2. rzecz jest prosta. W wyniku columnSimilarities(), indeks i oraz dokładnie odpowiadają pozycjom i pozycji j.

+0

Ograniczeniem jest to, że kolumna. Podobieństwa() zwracają górną trójkątną współrzędną koordynacyjną, więc tylko jedna z pozycji (i, j) lub (j, i) istnieje w pozycjach. Który z nich zależy od tego, czy i harthur

1

The RowMatrix może obliczyć podobieństwo między kolumnami. Tak, że trzeba zrewidować swoje podejście do budowania ratings.map(rating=>(rating.user, (rating.product, rating.rating))).groupByKey() (W związku z powyższym oraz następujące linie)

Wtedy będziesz mieć identyfikatory produktów w kolumnach i można powołać columnSimilarities().entries odzyskać product-from,product-to,score strukturę.

Jeśli masz duże wartości w identyfikatorze produktu, prawdopodobnie będziesz musiał odwzorować swoje wartości na wartości sztucznych indeksów. Na przykład. jeśli masz 3 produkty z identyfikatorami: 1, 900000, 9000000, musisz mapować je na 0,1,2, a następnie obliczyć podobieństwa. Bez tego mapowania obliczysz podobieństwa między produktami 0-9000000, nawet jeśli nie masz ich zbyt wielu.

1

Jeśli próg nie jest tak pożądany w twoim przypadku, możesz użyć kolumn Różnice na IndexedRowMatrix. To działa bardzo dobrze. W ten sposób masz lepszy sposób zarządzania indeksami wierszy.

Powiązane problemy