кНН с большими разреженными матрицами в Python
У меня есть две большие разреженные матрицы:
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>
Всего около 5 ГБ ОЗУ для загрузки. Обратите внимание, что эти матрицы очень разрежены (занято 0,0062%).
Для каждого ряда вtestX
, Хочу найти Ближайший сосед вtrainX
и вернуть соответствующий ярлык, найденный вtrainY
. trainY
список такой же длины, какtrainX
и имеет много много классов. (Класс состоит из 1-5 отдельных меток, каждая метка - одна из 20 000, но количество классов не имеет отношения к тому, что я пытаюсь сделать прямо сейчас.)
Я используюsklearn
Алгоритм KNN для этого:
from sklearn import neighbors
clf = neighbors.KNeighborsClassifier(n_neighbors=1)
clf.fit(trainX, trainY)
clf.predict(testX[0])
Даже прогноз на 1 предметtestX
занимает какое-то время (то есть примерно 30-60 секунд, но если умножить на 2 миллиона, это станет практически невозможным). Мой ноутбук с 16 ГБ оперативной памяти начинает немного менять местами, но ему удается завершить 1 пункт вtestX
.
Мои вопросы: как я могу это сделать, чтобы он закончился в разумные сроки? Скажи одну ночь на большом экземпляре EC2? Было бы просто иметь больше оперативной памяти и предотвратить скорость обмена достаточно (я думаю, нет). Может быть, я могу как-то использовать разреженность, чтобы ускорить расчет?
Спасибо.