или
>"01"
. Но для нас одномерный массив проще, и выражение для доступа к нему будет короче. Мы будем обрабатывать индексы массива как двузначные двоичные числа, где левый знак обозначает переменную оборачиваемости, а правый – события. К примеру,
>10
обозначает случай, когда Жак обратился в белку, но событие (к примеру, «пицца») не имело места. Так случилось 4 раза. И поскольку двоичное 10 – это десятичное 2, мы будем хранить это в массиве по индексу 2.
Функция, вычисляющая коэффициент ϕ из такого массива:
>function phi(table) {
> return (table[3] * table[0] - table[2] * table[1]) /
> Math.sqrt((table[2] + table[3]) *
> (table[0] + table[1]) *
> (table[1] + table[3]) *
> (table[0] + table[2]));
>}
>console.log(phi([76, 9, 4, 1]));
>// → 0.068599434
Это просто прямая реализация формулы ϕ на языке JavaScript. >Math.sqrt
– это функция извлечения квадратного корня объекта >Math
из стандартного окружения JavaScript. Нам нужно сложить два поля таблицы для получения полей типа n>1•, потому что мы не храним в явном виде суммы столбцов или строк.
Жак вёл журнал три месяца. Результат доступен на сайте книги eloquentjavascript.net/code/jacques_journal.js.
Чтобы извлечь переменную 2×2 для конкретного события, нам нужно в цикле пройтись по всем записям и посчитать, сколько раз оно случается по отношению к обращению в белку.
>function hasEvent(event, entry) {
> return entry.events.indexOf(event) != -1;
>}
>function tableFor(event, journal) {
> var table = [0, 0, 0, 0];
> for (var i = 0; i < journal.length; i++) {
> var entry = journal[i], index = 0;
> if (hasEvent(event, entry)) index += 1;
> if (entry.squirrel) index += 2;
> table[index] += 1;
> }
> return table;
>}
>console.log(tableFor("pizza", JOURNAL));
>// → [76, 9, 4, 1]
Функция >hasEvent
проверяет, содержит ли запись нужный элемент. У массивов есть метод >indexOf
, который ищет заданное значение (в нашем случае – имя события) в массиве и возвращает индекс его положения в массиве (-1, если его в массиве нет). Значит, если вызов >indexOf
не вернул -1, то событие в записи есть.
Тело цикла в >tableFor
рассчитывает, в какую ячейку таблицы попадает каждая из журнальных записей. Она смотрит, содержит ли запись нужное событие, и связано ли оно с обращением в белку. Затем цикл увеличивает на единицу элемент массива, соответствующий нужной ячейке.
Теперь у нас есть все инструменты для подсчёта корреляций. Осталось только подсчитать корреляции для каждого из событий, и посмотреть, не выдаётся ли что из списка. Но как хранить эти корреляции?