Глава 2. Приступим: простая линейная регрессия в TensorFlow.js
95
Переходя вдоль этой оси координат от первого элемента ко второму, а затем и к тре
тьему, мы ссылаемся на различные примеры данных, в нашем случае различные объ
екты недвижимости. Второе измерение — измерение признаков. При переходе в этом
измерении от первого элемента ко второму мы ссылаемся на различные признаки,
например CRIM, ZN и INDUS из табл. 2.1. При вычислении среднего значения по
оси 0 мы усредняем по измерению примеров данных. И получаем в результате тензор
ранга 1, в котором осталась только координата признаков со средними значениями
каждого признака. Если же вычислять среднее значение по оси 1, мы тоже получим
тензор ранга 1, в котором останется только координата примеров данных, а значения
будут соответствовать среднему значению для каждого объекта недвижимости, что
для нашего приложения смысла не имеет. Будьте внимательны с координатами,
убедитесь, что выполняете вычисления по нужному измерению, — это очень рас
пространенный источник ошибок.
Если у нас в этом месте создана точка останова
1
, можно воспользоваться кон
солью JavaScript, чтобы посмотреть вычисленные средние значения. Как видим,
средние значения очень близки к средним значениям для набора данных в целом.
Это значит, что наша обучающая выборка была вполне репрезентативна:
> dataMean.shape
[12]
> dataMean.print();
[3.3603415, 10.6891899, 11.2934837, 0.0600601, 0.5571442, 6.2656188,
68.2264328, 3.7099338, 9.6336336, 409.2792969, 18.4480476, 12.5154343]
В следующей строке из данных вычитается среднее значение (с помощью
tf.sub
),
чтобы мы могли получить их центрированную версию:
const diffFromMean = data.sub(dataMean);
Если вы недостаточно внимательно следили за нашим обсуждением, то можете
пропустить скрытую в этой строке маленькую хитрость. Видите ли,
data
представ
ляет собой тензор ранга 2 формы
[333,
12]
, а
dataMean
— тензор ранга 1 формы
[12]
.
Вообще говоря, вычитать тензоры различной формы нельзя. Впрочем, в данном
случае TensorFlow использует транслирование (broadcasting) для расширения фор
мы второго тензора фактически путем его повторения 333 раза и делает именно то,
что нужно пользователю, не требуя явного описания. Это очень удобный трюк, но
правила совместимости форм для транслирования довольно запутанны. Если вам
интересны нюансы транслирования, загляните в инфобокс 2.4.
В следующих нескольких строках функции
determineMeanAndStddev
никаких
сюрпризов нет:
tf.square()
возводит все элементы в квадрат, а
tf.sqrt()
извлекает
из них квадратный корень. Подробное описание API для этих методов можно найти
в справочном руководстве из документации TensorFlow.js:
https://js.tensorflow.org/api/
latest/
. На этой странице также представлены интерактивные виджеты с возможно
стью редактирования — с их помощью вы можете поэкспериментировать над этими
функциями с вашими значениями параметров, как показано на рис. 2.12.
1
Инструкции по созданию точки останова в Chrome можно найти по адресу http://mng.bz/
rPQJ. Найти инструкции для Firefox, Edge и других браузеров вы можете в своей любимой
поисковой системе, просто введя «как создать точку останова в...».
Do'stlaringiz bilan baham: |