масштабирование стандартизировано или взвешивание - PullRequest
0 голосов
/ 31 мая 2018

Я надеюсь найти ответ на этот вопрос здесь.У меня есть фрагмент кода, который я пытаюсь тщательно проанализировать:

alphas <- matrix(runif(900), ncol=3, byrow=TRUE)
z <- t(apply(alphas, 1, cumsum)) 

for(i in 1:nrow(z)){
  z[i, ] <- z[i, ] / (1:ncol(z))
}

Я пытаюсь понять, что делает код z[i,]<- z[i,]/(1:ncol(z)) для матричных альфа.Я знаю, что мы делим каждый столбец на последовательность столбцов во входной матрице.Я также знаю, что при применении apply с полем 2 мы применяем интересующую нас функцию, которая в данном случае «cumsum», над строками альфа-матриц.Это в основном то, что я знаю, я понятия не имею, почему следующая строка и что делает с моей матрицей альфа?

Я был бы признателен за некоторые insigts Большое спасибо

1 Ответ

0 голосов
/ 31 мая 2018

С вашим кодом я бы сказал, что вы вычисляете по строкам совокупное среднее вашего alphas.

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

Посмотрите, что ncol(z) дает

> ncol(z)
[1] 3

Так что в основном то, что вы делаете с z[i, ] / (1:ncol(z)) в вашем цикле, является делением каждой строкивектором или последовательностью, соответственно, с длиной номеров столбцов, то есть c(1, 2, 3) или просто 1:3.

Рассмотрим первую строку вашего alphas и ваш z.

set.seed(42)  # for sake of reproducibility

alphas <- matrix(runif(900), ncol=3, byrow=TRUE)
z <- t(apply(alphas, 1, cumsum)) 

> alphas[1, ]
[1] 0.9148060 0.9370754 0.2861395

> z[1, ]
[1] 0.914806 1.851881 2.138021

> cbind(alphas[1, 1], mean(c(alphas[1, 1:2])), mean(c(alphas[1, 1:3])))
         [,1]      [,2]      [,3]
[1,] 0.914806 0.9259407 0.7126737

Ядро вашего цикла дает

> z[1, ] / 1:ncol(z)
[1] 0.9148060 0.9259407 0.7126737

Таким образом, каждый элемент строки z[1, ] будет разделен на соответствующий ему делитель вектора, что даст средние значения агрегированных ячеек вашего циклапросто делает это для всей матрицы z.

Кстати - быстрее и удобнее в R мы делаем это векторизованным способом внутри функции.Поскольку вы понимаете apply(), вы поймете sapply().Что мы будем использовать, сначала определив функцию.

FUN1 <- function(i){
  z[i, ] / 1:ncol(z)
}

M <- t(sapply(1:nrow(z), FUN1))

> head(M, 3)
          [,1]      [,2]      [,3]
[1,] 0.9148060 0.9259407 0.7126737
[2,] 0.8304476 0.7360966 0.6637630
[3,] 0.7365883 0.4356275 0.5094157

Это дает то же самое, что и ваш цикл, но R .

За один шаг мы можем сделатьэта поговорка

z <- t(sapply(seq_len(nrow(alphas)), 
              function(i) cumsum(alphas[i, ]) / seq_along(alphas[i, ])))

> head(z, 3)
          [,1]      [,2]      [,3]
[1,] 0.9148060 0.9259407 0.7126737
[2,] 0.8304476 0.7360966 0.6637630
[3,] 0.7365883 0.4356275 0.5094157
...