Jak zrobić zmniejszenie wymiarów w R.

28

Mam macierz, w której (i, j) mówi mi, ile razy przeglądałem stronę j. Istnieje 27 000 osób i 95 000 stron. Chciałbym mieć garść „wymiarów” lub „aspektów” w przestrzeni stron, które odpowiadałyby zestawom stron często oglądanych razem. Moim ostatecznym celem jest wtedy, aby móc obliczyć, jak często przeglądałem strony, które mieszczą się w wymiarze 1, wymiarze 2 itd.

Przeczytałem dokumentację R dotyczącą analizy głównych składników i dekompozycji pojedynczej wartości i wykonałem te polecenia, ale nie jestem pewien, jak postępować.

Jak mogę użyć do tego redukcji wymiarowości? Czy jest to naprawdę problem klastrowania i powinienem raczej przyjrzeć się algorytmom klastrowania?

Wielkie dzięki za wszelkie informacje ~ l

Laramichaels
źródło

Odpowiedzi:

10

Załóżmy, że mat_pages [] zawiera strony w kolumnach (które chcesz zgrupować) i poszczególne osoby w wierszach. Możesz grupować strony w oparciu o indywidualne dane w Rby, używając następującego polecenia:

  pc <- prcomp(x=mat_pages,center=TRUE,scale=TRUE)

Macierz ładunków jest macierzą wektorów własnych rozkładu SVD danych. Podają względną wagę każdej STRONY przy obliczaniu wyników. Obciążenia o większych wartościach bezwzględnych mają większy wpływ na ustalenie wyniku dla odpowiedniej składowej zasady.

Powinienem jednak również zwrócić uwagę na niedociągnięcia związane z używaniem PCA do grupowania stron. Powodem tego jest to, że obciążenia nadają STRONY większym wagom z większą zmiennością, niezależnie od tego, czy ta zmiana jest faktycznie spowodowana zawartością STRONY, czy z innego powodu (może to być zmiana techniczna lub indywidualna). Ładunki niekoniecznie odzwierciedlają prawdziwe różnice między grupami, które (być może) są twoim głównym zainteresowaniem. ALE, to grupowanie naprawdę odzwierciedla różnice w grupie przy założeniu, że wszystkie strony mają tę samą wariancję (nie wiem, czy jest to prawidłowe założenie).

Jeśli masz potężne możliwości obliczeniowe (co może być możliwe z uwagi na rozmiar danych) - dobrym pomysłem może być użycie modeli hierarchicznych. W R można to zrobić za pomocą pakietu lme4.


Co zrobić po uzyskaniu wyników?

Jest to przybliżona sugestia, a analiza zależy w dużej mierze od tego, jak wyglądają dane. Sądzę także, że ten proces byłby bardzo niewykonalny, aby zgrupować dane wielkości, które posiadasz.

pc.col <- paste("page", 1:27000, sep=".")

pdf("principle-components.pdf")
plot(pc$x[,1:2]) ## Just look at the 1st two loadings (as you can see the groupings in a plane)
dev.off()

Mamy nadzieję, że da to obraz, w jaki sposób dane są pogrupowane.

Ostrzeżenie: nie to poleciłbym.


Moja rekomendacja:

Takie problemy często pojawiają się w genomice. W twoim przypadku strony odpowiadają genom, a jednostki odpowiadają pacjentom (w zasadzie jednostki mają takie samo znaczenie jak w genomice)

Chcesz grupować strony na podstawie danych.

Możesz użyć wielu pakietów klastrowych w R i zostały wskazane w innych odpowiedziach. Podstawowym problemem związanym z pakietami jest to, jak hclust polega na tym, jak określić liczbę klastrów. Kilka moich ulubionych to:

  • pvclust (Daje ci klastry, a także daje wartość p dla każdego klastra. Korzystając z wartości p, możesz określić statystycznie istotne klastry. Problem : wymaga dużej mocy obliczeniowej i nie jestem pewien, czy zadziała z danymi twojego rozmiar)
  • hopach (Podaje szacunkową liczbę klastrów i klastrów)
  • w Bioconductor są dostępne inne pakiety, sprawdź je w widoku zadań.

