Pull to refresh
90
0

User

Send message
Если у Вас достаточно много таких записей, то можно собрать все записи, для которых ожидается одинаковый айдишник (но по факту айдишники разные) — это будет обучающая выборка. Пусть записи с разными айдишниками будут принадлежать разным классам. Затем, на основе данной выборки, можно построить дерево принятия решений.

Если визуализировать дерево, и рассмотреть его ветки, то можно будет обнаружить условия, приводящие к разным айдишникам.

Если я правильно понял вопрос — Вас интересует как выбрать количество деревьев в ансамбле.
Как уже отмечали, для этого полезно использовать выборку данных, которая не принимает участия в построении дерева — на ней будем тестировать качество классификатора.

Количество деревьев можно определить эмпирически — постепенно увеличивая их количество, и проверяя качество классификации на тестовых данных. В большинстве случаев получается примерно такая зависимость (схематически):


То есть, после некоторого порогового значения, увеличение количества деревьев перестаёт значительно увеличивать качество классификации. На этом количестве деревьев можно и остановиться.
Спасибо за Ваши замечания :-)

В общем, я с Вами согласен.

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

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

В общем, я считаю, что многие подводные камни являются результатом специфики той или иной предметной области, в применении к которой используется классификатор.
Да, у меня была такая идея. Нужно будет запилить :-)
Да, важно сколько еды сумеет собрать команда агентов.

Максимизация эффективности коллективного поведения отличается от максимизации поведения индивидума.

Вот простой пример: можно заметить, когда несколько агентов двигаются в направлении к частичке пищи, то один из них может развернуться и начать двигаться в другом направлении. А если б я оптимизировал поведение индивидума — то для каждого агента было бы эффективнее соревноваться с другими, чтоб первым схватит кусочек еды, но сумарная эффективность группы агентов от этого только уменьшается.

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

Вот типичная кривая обучения нейронной сети агентов:

(построено по результатам консольного вывода эмулятора)
Спасибо :-)

Качество нейронной сети определяется следующим образом:

есть тренировочная среда
размеры среды 200 х 200, количество агентов — 10, количество частиц еды — 5.

затем, в этой тренировочной среде:
всем агентам присваивается нейронная сеть определенной конфигурации («мозг») и через некоторый промежуток времени фиксируется количество собранных частиц пищи.

Таким образом, считаем что эффективность каждой нейронной сети пропорциональна количеству собранных частиц еды
Выигрывают те нейронные сети, под управлением которых агенты смогли собрать больше еды — на их основе формируется новая популяция нейронных сетей и т.д.
Если я правильно понял — дискуссия о немного различных вещах: сети Хемминга и Хопфилда помогают запоминать конкретные шаблоны, а затем, подавая на вход данные, и прогоняя несколько итераций для схождения — на выходе получаем один из запомненных шаблонов (либо их комбинацию).

kosiakk предлагает запоминать значения, которые использовались для принятия решения на предыдущих шагах агента.

Также, следует учесть, что среда динамическая, поэтому сходимости в принятии решения, на протяжении нескольких шагов агента, вряд ли получится достичь.

Я попробую смоделировать такую сеть. Спасибо за идею
Спасибо :-)
Меня очень впечатлило вот такое видео:

На ютубе можно найти много интересных видео на эту тему.
В этой можно почитать про агентный подход для создания интеллектуальных систем, про различные варианты окружающей среды и стратегии принятия решений:
Stuart J. Russell, Peter Norvig, Artificial Intelligence: A Modern Approach (есть в переводе)

Начинать можна с этой книги: Toby Segaran, Programming Collective Intelligence

Также, советую почитать: Sean Luke, Essentials of Metaheuristics
Прикольно :) Насколько я понял, у вас были различные персонажи? Вы обучали интеллект каждого персонажа по отдельности, или всех вместе одновременно?
Спасибо Вам за идею. Уже пробовал :-) Если схематически изобразить, то я реализовывал такую схему:

Такая структура позволяет «запоминать» предыдущие входные значение. Агенты, действительно, начинают меньше «смотреть по сторонам»
Это сработает только в случае, если еда передвигается.

Хотя, если немного обобщить Ваше предложение, то следует упомянуть что в некоторых случаях, в недетерминированной среде — рандомизированная стратегия поведения позволяет достичь неплохих результатов.
да
(наверное, следовало по-другому нарисовать картинку со схематическим изображением нейронной сети)
Способность агента получать информацию о среде ограничивается «областью видимости» — грубо говоря, агент может видеть только впереди себя.

