2016-05-14 1 views
-2
library(Matrix) 
a<-data.frame(1:1000) 
object.size(a) 
    4672 bytes 

b<-as.matrix(a) 
object.size(b) 
    4464 bytes 

d<-as(b,'dgCMatrix') 
object.size(d) 
    13520 bytes 

e<-Matrix(b, sparse = TRUE) 
object.size(e) 
13520 bytes 

Может ли кто-нибудь сказать мне, почему размер моего кадра данных увеличивается, когда я преобразовал его в разреженную матрицу?Преобразование фрейма данных в разреженную матрицу в три раза больше его размера

Редкое преобразование матрицы становится бесполезным, если в нашем кадре данных нет или меньше нулей? Я хочу, чтобы матрица попала в xgboost.

Можете ли вы рассказать мне какие-либо другие трюки с сохранением памяти, поскольку в этом случае неудачное преобразование матрицы оказывается неудачным? пожалуйста, направляйте

+1

Насколько я знаю, 'редкая матрица' сохраняет память только тогда, когда она разрежена? Матрица, очевидно, представляет собой плотную матрицу, как бы вы ожидали, что она сохранит память для вас? – Psidom

+0

@Psidom абсолютно прав; и если вы ищете способы сжатия плотной матрицы: такие методы существуют во многих случаях, но это сложная тема. Их применимость зависит от контекста, т. Е. От использования данных в матрице. Популярным примером является сжатие файлов изображений. – RHertel

ответ

2

Редкие матрицы - по определению - матрицы, в которых большая часть записей равна нулю. В случае больших и разреженных матриц вычислительные ресурсы с точки зрения времени вычисления и требований к памяти могут быть значительно уменьшены путем представления данных в сжатой схеме.

Широко используемая и относительно простой разреженной схемы сжатия матрицы состоит в представлении матрицы в виде трех векторов:

  • один вектор содержит значение всех ненулевых элементов в матрице.
  • Два дополнительных вектора содержат индекс строки и столбца, соответственно, тем самым определяя положение в матрице ненулевых значений, перечисленных в первом векторе.

Используя такие схемы сжатия, можно избежать хранения множества нулей. Более того, с этими представлениями можно пропустить несколько нескольких бесполезных числовых операций, таких как временные умножения с нулем. Поэтому разреженные схемы сжатия матрицы очень мощные , если матрица достаточно большая и разреженная.

Однако применение метода разреженной матрицы сжатия к плотной матрице не имеет смысла. Причина в том, что первый вектор имеет по существу размер исходной матрицы. Кроме того, существуют два целых вектора одинакового размера. Это согласуется с вашим наблюдением, что общий размер примерно в три раза.