Вы занимаетесь тематической классификацией текстов (например, сортируете объявления пользователей по категориям). У вас есть коллекция из 100000 текстов, в которой содержится 10000 уникальных токенов (это размер словаря). Вы хотите построить матрицу признаков для текстов в вашем датасете, чтобы затем обучить логистическую регрессию.
Построив матрицу, вы обнаруживаете, что 99.5% значений матрицы - нулевые.
Если бы вы хранили датасет в плотной матрице (например, np.array), то вам бы потребовалось достаточно много памяти (каждое значение признака занимает 4 байта, тип np.float32):
dense=|texts|×|vocab|×4bytes=4⋅109bytes≈3814.7Megabytesdense=|texts|×|vocab|×4bytes=4⋅109bytes≈3814.7Megabytesdense = |texts| \times |vocab| \times 4bytes = 4 \cdot 10^9 bytes \approx 3814.7Megabytes - здесь мы считаем, что в мегабайте 1024 килобайт, в килобайте - 1024 байт.
Вместо этого вы решаете хранить датасет в разреженной матрице в формате COO (coordinate, scipy.sparse.coo_matrix). В этом формате для каждого ненулевого элемента хранится три числа: значение элемента, номер столбца и номер строки. Для хранения координат используется тип np.uint32, 4 байта на каждое значение.
Оцените количество памяти, которое экономится при использовании разреженной матрицы для хранения датасета.

  • sparse = |texts| x |vocab| x (4bytes) x 0.995 = 3.98 * 10^9 bytes SavedMemory = (sparse - dense)/bytes_in_megabyte ~ 19Megabytes
  • sparse = |texts| x |vocab| x (4bytes+4bytes+4bytes) x 0.005 = 6 * 10^7 bytes SavedMemory = (dense- sparse)/bytes_in_megabyte ~ 3757.5 Megabytes
  • sparse = |texts| x |vocab| x (4bytes+4bytes+4bytes) x 0.995 = 1.194 * 10^{10} bytes SavedMemory = (sparse - dense)/bytes_in_megabyte ~ 7572.1Megabytes
  • sparse = |texts| x |vocab| x 4bytes x 0.005 =2 * 10^7 bytes SavedMemory = (dense - sparse)/bytes_in_megabyte ~ 3795.6 Megabytes
Для просмотра статистики ответов нужно залогиниться.