Масштабирование данных

Когда для сравнения использовался только возраст, нам было достаточно исходных данных, по которым вычислялись средние и расстояния; ведь сравнивать переменные, обозначающие одно и то же, вполне допустимо. Однако теперь мы ввели несколько новых переменных, которые с возрастом несравнимы, так как принимают гораздо меньшие значения. Разное отношение к детям (возможные значения 1 и -1, максимальное расстояние 2) может быть куда весомее шестилетней разницы в возрасте, но если брать данные как есть, то разница в возрасте будет весить в три раза больше.

Для решения этой проблемы необходимо привести все данные к единому масштабу, чтобы все переменные можно было осмысленно сравнивать. Для этого требуется определить минимальное и максимальное значения каждой переменной и масштабировать данные так, чтобы минимум соответствовал нулю, а максимум – единице. Добавьте функцию scaledata в файл advancedclassifier.py: def scaledata(rows):

low=[999999999.0]*len(rows[0].data) high=[-999999999.0]*len(rows[0].data)

#    Ищем наименьшее и наибольшее значения for row in rows:

d=row.data

for i in range(len(d)): if d[i]<low[i]: low[i]=d[i] if d[i]>high[i]: high[i]=d[i]

#    Создаем функцию масштабирования def scaleinput(d):

return [(d.data[i]-low[i])/(high[i]-low[i]) for i in range(len(low))]

#    Масштабируем данные

newrows=[matchrow(scaleinput(row.data)+[row.match]) for row in rows]

#    Возвращаем новые данные и функцию return newrows,scaleinput

Внутри этой функции определяется функция scaleinput, которая ищет наименьшее значение и вычитает его из всех остальных, так что минимум оказывается равным 0. Затем все значения делятся на разность между максимальным и минимальным, чтобы привести их к диапазону от 0 до 1. Функция scaledata применяет scaleinput к каждой строке набора данных и возвращает новый набор вместе с самой функцией scaleinput, которую вы сможете в дальнейшем использовать для масштабирования запросов.

Теперь попробуем применить линейный классификатор к более широкому набору переменных: >>> reload(advancedclassify)

<module ‘advancedclassify’ from ‘advancedclassify.py’> >>> scaledset,scalef=advancedclassify.scaledata(numericalset) >>> avgs=advancedclassify.lineartrain(scaledset) >>> numericalset[0].data

[39.0, 1, -1, 43.0, -1, 1, 0, 0.90110601059793416] >>> numericalset[0].match

0

>>> advancedclassify.dpclassify(scalef(numericalset[0].data),avgs)

1

>>> numericalset[11].match

1

>>> advancedclassify.dpclassify(scalef(numericalset[11].data),avgs)

1

Отметим, что числовые данные предварительно масштабируются. Хотя для некоторых примеров этот классификатор работает, недостатки проведения разделяющей прямой становятся более очевидны. Чтобы улучшить результат, нам необходимо выйти за рамки линейной классификации.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100