Спасибо за Вашу идею, но по этому поводу у меня немного иная точка зрения:
Такое поведение является эффективным, поскольку всегда есть вероятность, что, пока агент приближается к цели, то какой-нибудь другой агент может съесть эту частицу еды, или на пути к цели появится новый кусочек еды, который можно съесть быстрее.

Когда агенты «крутятся» туда-сюда, то они, соответственно, имеют больший угол обзора окружающей среды, и есть шанс заметить появившийся рядом кусочек еды (а значит — собрать больше пищи). Я ещё картинку приводил
Как я отмечал в начале статьи — у меня нету жёстко заданной топологии сети. Фиксированное только количество нейронов

Я экспериментировал, подавая на вход нейронной сети информацию как про одного так и про нескольких (2 и 3) ближайших агентов. Внешне — результаты довольно похожи.

На видео, можно заметить, когда агенты передвигаются стайками, то некоторые из них разворачиваются и начинают двигаться в противоположном направлении — вот так, косвенно, можно наблюдать взаимное влияние агентов
Спасибо Вам за идею. Я уже кое-что пробовал :-) Если эти два решения скрестить, то, как раз, получим Santa Fe Trail
Я на днях изменял парсер входного файла, немного накосячил. Уже пофиксил.
Обновите, пожалуйста, symbolic_regression_1.0.jar (отсюда)
Провёл эксперимент по аппроксимации синуса, без использования тригонометрических функций (используя только операции складывания, вычитания, умножения, деления, возведения в степень и взятия корня)

Исходный файл с тренировочными данными
# allowed functions are: ADD SUB MUL DIV SQRT POW LN SIN COS
# set which functions to use:

ADD SUB MUL DIV SQRT POW

# looking for:

f(x) - ?

# define training set:

f(-5) = 0.958924275
f(-4.6) = 0.993691004
f(-4.2) = 0.871575772
f(-3.8) = 0.611857891
f(-3.4) = 0.255541102
f(-3) = -0.141120008
f(-2.6) = -0.515501372
f(-2.2) = -0.808496404
f(-1.8) = -0.973847631
f(-1.4) = -0.98544973
f(-1) = -0.841470985
f(-0.6) = -0.564642473
f(-0.2) = -0.198669331
f(0) = 0
f(0.2) = 0.198669331
f(0.6) = 0.564642473
f(1) = 0.841470985
f(1.4) = 0.98544973
f(1.8) = 0.973847631
f(2.2) = 0.808496404
f(2.6) = 0.515501372
f(3) = 0.141120008
f(3.4) = -0.255541102
f(3.8) = -0.611857891
f(4.2) = -0.871575772
f(4.6) = -0.993691004

threshold = 0.5


В результате — получил полином, который аппроксимирует функцию синуса на заданном промежутке:

f(x) = ((x * (((-28.637448958589324) + (x * x)) / ((21.239955408627964 / (x + (-3.2072451559334034))) / (3.3336507016309875 + x)))) / 16.2284520613964)



Лог эксперимента

Start time is: Mon Dec 24 21:20:27 EET 2012

f(x) = ((x * 3.1630717262131376) / (-55.751683077133))
1        12.470828286593806
2        12.470828286593806

f(x) = ((x * 3.1630717262131376) / (-55.76553839255925))
3        12.47082827728798
4        12.47082827728798

f(x) = ((x * 0.9949679900764461) / (-17.541037248840254))
5        12.470828274502146
6        12.470828274502146

f(x) = ((x * ((x / 0.24485475450143368) / (9.854722419372969 / (0.1785463411440209 + x)))) / (-51.49422863193457))
7        9.308217623905621

f(x) = ((x * ((x / 0.40104184749153204) / (6.4182649499699105 / (0.052399290993697 + x)))) / (-47.34388178550898))
8        9.302841405933153
9        9.302841405933153

f(x) = ((x * ((x / 0.24485475450143368) / (9.854722419372969 / (0.05192548614521364 + x)))) / (-50.350061089343605))
10       9.302817992891397

f(x) = ((x * ((x / 0.24485475450143368) / (9.854722419372969 / (0.07142331100659893 + x)))) / (-50.350061089343605))
11       9.302771398232064
12       9.302771398232064
13       9.302771398232064

f(x) = ((x * ((x / 2.0533282898391576) / (1.8715544471864307 / (0.07135632922700297 + x)))) / (-31.597742741151393))
14       9.302769883027961
15       9.302769883027961
16       9.302769883027961
17       9.302769883027961
18       9.302769883027961
19       9.302769883027961
20       9.302769883027961
21       9.302769883027961
22       9.302769883027961
23       9.302769883027961

