Создание (и доступ) к разреженной матрице с записями NA по умолчанию

Узнав о параметрах для работы с разреженными матрицами в R, я хотите использовать пакет Matrix для создания разреженной матрицы из следующий фрейм данных, а все остальные элементы должны быть NA.

     s    r d
1 1089 3772 1
2 1109  190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109   38 7

Я знаю, что могу создать разреженную матрицу со следующим доступом к элементам, как обычно:

> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0

но если я хочу, чтобы значение по умолчанию было NA, я попробовал следующее:

  M <- Matrix(NA,max(s),max(r),sparse=TRUE)
  for (i in 1:nrow(X))
    M[s[i],r[i]] <- d[i]

и получил эту ошибку

Error in checkSlotAssignment(object, name, value) : 
  assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE

Мало того, я считаю, что доступ к элементам занимает гораздо больше времени.

> system.time(Y[3,3])
   user  system elapsed 
  0.000   0.000   0.003 
> system.time(M[3,3])
   user  system elapsed 
  0.660   0.032   0.995 

Как я должен создавать эту матрицу? Почему с одной матрицей работать намного медленнее?

Вот фрагмент кода для приведенных выше данных:

X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772, 
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s", 
"r", "d"), row.names = c(NA, 6L), class = "data.frame")

person Christopher DuBois    schedule 13.08.2009    source источник


Ответы (2)


Да, ответ Тьерри определенно верен, что я могу сказать как соавтор пакета "Матрица"...

На другой ваш вопрос: почему доступ к «M» медленнее, чем к «Y»? Основной ответ заключается в том, что «M» намного разрежен, чем «Y», следовательно, намного меньше и - в зависимости от вовлеченных размеров и оперативной памяти вашей платформы - время доступа быстрее для гораздо меньших объектов, особенно для их индексации. .

person Martin Mächler    schedule 24.08.2009
comment
Спасибо! Я с нетерпением жду ваших ответов на StackOverflow. Я постараюсь ответить на некоторые вопросы, которые у меня возникали при использовании Matrix... - person Christopher DuBois; 24.08.2009
comment
Очень жаль, что всегда сохраняются все ненулевые ячейки. Было бы неплохо иметь возможность указать значение по умолчанию, отличное от нуля, для sparseMatrix. - person Quantum7; 06.05.2010
comment
Я думаю о том, есть ли значение по умолчанию для sparseMatrix? - person hs3180; 26.04.2014
comment
Я согласен с @Quantum7: например, в науках о жизни 0 не всегда означает отсутствие информации. Попарное сходство 0 между двумя объектами несет информацию о том, что они не похожи. В то время как NA означает, что мы просто не знаем, насколько они похожи (часто имеет место в биологических данных). Было бы разумно не выравнивать автоматически 0==missing и позволить пользователю передать желаемое значение по умолчанию (например, NA). С точки зрения улучшения памяти это должно быть то, что чаще всего встречается в наборе данных. На мой взгляд, это ограничение вашей реализации, а не общая вещь. - person derwiwie; 09.08.2016

Почему вам нужны значения NA по умолчанию? Насколько я знаю, матрицы разрежены только в том случае, если они имеют нулевые ячейки. Поскольку NA не равно нулю, вы теряете все преимущества разреженной матрицы. Классическая матрица еще более эффективна, если в ней почти нет нулей. Классическая матрица похожа на вектор, который будет обрезан в соответствии с размерами. Таким образом, он должен хранить только вектор данных и размеры. Разреженная матрица хранит только ненулевые значения, но также хранит их местоположение. Это преимущество тогда и только тогда, когда у вас достаточно нулевых значений.

person Thierry    schedule 13.08.2009
comment
Но если мое значение по умолчанию равно 1, то, безусловно, у вас просто есть 1 дополнительный бит информации для хранения, то есть значение по умолчанию равно 1 вместо предполагаемого 0. Я по-прежнему сохраняю значения, отличные от значений по умолчанию, как вы делаете в примере с 0, но предпосылка такова. гораздо более общее. - person adunaic; 30.09.2014
comment
Это преимущество тогда и только тогда, когда у вас достаточно нулевых значений.: Просто неверно. Замените каждое вхождение нуля в вашем комментарии на одно или любое другое число, и вы увидите, что ваше предложение остается в силе. Тот факт, что ноль используется просто по соглашению, и во многих приложениях имеет смысл использовать значения по умолчанию, отличные от нуля. С точки зрения экономии памяти имеет смысл установить в качестве значения по умолчанию число, которое чаще всего встречается в вашем наборе данных. - person derwiwie; 09.08.2016