
Полная версия:
AI для PHP-разработчиков: интуитивно и на практике
if ($range === 0.0) {
return 0.0;
}
return ($value - $min) / $range;
}
Пример:
$result = normalize(value: 75, min: 50, max: 100);
echo $result;
// Результат: 0.5
// Объяснение: (75 - 50) / (100 - 50) = 0.5
После такой обработки возраст, количество покупок и средний чек начинают "весить" примерно одинаково в пространстве признаков.
СтандартизацияДругой широко используемый подход – стандартизация признаков. В отличие от нормализации, она не ограничивает значения фиксированным диапазоном, а приводит распределение признака к виду с нулевым средним и единичным стандартным отклонением. Это особенно важно для моделей, которые чувствительны к масштабу признаков (линейная и логистическая регрессия, SVM, нейронные сети), а также для методов оптимизации, использующих градиентный спуск. Стандартизация делает признаки сопоставимыми по масштабу, но при этом сохраняет информацию о выбросах и относительных отклонениях значений.
Простейшая формула стандартизации выглядит так:
function standardize(float $value, float $mean, float $std): float {
if ($std == 0.0) {
return 0.0;
}
return ($value - $mean) / $std;
}
Пример:
// Допустим, это признак "время ответа пользователя" (в секундах)
$value = 8.5;
// Статистика по обучающей выборке
$mean = 5.0; // среднее значение
$std = 2.0; // стандартное отклонение
$zScore = standardize($value, $mean, $std);
echo "Z-score: " . round($zScore, 2) . PHP_EOL;
// Интерпретация
if ($zScore > 2) {
echo "Значение сильно выше среднего (аномалия)";
} elseif ($zScore < -2) {
echo "Значение сильно ниже среднего (аномалия)";
} elseif ($zScore > 1) {
echo "Выше среднего";
} elseif ($zScore < -1) {
echo "Ниже среднего";
} else {
echo "В пределах нормы";
}
// Результат: 1.75
// Объяснение: (8.5 − 5.0) / 2.0 = 1.75
После стандартизации возраст, количество покупок и средний чек имеют среднее значение около нуля и сопоставимую дисперсию, благодаря чему обучение модели будет происходить стабильнее, а процесс оптимизации станет быстрее и предсказуемее.
Категориальные признаки и размерностьНе все признаки изначально числовые. Цвет, страна, тип устройства – все это категории. Чтобы поместить их в пространство признаков, их нужно превратить в числа. Чаще всего это делается через one-hot encoding.
Если у нас есть три возможных цвета: red, green, blue, то один признак превращается в три координаты:
function encodeColor(string $color): array {
return [
$color === 'red' ? 1 : 0,
$color === 'green' ? 1 : 0,
$color === 'blue' ? 1 : 0,
];
}
echo 'Red: ' . encodeColor(color: 'red') . PHP_EOL;
echo 'Green: ' . encodeColor(color: 'green') . PHP_EOL;
echo 'Blue: ' . encodeColor(color: 'blue');
// Red: [1, 0, 0]
// Green: [0, 1, 0]
// Blue: [0, 0, 1]
Здесь важно заметить, что размерность имеет свойство резко расти. В нашем примере один логический признак превратился в три числовых. В настоящих задачах с сотнями категорий это становится серьезной проблемой и напрямую влияет на сложность моделей.
В реальных системах также приходится учитывать неизвестные или даже новые категории. Обычно для этого добавляют отдельный признак (например, "unknown"), который активируется, если значение не входит в обучающий словарь.
Почему данные – это точки в пространствеПричина, по которой данные в машинном обучении рассматриваются как точки в пространстве, весьма проста. Большинство алгоритмов опираются на геометрию: расстояния, углы, проекции и поверхности.
Если у вас есть набор объектов, каждый из которых описан одним и тем же набором числовых признаков, то строгий математический способ работать с ними – рассматривать их как точки в одном и том же пространстве Rn.
Формально: пусть каждый объект описывается вектором x = (x1, x,2, ..., xn). Тогда вся выборка – это конечное множество точек x = (x1, x,2, ..., xn) ⊂ Rn.
Расстояние между двумя точками || x - y || отражает степень их сходства. Направление вектора (x - y) показывает, в каких признаках объекты отличаются сильнее всего. Плоскость или гиперплоскость – это множество точек, удовлетворяющих линейному уравнению.
Именно поэтому даже самые разные модели в итоге сводятся к геометрическим операциям над векторами.
Геометрический смысл расстояний и угловВ пространстве признаков важны не только расстояния, но и углы между векторами.
Угол между векторами показывает, насколько два направления изменений похожи.
Интуитивно можно сказать так: нас интересует не столько абсолютная величина изменений, сколько то, в каких признаках они происходят одновременно. Даже если значения сильно различаются по масштабу, малый угол между векторами означает, что признаки изменяются согласованно.
Именно поэтому косинусное сходство часто используется при работе с текстовыми эмбеддингами и другими высокоразмерными данными, где направление вектора важнее его длины.
На практике такие векторы обычно предварительно нормализуют по длине (приводят к единичной норме), чтобы косинусное сходство отражало только направление векторов, а не их масштаб.
С формальной точки зрения всё это выражается через скалярное произведение. Скалярное произведение двух векторов x и y определяется как:
𝐱 · 𝐲 = ∑ᵢ₌₁ⁿ xᵢ yᵢ
Через него выражается косинус угла между векторами:
cos(θ) = (𝐱 · 𝐲) / (‖𝐱‖ ‖𝐲‖)
С точки зрения машинного обучения это означает простую вещь: модель может считать два объекта похожими не потому, что они близки по всем координатам, а потому что они "смотрят" в одном направлении в пространстве признаков.
Связь с конкретными алгоритмамиАлгоритм k ближайших соседей (k-NN или k-Nearest Neighbors) буквально живет в пространстве признаков. Он ничего не обучает в классическом смысле, а просто для новой точки ищет k ближайших точек по выбранной метрике расстояния.
Другими словами, всё поведение этого алгоритма полностью определяется тем, как именно мы измеряем расстояния между точками.
Именно поэтому для алгоритма k-NN масштабирование признаков критично. Если признаки находятся в разных числовых диапазонах, расстояние между точками будет определяться в основном признаками с наибольшим масштабом, независимо от их реальной информативности.
Математически это выглядит так: для нового вектора x мы ищем такие векторы xi из обучающей выборки, для которых расстояние d(x, xi) минимально.
Функция указанная ниже реализует классическую формулу евклидова расстояния между двумя точками:
d(a, b) = √(∑ᵢ₌₁ⁿ (aᵢ − bᵢ)²)
Евклидово расстояние – самый интуитивный и часто используемый способ измерять расстояние между точками в пространстве признаков, но оно не является универсальным. В зависимости от задачи и природы данных могут применяться другие метрики: например, манхэттенское расстояние или косинусная мера сходства. Разные метрики по-разному определяют понятие "близости" между объектами, и выбор метрики напрямую влияет на поведение алгоритма и результаты модели.
В следующей главе мы рассмотрим функцию вычисления евклидова расстояния подробней.
Однако не все модели опираются на расстояния между точками. Линейные модели смотрят на пространство иначе. Они ищут гиперплоскость, которая лучше всего разделяет точки или аппроксимирует их значения.
Формально линейная модель записывается так:
f(x) = 𝐰 · 𝐱 + b
Геометрически это означает, что все точки, для которых
𝐰 · 𝐱 + b = 0
Если подобрать более "инженерную" формулировку, то можно написать так:
Линейная модель разбивает пространство признаков гиперплоскостью, а знак линейной функции определяет класс объекта.
Функция ниже вычисляет:
f(x) = 𝐰 · 𝐱 + b = ∑ᵢ₌₁ⁿ wᵢ xᵢ + b
Геометрический смысл
Значение функции пропорционально расстоянию точки до разделяющей гиперплоскости.
Если f(x) = 0 – точка лежит на гиперплоскости.
Если f(x) > 0 или f(x) < 0 – по разные стороны границы.
function linearModel(array $x, array $w, float $b): float {
$n = count($x);
if ($n !== count($w)) {
throw new InvalidArgumentException('Arguments x and w must have the same length');
}
$sum = $b;
for ($i = 0; $i < $n; $i++) {
$sum += $x[$i] * $w[$i];
}
return $sum;
}
Пример:
$x = [2, 3]; // входные признаки
$w = [0.5, 1.5]; // веса
$b = 1.0; // смещение (bias)
$result = linearModel($x, $w, $b);
echo $result;
// Результат: 6.5
// Объяснение: b + (x[0] * w[0]) + (x[1] * w[1]) = 1.0 + (2 * 0.5) + (3 * 1.5) = 6.5
Нейронные сети – это следующий шаг усложнения. Каждый слой выполняет аффинное преобразование:
z = Wx + b
А затем применяет нелинейную функцию активации. Геометрически это означает, что пространство сначала линейно поворачивается и растягивается, а затем нелинейно "ломается". После нескольких таких преобразований данные, которые были неразделимы линейно, становятся разделимыми.
Независимо от сложности архитектуры, вход у нейросети всегда один и тот же – вектор фиксированной размерности.
Высокая размерность и ее последствияКогда размерность пространства признаков становится большой, возникают эффекты, которые на интуитивном уровне могут показаться странными. Объем пространства растет экспоненциально, точки становятся разреженными, а расстояния между ними выравниваются. Этот эффект часто называют "проклятием размерности".
Отсюда для разработчика напрашивается простой практический вывод: не добавляйте признаки "на всякий случай". Каждый признак должен иметь понятный смысл и пользу для задачи.
Связь с реальными моделямиЛинейная регрессия, логистическая регрессия, нейронные сети – все они работают в пространстве признаков. Разница лишь в том, какие поверхности они могут в нем строить. Линейная модель проводит плоскость или гиперплоскость. Нейросеть – сложную нелинейную форму.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.
Вы ознакомились с фрагментом книги.
Для бесплатного чтения открыта только часть текста.
Приобретайте полный текст книги у нашего партнера:
Полная версия книги
Всего 10 форматов