f(x) = ((x * ((x / 2.0533282898391576) / (1.8715544471864307 / (0.06551706960346748 + x)))) / (-31.604995146547317))
24       9.30276797484784
25       9.30276797484784
26       9.30276797484784
27       9.30276797484784
28       9.30276797484784
29       9.30276797484784

f(x) = ((x * (((x / 8.857722754797118) / (2.6551707309632526 / (x + 35.42462283671099))) / (5.464423135144728 / ((-0.39500736529583036) + x)))) / (-32.659737034898576))
30       9.302210185277525

f(x) = ((x * ((6.680648069500437 / (2.6551707309632526 / (x + 3.6592487400627496))) / (2.6443709583155646 / ((-3.5578768847585587) + x)))) / (-30.830217950916406))
31       3.4255888723788033
32       3.4255888723788033
33       3.4255888723788033
34       3.4255888723788033
35       3.4255888723788033
36       3.4255888723788033
37       3.4255888723788033

f(x) = ((((-3.4499225016535195) + x) * (x / (1.2515222248502815 / (3.7938656508895163 + x)))) / (-25.109433521560973))
38       3.405619015538551

f(x) = ((x * (((-3.482346082966841) + x) / (1.1253837525672576 / (3.714227703825927 + x)))) / (-28.336457289208397))
39       3.377886419645044

f(x) = ((x * ((3.735514032671002 + x) / (1.520701195188931 / ((-3.5390881257410745) + x)))) / (-20.512481273437082))
40       3.3675017425027374
41       3.3675017425027374

f(x) = ((x * (((-3.5325640324244243) + x) / (1.1178824947277812 / (3.7667842805750538 + x)))) / (-27.918607440362756))
42       3.366320705519485
43       3.366320705519485

f(x) = ((x * ((21.57790360307947 + x) / ((15.591683015361514 / ((-3.5424250936223514) + x)) / (3.6225272226680865 + x)))) / (-41.57688526816358))
44       3.1012409075624583
45       3.1012409075624583

f(x) = ((x * ((3.572817532610448 + x) / ((22.584809854422687 / (18.974396425768152 + x)) / ((-3.5747295662481573) + x)))) / (-25.32540014476279))
46       3.0771318820680706
47       3.0771318820680706
48       3.0771318820680706
49       3.0771318820680706
50       3.0771318820680706
51       3.0771318820680706

f(x) = ((x * ((3.572817532610448 + x) / ((24.667037538178697 / (x + 18.170833314646938)) / ((-3.6144452483304836) + x)))) / (-21.871869029168302))
52       3.0584324507379494
53       3.0584324507379494
54       3.0584324507379494
55       3.0584324507379494
56       3.0584324507379494
57       3.0584324507379494
58       3.0584324507379494
59       3.0584324507379494
60       3.0584324507379494
61       3.0584324507379494
62       3.0584324507379494
63       3.0584324507379494
64       3.0584324507379494
65       3.0584324507379494
66       3.0584324507379494
67       3.0584324507379494
68       3.0584324507379494
69       3.0584324507379494
70       3.0584324507379494
71       3.0584324507379494

f(x) = ((x * (((-11.347781713226535) + (x * x)) / ((26.70985281041323 / (5.9405385441572705 + x)) / ((-6.365654381745506) + x)))) / 22.788185829488683)
72       0.7608948240547206
73       0.7608948240547206
74       0.7608948240547206
75       0.7608948240547206
76       0.7608948240547206

f(x) = ((x * (((-11.008088011418987) + (x * x)) / ((25.422465316844516 / (x + 5.833553150936389)) / ((-5.788920923994368) + x)))) / 19.641063491031723)
77       0.5114211104584352
78       0.5114211104584352
79       0.5114211104584352
80       0.5114211104584352
81       0.5114211104584352
82       0.5114211104584352
83       0.5114211104584352
84       0.5114211104584352
85       0.5114211104584352

f(x) = ((x * (((-28.637448958589324) + (x * x)) / ((21.239955408627964 / (x + (-3.2072451559334034))) / (3.3336507016309875 + x)))) / 16.2284520613964)
86       0.2643748704212682

Best function is:
f(x) = ((x * (((-28.637448958589324) + (x * x)) / ((21.239955408627964 / (x + (-3.2072451559334034))) / (3.3336507016309875 + x)))) / 16.2284520613964)

End time is: Mon Dec 24 21:22:13 EET 2012


Эксперименты, с различными ограничениями на максимальную глубину дерева ещё в процессе

Information

Rating
Does not participate
Registered
Activity