Разреженные и плотные векторы PySpark
Как я могу узнать, следует ли мне использовать разреженное или плотное представление в PySpark? Я понимаю различия между ними (разреженный экономит память, сохраняя только ненулевые индексы и значения), но с точки зрения производительности, существуют ли какие-либо общие эвристики, которые описывают, когда использовать разреженные векторы над плотными?
Существует ли общий размер отсечения и процент значений 0, после которого обычно лучше использовать разреженные векторы? Если нет, как я должен идти о принятии решения? Благодарю.
1 ответ
Важно помнить, что pyspark.ml.linalg.Vector
а также pyspark.mllib.linalg.Vector
просто слой совместимости между Python и Java API. Есть не полнофункциональные или оптимизированные утилиты линейной алгебры, и вы не должны использовать их как таковые. Доступные операции либо не предназначены для повышения производительности, либо просто конвертируются в стандартный массив NumPy под крышками.
При использовании с другими ml
/ mllib
инструменты будут сериализованы и преобразованы в эквиваленты Java, поэтому производительность представления Python в основном не имеет значения.
Это означает, что самая большая реальная проблема - хранение, и простое правило:
- Если в среднем половина записей равна нулю, лучше использовать
SparseVector
, - В противном случае лучше использовать
DenseVector
,