На этом шаге мы приведем текст функции, выполняющей нормализацию.
Наборы данных, с которыми мы предполагаем работать, обычно требуют некоторой очистки, прежде чем их можно будет ввести в алгоритмы. Очистка может означать удаление посторонних символов и дубликатов, исправление ошибок и другие вспомогательные операции. Вид очистки, которую нужно выполнить для двух наборов данных, с которыми предстоит работать, - это нормализация. Ранее она была сделана с помощью метода zscore_normalize() в классе KMeans (74 шаг). Нормализация - это преобразование атрибутов, записанных в разных масштабах, к единому масштабу.
Благодаря сигмоидной функции активации каждый нейрон в сети выводит значения в диапазоне 0...1. Логично, что шкала от 0 до 1 будет иметь смысл и для атрибутов в нашем наборе входных данных. Преобразовать шкалу из некоторого диапазона в диапазон 0...1 не составляет груда. Для любого значения V в определенном диапазоне атрибутов с максимальным max и минимальным min значениями формула имеет вид newV = (oldv - min)/(max - min). Эта операция называется масштабированием объектов. Далее представлена реализация формулы на Python, добавленная в файл util.py.
# Будем считать, что все строки одинаковой длины, # а каждый столбец масштабирован в диапазоне 0 ... 1 def normalize_by_feature_scaling(dataset: List[List[float]]) -> None: for col_num in range(len(dataset[0])): column: List[float] = [row[col_num] for row in dataset] maximum = max(column) minimum = min(column) for row_num in range(len(dataset)): dataset[row_num][col_num] = \ (dataset[row_num][col_num] - minimum) / (maximum - minimum)
Обратите внимание на параметр dataset. Он указывает на список списков, который будет изменен в этой функции. Другими словами, функция normalize_by_feature_scaling() получает не копию набора данных, а ссылку на исходный набор данных. В этом случае мы хотим внести изменения в значение, а не возвратить его измененную копию.
Обратите также внимание: программа предполагает, что наборы данных являются двумерными списками данных типа float.
На следующем шаге мы рассмотрим пример использования созданной сети.