В настоящее время я пытаюсь выполнить кластеризацию k-средних из mlpack, масштабируемой библиотеки машинного обучения.
Но когда я выполню bin/kmeans
в командной строке я всегда получаю сообщение об ошибке.
error: arma::memory::acquire(): out of memory
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Размер входного файла составляет 7,4 ГБ.
Есть ли у вас предложения? Знаете ли вы альтернативные инструменты, которые могут быть применимы к большому набору данных?
Здесь нет действительно простого решения для точного ответа. Проблема в том, что Armadillo (базовая матричная библиотека) не может выделить достаточно места для ваших входных данных.
По большей части mlpack более консервативен с оперативной памятью, чем другие инструменты, такие как MATLAB или R, но, похоже, ваш набор данных достаточно велик, чтобы ваши возможности (за исключением получения системы с большим объемом оперативной памяти, как предлагал Керрек) ограничены.
Многие стратегии для ускорения k-средних включают выборку входного набора данных и запуск k-средних в подмножестве входных точек. Поскольку k-means очень чувствителен к начальным центроидам, которые он дает, эта стратегия выборки часто используется для выбора начальных центроидов. См. Брэдли и Файяд, 1998: ftp://www.ece.lsu.edu/pub/aravena/ee7000FDI/Presentations/Clustering-Pallavi/Ref4_k-means.pdf
В вашем случае, возможно, проще и достаточно точно просто запустить k-means для подмножества ваших данных, которые можно загрузить в оперативную память, и принять их в качестве центроидов вашего кластера. Если k достаточно мало и число точек в вашем наборе данных велико (то есть число кластеров намного меньше, чем количество точек), то это должен быть разумный подход и, безусловно, более простой подход, чем изменение код mlpack должен быть еще более консервативным с оперативной памятью или написанием собственной программы для использования mmap () или чего-то еще, и дешевле, чем покупка новой оперативной памяти.