2017-01-08 1 views
1

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

TestMatrix = matrix(c(3,1,0,0,0,4,0,1,0,0,2,1,1,2,0,6,1,0,1,0,1,0,0,0,0),5,byrow = TRUE) 
TestSparseMatrix = Matrix(TestMatrix,sparse = TRUE) 
# Logarithmic function when applied to regular matrix 
-log(TestMatrix/rowSums(TestMatrix), 2) 


#Output 
#   [,1]  [,2]  [,3]  [,4] [,5] 
#[1,] 0.4150375 2.000000  Inf  Inf Inf 
#[2,] 0.3219281  Inf 2.321928  Inf Inf 
#[3,] 1.5849625 2.584963 2.584963 1.584963 Inf 
#[4,] 0.4150375 3.000000  Inf 3.000000 Inf 
#[5,] 0.0000000  Inf  Inf  Inf Inf 


# Logarithmic function when applied to Sparse matrix 
-log(TestSparseMatrix/rowSums(TestSparseMatrix), 2) 


# Output 
#   [,1]  [,2]  [,3]  [,4] [,5] 
#[1,] 0.2876821 1.386294  Inf  Inf Inf 
#[2,] 0.2231436  Inf 1.609438  Inf Inf 
#[3,] 1.0986123 1.791759 1.791759 1.098612 Inf 
#[4,] 0.2876821 2.079442  Inf 2.079442 Inf 
#[5,] 0.0000000  Inf  Inf  Inf Inf 

ответ

4

log() игнорирует base для разреженной матрицы (An "S4" объекта). Использование log2 устраняет проблему:

-log2(TestSparseMatrix/rowSums(TestSparseMatrix)) 

Есть прочитанный на "методы S4" часть ?log. Я считаю, что это не так широко известно.

Note that this means that the S4 generic for ‘log’ has a signature 
with only one argument, ‘x’, but that ‘base’ can be passed to 
methods (but will not be used for method selection). On the other 
hand, if you only set a method for the ‘Math’ group generic then 
‘base’ argument of ‘log’ will be ignored for your class. 

В случае вам интересно, вы можете читать дальше:

?groupGeneric 
?S4groupGeneric 

или что то же самое (как вы будете перенаправлены на указанных страницах вручную):

?base::Math 
?methods::Math 

Это действительно связанные с тем, как определяется группа «Math». Специально цитировал ?S4groupGeneric:

Note that two members of the ‘Math’ group, ‘log’ and ‘trunc’, have 
... as an extra formal argument. Since methods for ‘Math’ will 
have only one formal argument, you must set a specific method for 
these functions in order to call them with the extra argument(s). 

Так что, если вы хотите взять логарифм с произвольным, действительный base, скажем base = 3? Используйте формулу:

log(x, base = 3) = log(x)/log(3) 

Например, с TestSparseMatrix, вы также можете сделать:

-log(TestSparseMatrix/rowSums(TestSparseMatrix))/log(2) 
Смежные вопросы