kNN z dużymi rzadkimi macierzami w Pythonie
Mam dwie duże macierze rzadkie:
In [3]: trainX
Out[3]:
<6034195x755258 sparse matrix of type '<type 'numpy.float64'>'
with 286674296 stored elements in Compressed Sparse Row format>
In [4]: testX
Out[4]:
<2013337x755258 sparse matrix of type '<type 'numpy.float64'>'
with 95423596 stored elements in Compressed Sparse Row format>
Łącznie około 5 GB pamięci RAM. Zauważ, że te macierze są WYSOKIE rzadkie (0,0062% zajęte).
Dla każdego rzędu wtestX
, Chcę znaleźć Najbliższy sąsiad wtrainX
i zwróć odpowiednią etykietę, znalezioną wtrainY
. trainY
to lista o tej samej długości cotrainX
i ma wiele wielu klas. (Klasa składa się z 1-5 oddzielnych etykiet, każda etykieta to jedna z 20 000, ale liczba klas nie ma znaczenia dla tego, co próbuję teraz zrobić).
ja używamsklearn
algorytm KNN:
from sklearn import neighbors
clf = neighbors.KNeighborsClassifier(n_neighbors=1)
clf.fit(trainX, trainY)
clf.predict(testX[0])
Nawet przewidywanie 1 przedmiotutestX
zajmuje trochę czasu (tj. około 30-60 sekund, ale jeśli pomnożysz przez 2 miliony, stanie się to prawie niemożliwe). Mój laptop z 16 GB pamięci RAM zaczyna się nieco wymieniać, ale udaje mu się ukończyć za 1 elementtestX
.
Moje pytania brzmią: jak mogę to zrobić, aby zakończyło się w rozsądnym czasie? Powiedz jedną noc na dużej instancji EC2? Czy posiadanie większej ilości pamięci RAM i uniemożliwianie wymiany przyspieszy to wystarczająco szybko (domyślam się, że nie). Może mogę w jakiś sposób wykorzystać rzadkość, aby przyspieszyć obliczenia?
Dziękuję Ci.