Добрый день,
У меня есть совместное местоположение элемента (fcm, из пакета quanteda в R) размеров 94966 x 94966 (для иллюстрации называется fcm2). Я могу выбрать строки (класс: объект fcm) по имени объекта или номеру строки, например ::
a1 <- fcm2[1,]
и выполнить расчет нормализации для этой конкретной строки:
a2 <- a1/(max(a1)-min(a1))
Моя цель состоит в том, чтобы нормализовать каждую строку в моем оригинальном fcm. Стратегия, которую я попытался, состояла в том, чтобы инициализировать пустую матрицу, а затем использовать цикл for, чтобы пройти по строкам и выполнить вычисление. Сбой инициализации из-за проблем с памятью (Windows 10, 12 ГБ ОЗУ, версия R 3.4.4):
fcm3 <- matrix(data = NA, nrow = 94966, ncol = 94966)
Error: cannot allocate vector of size 33.6 Gb
Мне удалось выполнить нормализацию с помощью структуры данных, но недостаточно памяти для хранения всего fcm2 в качестве кадра данных:
Шаг 1. Извлечение «подматрицы» на основе списка ключевых слов, преобразование в фрейм данных, удаление ненужных столбцов
m <- fcm2[keywords(),]
df_m1 <- as.data.frame(m)
df_m1 <- subset(df_m1, select = -c(document, rt))
Шаг 2: Нормализация
k <- 0 # initialize counter
df2 <- data.frame() # initialize
n4 <- nrow(df_m1) # count rows of the extracted sub-matrix as df (df_m1)
for(k in 1:n4){
a1 <- df_m1[k,] # store the (n4)th row
max_k <- max(a1)
min_k <- min(a1)
a2 <- a1/(max_k-min_k) # normalize so max is 1, 0s are still 0s
df2 <- rbind(df2, a2) # append normalized results into a row of a data.frame
}
Есть ли более эффективный способ нормализации каждой строки для всего fcm?
Доброе спасибо!