Możesz także użyć algorytmów grupowania, takich jak k-średnich itp. Jestem pewien, że widziałem na tym forum wątek dotyczący grupowania. Odpowiedzi były bardzo szczegółowe. Tal Galili zapytał mnie, czy dobrze pamiętam.

suncoolsu
źródło
@scocoolsu: wielkie dzięki! Właśnie zastosowałem się do twojej rady i uruchomiłem prcomp. Przechowałem również utworzoną przez siebie macierz obciążeń. Ale jak mogę użyć tej macierzy do grupowania stron?
laramichaels
Witaj Laramichaels, poniżej znajdź moją odpowiedź.
suncoolsu,
@ suncoolsu: Mam do czynienia z podobnym problemem, ale chcę „skupić” osoby, które mają tę samą „dynamikę” (w rzeczywistości mam ogromną liczbę szeregów czasowych na regiony i chcę je modelować). Myślałem o użyciu pam z odległością korelacji (1-rho). Czy to zalecany sposób? Czy możesz zasugerować kilka ścieżek do odkrycia?
teucer
@Musa .. Czy możesz być trochę jaśniejszy. Chyba nie rozumiem wspomnianej przez ciebie „dynamiki”. Zdecydowanie pam jest odpowiedni do tworzenia klastrów. Ale możesz także wypróbować pakiety R pvclust i hopach, o których wspomniałem. Ponadto SOM (mapy samoorganizujące się) to inny sposób patrzenia na klastrowanie. Więcej informacji można znaleźć w książce Ripley and Venable (2002) - MASS. Książka oferuje dokładne podejście do grupowania.
suncoolsu
@ suncoolsu: Przepraszam za kiepską recepturę! Mam 200 szeregów czasowych, które chcę modelować (tj. Symulować). Myślę, że mogę grupować „podobne” (tj. Zachowując to samo zachowanie w czasie: prostym podejściem jest użycie korelacji) szeregami czasowymi i symulować tylko szeregi czasowe w klastrze ...
teucer
4

Jest to z pewnością problem klastrowania. Sprawdź clusterpakiet Rs , aby uzyskać przegląd opcji algorytmów ( pami agnessą najlepszymi opcjami na początek; reprezentują dwa główne strumienie w grupowaniu - centroidy i hierarchiczne ).
Głównym problemem związanym z korzystaniem z klastrowania danych jest określenie dobrej miary podobieństwa między stronami; najprościej jest użyć odległości na Manhattanie; nieco bardziej skomplikowane, aby policzyć liczbę zwykłych widzów i znormalizować je, powiedzmy, średnią liczby widzów pierwszej i drugiej strony - to powinno wyciszyć efekty popularności.

EDYCJA: Ok, teraz widziałem rozmiar danych ... prawdopodobnie spowoduje wybuch R, ponieważ potrzebuje jednego trójkąta macierzy do odległości sklepowe. Sprawdź ten raport pod kątem możliwych rozwiązań.(number of pages)×(number of pages)

jan-glx
źródło
Poparłem twoją odpowiedź. Czy mógłbyś jednak podać nowe linki do raportu w ostatnim zdaniu? Stary nie żyje.
discipulus
1
Obawiam się, że zaginęła na zawsze ... Generalnie chodziło o implementacje metod klastrowania, które nie budują wprost macierzy podobieństwa dla każdego, ale badają obiekty na żądanie.
1

Redukcja wymiarów polega zasadniczo na zastosowaniu algorytmu grupowania do atrybutów (kolumn). Ze względu na dość duże wymiary zbioru danych, możesz spróbować użyć SOM (samoorganizującej się mapy / sieci Kohonen), aby utworzyć mapę dla osób lub stron. Następnie możesz sprawdzić, czy są to znaczące (interpretowalne) wzorce.


źródło
1

Jeśli robisz PCA, moja rada byłaby krótka kontrola innych komponentów niż tylko dwa pierwsze. Kiedy już będziesz mieć prcompobiekt pc(patrz post suncoolsu), możesz plot(pc)zobaczyć ilość wariancji przypisywanej różnym głównym składnikom. Można również łatwo wizualizować kilka (zwykle trzy lub cztery) z nich pairs(pc$x[,1:3])lub, używając lattice, splom(pc$x[,1:3]).

Laurent
źródło