Для тестов используется модуль php_svm:
www.php.net/manual/ru/book.svm.php
Есть входящий поток данных: город, время (час), температура.
На выводе результат из 5 вариантов: 1, 2, 3, 4, 5
Необходимо научить машину находить идентификатор ответа в зависимости от значений входных данных.
Как можно подать эти данные на обучение? Правильна ли моя логика?
Про результат:
По скольку, результатом может быть только -1 и 1, получается, нужно перенести идентификатор результата во входные параметры? Например: город Москва, 12 часов, 0 градусов, ответ 3 - и эти входные данные дадут ответ 1. При другом номере ответа, соответственно -1.
Про город:
Нужно составить индексы по городам: 1 - Москва, 2 - Самара, 3 - Екатеринбург. А потом уже использовать эти индексы как ключи.
По часам, температуре и ответу:
Используем тот же индекс, что у города. Для уникальности индексам даю разные диапазоны.
Для наглядности, представлю массив с индексами:
$indexes = [
// города
1, ... 99,
// часы
100, ... 199,
// температура
200, ... 299,
// ответы
300, ... 399,
];
На обучение получаются такие данные:
$train = [
[-1, 1 => 1, 100 => 1, 200 => 1, 300 => 1], // город 1, час 100, температура 200, ответ 300
[-1, 1 => 1, 100 => 1, 200 => 1, 301 => 1], // город 2, час 120, температура 230, ответ 301
[1, 1 => 1, 100 => 1, 200 => 1, 302 => 1], // город 2, час 120, температура 230, ответ 302
[1, 3 => 1, 120 => 1, 304 => 1], // город 3, час 120, температура неизвестна, ответ 304
];
$model = $svm->train($train);
И подобный массив с данными на проверку:
// В комментариях ожидаемый мной результат
$tests = [
[1 => 1, 100 => 1, 200 => 1, 300 => 1], // -1?
[100 => 1, 301 => 1], // -1?
[100 => 1, 200 => 1, 302 => 1], // 1?
];
foreach($tests as $test){
$result = $model->predict($test);
var_dump($result);
}
Есть подозрение, что значением параметров должна быть не единица.
Пробовал обучить машину генерируя случайным образом входные и выходные данные (до 10 тыс вариантов). В итоге машина всегда отдает результат -1, при весе параметров равным 1. Если веса сделать равным 0.01, тогда ответ всегда 1.
Вопросы:
1. Правильна ли логика построения входных данных на обучение?
2. Правильно ли составлен массив на тест?
3. Если нельзя переносить идентификатор результата во входные параметры, как быть?
4. Какой вес нужно указать для входных параметров? Как его вычислить?
5. Нужно ли что-то менять, если входных параметров станет 20 (в среднем по 100 вариантов значений), а вариантов результата станет 200.
6. Есть ли примеры кода, где разобраны подобные задачи?
Спасибо.