Пример внешнего произведения в R

Я читаю учебник под названием «Введение в R», и он дает мне пример, который я совершенно не могу понять.

В примерах говорится, что

В качестве искусственного, но симпатичного примера рассмотрим детерминанты матриц 2 на 2 [a, b; c, d], где каждая запись является неотрицательным целым числом в диапазоне 0, 1,. , , 9, это цифра. Задача состоит в том, чтобы найти детерминанты, ad - bc, всех возможных матриц этого вида и представить частоту, с которой каждое значение встречается в виде графика высокой плотности. Это равносильно нахождению распределения вероятности детерминанта, если каждая цифра выбрана независимо и равномерно случайным образом.

И это обеспечивает код:

d <- outer(0:9, 0:9)
fr <- table(outer(d, d, "-"))
plot(as.numeric(names(fr)), fr, type="h",
xlab="Determinant", ylab="Frequency") 

Я знаю только то, что делает первая строка, но не знаю, что означает знак «-» в функции external () и что делает table () в этом случае. Кроме того, зачем использовать функцию name () в последней функции plot ()

 Bratt Swan08 авг. 2016 г., 03:26
@Огромное спасибо! Я принял ваш ответ
 Robert01 авг. 2016 г., 16:43
использованиеstr(), class() каждого объекта
 Bratt Swan06 авг. 2016 г., 18:30
Да, я очень ценю вашу помощь и проголосовала за ваши ответы.
 Bratt Swan06 авг. 2016 г., 18:32
Что я не понимаю, так это то, почему на этом посте так много отрицательных голосов.

Ответы на вопрос(4)

В первом рядуouter() используется с настройками по умолчанию, который является внешним произведением двух матриц. Вот почему это матрица 10х10. Например, для первого столбца он производит все значения X с первым элементом Y. Затем для второго столбца произведения всех элементов X со вторым элементом Y.

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0    0    0    0    0     0
 [2,]    0    1    2    3    4    5    6    7    8     9
 [3,]    0    2    4    6    8   10   12   14   16    18
 [4,]    0    3    6    9   12   15   18   21   24    27
 [5,]    0    4    8   12   16   20   24   28   32    36
 [6,]    0    5   10   15   20   25   30   35   40    45
 [7,]    0    6   12   18   24   30   36   42   48    54
 [8,]    0    7   14   21   28   35   42   49   56    63
 [9,]    0    8   16   24   32   40   48   56   64    72
[10,]    0    9   18   27   36   45   54   63   72    81

затемouter(x,y,"-") даст вам следующий результат. Он вычтет y элементов из x элементов.

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0   -1   -2   -3   -4   -5   -6   -7   -8    -9
 [2,]    1    0   -1   -2   -3   -4   -5   -6   -7    -8
 [3,]    2    1    0   -1   -2   -3   -4   -5   -6    -7
 [4,]    3    2    1    0   -1   -2   -3   -4   -5    -6
 [5,]    4    3    2    1    0   -1   -2   -3   -4    -5
 [6,]    5    4    3    2    1    0   -1   -2   -3    -4
 [7,]    6    5    4    3    2    1    0   -1   -2    -3
 [8,]    7    6    5    4    3    2    1    0   -1    -2
 [9,]    8    7    6    5    4    3    2    1    0    -1
[10,]    9    8    7    6    5    4    3    2    1     0

Но помните, мы сделали эту функцию внешнего минуса в векторах. В вашем примере это тоже матрицы 10х10. Таким образом, они будут производить более одной матрицы. Таблица для этого.

names(fr) делает все элементы таблицы вектором строки (!) (отличительный), иas.numeric() используется, чтобы заставить их быть числовыми.

Первая строка делает все возможные комбинации продуктов из последовательности0:9 (см. помощьFUN="*"). Итак, это матрица:

d <- outer(0:9, 0:9)
str(d)
 num [1:10, 1:10] 0 0 0 0 0 0 0 0 0 0 ...
> tail(d)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [5,]    0    4    8   12   16   20   24   28   32    36
 [6,]    0    5   10   15   20   25   30   35   40    45
 [7,]    0    6   12   18   24   30   36   42   48    54
 [8,]    0    7   14   21   28   35   42   49   56    63
 [9,]    0    8   16   24   32   40   48   56   64    72
