Разреженные и плотные векторы PySpark

Как я могу узнать, следует ли мне использовать разреженное или плотное представление в PySpark? Я понимаю различия между ними (разреженный экономит память, сохраняя только ненулевые индексы и значения), но с точки зрения производительности, существуют ли какие-либо общие эвристики, которые описывают, когда использовать разреженные векторы над плотными?

Существует ли общий размер отсечения и процент значений 0, после которого обычно лучше использовать разреженные векторы? Если нет, как я должен идти о принятии решения? Благодарю.

1 ответ

Решение

Важно помнить, что pyspark.ml.linalg.Vector а также pyspark.mllib.linalg.Vector просто слой совместимости между Python и Java API. Есть не полнофункциональные или оптимизированные утилиты линейной алгебры, и вы не должны использовать их как таковые. Доступные операции либо не предназначены для повышения производительности, либо просто конвертируются в стандартный массив NumPy под крышками.

При использовании с другими ml / mllib инструменты будут сериализованы и преобразованы в эквиваленты Java, поэтому производительность представления Python в основном не имеет значения.

Это означает, что самая большая реальная проблема - хранение, и простое правило:

  • Если в среднем половина записей равна нулю, лучше использовать SparseVector,
  • В противном случае лучше использовать DenseVector,
Другие вопросы по тегам