WedX - журнал о программировании и компьютерных науках

R - Проверить разные матрицы с возможным запаздыванием

Эту проблему довольно сложно объяснить, но я уверен, что некоторые из вас уже сталкивались с ней.

Итак, у меня две матрицы. Матрица 1 (мат 1) и Матрица 2 (мат 2)

Я хочу записать в третью матрицу (mat3) значение mat2 после проверки матрицы 1, но с LAG. Позволь мне объяснить.

После значения 1 в матрице 1 я хочу проверить, является ли матрица 2 также 1, но в пределах диапазона определенного LAG, например, через 1 или 2 эпизода после (столбец).

Например, строка номер 4 содержит 1 в матрице 1 в 6-м столбце. Поэтому я хочу проверить, есть ли в матрице 2 для строки 4 1 сразу после или после еще 2 или 3 столбцов.

Вы понимаете идею?

mat1 = structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 
1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 
0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1), .Dim = c(10L, 21L), .Dimnames = list(NULL, c("wit5.020", 
"wit5.021", "wit5.022", "wit5.023", "wit5.024", "wit5.025", "wit5.026", 
"wit5.027", "wit5.028", "wit5.029", "wit5.030", "wit5.031", "wit5.032", 
"wit5.033", "wit5.034", "wit5.035", "wit5.036", "wit5.037", "wit5.038", 
"wit5.039", "wit5.040")))

mat2 = structure(c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 
0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 
0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 
1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 
0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 
1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 
0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 
0, 1, 0, 1), .Dim = c(10L, 21L))

Итак, mat3 - где я хочу сохранить результат проверки

mat3 = matrix(0, nrow = nrow(mat1), ncol = ncol(mat1))

Итак, вот пример возможного цикла для проверки LAG - этот цикл не работает, но он может дать вам представление о решении. Я не уверен, где ввести задержку. Я думал, может быть, в i, но не уверен.

for(j in 1:ncol(mat1)){
  for(i in 1:nrow(mat1)){

    if( mat1[i,j] == 1 & mat2[i,j] == 1 | mat2[i+1,j] == 1 | mat2[i+2,j] == 1) # lag here 
    {mat[i,j] <- 1}  

else
{mat[i,j] <- 0}  

  }
}

Любые идеи приветствуются.

20.06.2015

  • Что mat1.wake и mat? t должно быть mat1 и mat3 соответственно. Кроме того, почему вы запаздываете по строкам (i), если по вашему описанию вы хотите отставать по столбцам (j)? Если бы вы следовали только своим собственным объяснениям, я уверен, что вы могли бы заставить этот цикл работать. 20.06.2015
  • @DavidArenburg, прости, mat1.wake - это mat1! моя вина 20.06.2015
  • В любом случае, вы можете попробовать векторизацию следующим образом, но мне этот метод не слишком нравится indx <- mat1 == 1L ; mat3[indx] <- (mat2[indx] == 1L) |(cbind(mat2[, -1L], FALSE)[indx] == 1L) |(cbind(mat2[, -(1L:2L)], FALSE, FALSE)[indx] == 1L) 21.06.2015
  • @DavidArenburg - да, именно на j я должен отставать - вы правы. Я понимаю, что на самом деле хочу более сложного. Мне нужно разобраться более четко. Спасибо. 21.06.2015
  • @DavidArenburg. Мне нужно сохранить 1 в mat3 не в mat[i,j], а просто в каждом столбце раньше. Итак, когда цикл находит 1 в матрице 1 (с запаздыванием), тогда помещайте 1 в каждый столбец перед матрицей 3. Есть подсказка? Спасибо 21.06.2015

Ответы:


1

Вот простой способ сделать это:

lag <- 3  # or whatever lag you want
nr <- nrow(mat1)
nc <- ncol(mat1)

mat3 <- matrix(0, ncol=nc, nrow=nr)
for (r in 1:nr) {
  for (c in 1:nc) {
    if (mat1[r,c] == 1 && any(mat2[r,c:min(c+lag,nc)] == 1))
      mat3[r,c] <- 1
  }
}

Обратите внимание на использование mat2[r,c:min(c+lag,nc)]. При этом выбираются все элементы от текущего столбца c до столбца c + lag, но при этом не пропадает nc (общее количество столбцов). То есть этот код используется, чтобы избежать ошибки за пределами допустимого диапазона.

Вероятно, есть более быстрый и векторный способ сделать это, но приведенный выше код должен работать.

20.06.2015
  • Большое спасибо за ваш цикл. Это действительно приятно. Я понимаю, что мне нужно сохранить в матрице 3 - mat3[r,c] не 1 в [r,c], но фактически везде раньше. Вы понимаете, о чем я? Как и каждый раз, когда есть 1 после определенного лага для mat1 (поскольку ваш цикл делает это правильно) - тогда на самом деле поместите 1 в каждый столбец перед . Не могли бы вы мне помочь? Благодарность 21.06.2015
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]