[10,]    0    9   18   27   36   45   54   63   72    81

Вторая строка делает разницу всех возможных комбинаций предыдущей матрицы. Результат похож на вычислениеab - bc, Это четырехмерный массив

dd<- outer(d, d, "-")
str(dd)
 num [1:10, 1:10, 1:10, 1:10] 0 0 0 0 0 0 0 0 0 0 ...

Третья строка вычисляет частоты всех возможных результатов. Имена - это числа в строковом (текстовом) формате.

fr <- table(outer(d, d, "-"))
str(fr)
 'table' int [1:163(1d)] 19 1 2 2 3 2 4 2 4 41 ...
 - attr(*, "dimnames")=List of 1
  ..$ : chr [1:163] "-81" "-80" "-79" "-78" ...

Чтобы отобразить результаты, вам нужны числа по оси x и частоты по оси y.

plot(as.numeric(names(fr)), fr, type="h",
     xlab="Determinant", ylab="Frequency") 
Решение Вопроса

Возможно, мне следует сначала объяснить это очень маленьким примером. Давайте предположим, что мы просто хотим найти распределение определителяad - bc, гдеa, b, c, d либо 0, либо 1.

Первая строка

product <- outer(0:1, 0:1, "*")
#     [,1] [,2]
#[1,]    0    0
#[2,]    0    1

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

0 * 0 = 0
0 * 1 = 0
1 * 0 = 0
1 * 1 = 1

Это сопоставляет возможные результатыad а такжеbc вad - bc.

Вторая строка:

minus <- outer(product, product, "-")
    , , 1, 1

      [,1] [,2]
[1,]    0    0
[2,]    0    1

, , 2, 1

     [,1] [,2]
[1,]    0    0
[2,]    0    1

, , 1, 2

     [,1] [,2]
[1,]    0    0
[2,]    0    1

, , 2, 2

     [,1] [,2]
[1,]   -1   -1
[2,]   -1    0

вычисляет все возможные результатыad - bc, Возможно, это не легко прочитать, поскольку они являются 4D массивом. Тогда как насчет:

minus <- as.numeric(minus)
#[1]  0  0  0  1  0  0  0  1  0  0  0  1 -1 -1 -1  0

Затем пришло время составить таблицу на случай непредвиденных обстоятельств:

fr <- table(minus)
#-1  0  1 
# 3 10  3 

Наконец, пример кода отображает эту таблицу.

Что бы я сделал, если бы решить эту проблему

Вам было трудно прочитать результатouterЭто каждый раз, когда вы подаете заявлениеouter, размерность растет. Например, применяяouter с двумя одномерными векторами приводит к двумерной матрице с дальнейшим применениемouter к двум 2D матрицам приводит к массиву 4D.

Для простоты понимания я бы использовалas.numeric() сгладить результатouter каждый раз. Я бы использовал это:

product <- as.numeric(outer(0:1,0:1,"*"))
#[1] 0 0 0 1

minus <- as.numeric(outer(product, product, "-"))
#[1]  0  0  0  1  0  0  0  1  0  0  0  1 -1 -1 -1  0

plot(table(minus))

С вашей первоначальной проблемой я делаю:

product <- as.numeric(outer(0:9,0:9,"*"))
minus <- as.numeric(outer(product, product, "-"))
plot(table(minus))

Все ваши вопросы могутбез труда ответ на страницах справки функции.

1. d - просто воспроизводимая матрица для начала.

outer(0:9,0:9) создает матричный тест-кейс 10х10.

2."-" это функция для завершения вouter()

По умолчанию* поэтому первый случайouter() умножает два вектора0:9 в то время как второй экземпляр требует вычитания, следовательно,-.

3.table()

Из справки:

Таблица использует факторы перекрестной классификации для построения таблицы непредвиденных обстоятельств для каждой комбинации уровней факторов.

4.names() дает имена персонажейfr выход

fr является именованным вектором. Чтобы отобразить значения относительно имен (в данном случае определителя), имена должны быть извлечены изfr таблица и приведена к числовому типу.

Ваш ответ на вопрос