Вопрос

В нашем офисе мы регулярно после работы играем в настольный футбол.Я собрал небольшую Java-программу, которая генерирует случайные составы 2 на 2 из доступных игроков и впоследствии сохраняет результаты матчей в базе данных.

Текущий прогноз результата использует простое среднее всех результатов предыдущих матчей четырех участвующих игроков.Это дает очень приблизительную оценку, но я бы хотел заменить ее чем-то более сложным, принимая во внимание такие вещи, как:

  • игроки могут хорошо играть в роли нападающего, но плохо играть в роли защитника (или наоборот)
  • игроки хорошо справляются с конкретным противником/плохо против других
  • некоторые команды хорошо работают вместе, другие нет
  • навыки меняются со временем

Какой алгоритм будет лучшим, чтобы максимально точно предсказать исход игры?

Кто-то предложил использовать для этого нейронную сеть, что звучит довольно интересно...но у меня недостаточно знаний по этой теме, чтобы сказать, сработает ли это, и я также подозреваю, что для разумного обучения может потребоваться слишком много игр.

РЕДАКТИРОВАТЬ:
Пришлось сделать более длительный перерыв из-за сроков выполнения проекта.Чтобы сделать вопрос более конкретным:

Учитывая следующую таблицу MySQL, содержащую все сыгранные на данный момент матчи:

table match_result

match_id      int pk
match_start   datetime
duration      int (match length in seconds)
blue_defense  int fk to table player
blue_attack   int fk to table player
red_defense   int fk to table player
red_attack    int fk to table player
score_blue    int
score_red     int

Как бы вы написали функцию PredictResult(blueDef, blueAtk, redDef, redAtk) {...}
максимально точно оценить результат, выполняя любой sql, производя расчеты или используя внешние библиотеки?

Это было полезно?

Решение

Используйте алгоритм TrueSkill, он очень хорош в этом.Я реализовал это для настольного футбола и шахмат, и оно работает очень хорошо.Коллеги сказали мне, что это почти слишком хорош в этом.

Полную информацию о том, как это работает, а также ссылку на мою реализацию см. в разделе "Вычисляем свои навыки" Сообщение блога.

Другие советы

Зачем использовать нейронную сеть?Используйте статистику, вероятно, корреляция между каждым игроком будет хорошей мерой.

Для начала давайте соберем некоторую информацию:Для данного игрока нам нужно:

  1. позиция, на которой они играли
  2. окончательный счет

Хороший нападающий будет набирать очки.Хороший защитник не позволит набрать очки.

Настоящая информация будет получена от хорошего нападающего, играющего против хорошего защитника.

Попробуйте применить классификатор Наивного Байеса.

Байесовское обучение является вероятностным подход, который основан на предположение, что количества интересы регулируются вероятностью распределений и что оптимальное решения можно принимать с помощью рассуждений об этих вероятностях вместе с наблюдаемыми данными.[Митчелл, Т.(1997), Машинное обучение]

Одно и то же точное распределение игроков может привести к разным результатам матча.Если в ваших данных есть шаблон, шаблон, основанный на ваших переменных, классификатор Наивного Байеса может дать хорошие результаты.

Алгоритм не очень сложен.Я думаю, что тот, кто обладает некоторыми знаниями в области вероятностей, сможет понять и применить их.

В системах обнаружения вторжений он используется для определения сетевых аномалий путем анализа различных сетевых параметров.Байесовский подход может быть очень успешным для определенных типов данных и обеспечивать высокие показатели TP и низкие показатели FP.Но это также может привести к высоким показателям FP, в зависимости от ваших данных.Ваши данные определят лучший подход.

Вы можете использовать Weka (http://www.cs.waikato.ac.nz/~ml/weka/), библиотеку программного обеспечения для интеллектуального анализа данных и попробуйте разные алгоритмы.Он содержит классификатор Наивного Байеса.Просто попробуйте и посмотрите.

Одним из вариантов было бы попытаться угадать распределение точек как какая-то линейная модель.Если у вас больше игр, чем игроков, вы можете выполнить метод наименьших квадратов для количества очков на игрока, построив матрицу игр (+1 для игрока в одной команде, -1 для другой, 0 для зрителя) для всех игр и результата. вектор для спредов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top