2014-12-03 8 views
5

Chcę zgrupować zbiór danych (600000 obserwacji), a dla każdego klastra chcę uzyskać główne komponenty. Moje wektory składają się z jednej wiadomości e-mail i 30 zmiennych jakościowych. Każda zmienna ilościowa ma 4 klasy: 0,1,2 i 3.R, problem z hierarchicznym grupowaniem po wielokrotnej analizie korespondencji

Więc pierwszą rzeczą, którą robię jest załadowanie FactoMineR biblioteki i załadować moje dane:

library(FactoMineR) 
mydata = read.csv("/home/tom/Desktop/ACM/acm.csv") 

Wtedy jestem moje ustawienie zmiennych jako jakościowy (jestem wyjątkiem zmiennej „e-mail” chociaż):

for(n in 1:length(mydata)){mydata[[n]] <- factor(mydata[[n]])} 

jestem usunięcie wiadomości z moich wektorów:

mydata2 = mydata[2:31] 

I biegnę do MCA w tym nowym zbiorze:

mca.res <- MCA(mydata2) 

teraz chcę klastra mój zestaw danych za pomocą funkcji hcpc:

res.hcpc <- HCPC(mca.res) 

Ale mam następujący komunikat o błędzie:

Error: cannot allocate vector of size 1296.0 Gb 

Co według ciebie powinienem zrobić? Czy mój zbiór danych jest za duży? Czy używam dobrze funkcji hcpc?

+0

Udało mi się powielić problem za pomocą fikcyjnego zestawu danych. Myślę, że używasz HCPC we właściwy sposób, a także MCA. Myślę, że możesz chcieć przyjrzeć się algorytmom rzadkiej klastrowania, ponieważ HCPC jest oparty na agnes. CLARA może być przydatna, ale inne są dostępne. –

Odpowiedz

0

Ten komunikat o błędzie zazwyczaj oznacza, że ​​R ma za mało pamięci RAM do wykonania polecenia. Zgaduję, że używasz tego w 32-bitowej R, prawdopodobnie pod Windows? Jeśli jest to sprawa, następnie zabija inne procesy i usuwanie nieużywanych zmiennych R może ewentualnie pomóc, na przykład, można spróbować usunąć mydata, mydata2 z

rm(mydata, mydata2) 

(jak również wszystkich innych niekoniecznych zmiennych R) przed wykonaniem polecenia, które generuje błąd. Jednak najlepszym rozwiązaniem jest generalnie taka, aby przełączyć się na 64-bitowe R, korzystnie w 64-bitowym Linux i godnej ilość pamięci RAM, a także zobaczyć na:

R memory management/cannot allocate vector of size n Mb

R Memory Allocation "Error: cannot allocate vector of size 75.1 Mb"

http://r.789695.n4.nabble.com/Error-cannot-allocate-vector-of-size-td3629384.html

+0

Powieliłem ten problem na 64-bitowej maszynie Linux z 32-bitowym ram i 12 rdzeniami, to tylko duży problem z danymi, a nie 32-bitowy. –

+0

1296.0 Gb wydaje się naprawdę duże. –

+0

@FMKerckhof Używam ubuntu na 64-bitowym R. Więc twoim celem jest to, że nic nie mogę zrobić? – woshitom

5

Ponieważ używa hierarchiczne klastrowanie, HCPC musi obliczyć dolny trójkąt matrycy odległości 600000 x 600000 (~ 180 miliardów elementów). Po prostu nie masz pamięci RAM do przechowywania tego obiektu, a nawet gdyby tak było, obliczenie zajęłoby wiele godzin, jeśli nie dni.

Odbyło się wiele dyskusji na temat przepełnienia stosu/Cross Validated na grupowanie dużych zbiorów danych; niektóre z rozwiązań w dziedzinie badań obejmują:

k-means clustering in R on very large, sparse matrix? (bigkmeans)

Cluster Big Data in R and Is Sampling Relevant? (clara)

Jeśli chcesz skorzystać z jednej z tych alternatywnych rozwiązań klastrowych, należy zastosować go do mca.res$ind$coord w swoim przykładzie.

Innym pomysłem, sugerowanym w odpowiedzi na problem clustering very large dataset in R, jest pierwsze użycie k oznacza znalezienie określonej liczby centrów klastra, a następnie użycie hierarchicznego klastrowania do zbudowania drzewa z tego miejsca. Ta metoda jest faktycznie zaimplementowana za pomocą argumentuz HCPC.

Na przykład, korzystając z danych tea ustawionych FactoMineR:

library(FactoMineR) 
data(tea) 
## run MCA as in ?MCA 
res.mca <- MCA(tea, quanti.sup = 19, quali.sup = c(20:36), graph = FALSE) 
## run HCPC for all 300 individuals 
hc <- HCPC(res.mca, kk = Inf, consol = FALSE) 
## run HCPC from 30 k means centres 
res.consol <- NULL ## bug work-around 
hc2 <- HCPC(res.mca, kk = 30, consol = FALSE) 

consol Argument oferuje możliwość konsolidacji klastrów z wykorzystaniem hierarchicznego grupowania k-średnich; ta opcja nie jest dostępna, gdy kk jest ustawiona na rzeczywistą liczbę, dlatego consol jest tutaj ustawione na FALSE. Obiekt res.consul jest ustawiony na NULL w celu obejścia drobnego błędu w FactoMineR 1.27.

Poniższy działka przedstawiają klastry oparte na 300 osób (kk = Inf) oraz w oparciu o 30 k oznacza ośrodki (kk = 30) danych kreślone na pierwsze dwa MCA osiach:

enter image description here

To widać, że wyniki są bardzo podobne. Powinieneś być w stanie łatwo zastosować to do swoich danych z 600 lub 1000 k oznacza centra, może nawet do 6000 z 8 GB pamięci RAM. Jeśli chcesz użyć większej liczby, prawdopodobnie zechcesz zakodować bardziej wydajną wersję, używając bigkmeans, SpatialTools::dist1 i fastcluster::hclust.

Powiązane problemy