Листинг 18.3. Программа логического вывода правил вывода
% Обучение на основе простых правил вывода :- ор( 300, xfx, <==) .
I learn{ Class) : собрать учебные примеры в список, сформировать и вывести i описание для класса Class, затем внести в базу данных соответствующее % правило, касающееся класса Class
learnt Class) :- bagof( example( ClassX, Obj) , example( ClassX, Obj |
learnt Examples, Class, Description), nl, write' Class), write(' <== ' ) , nl, writelist( Description), assert ( Class <== Description).
Examples), % Собрать % примеры % Сформировать правило % Вывести правило
% Внести правило в базу данных
% learnt Examples, Class, Description):
% описание Description охватывает точно все примеры класса Class
% в списке. Examples
learnt Examples, Class, []) :-not member( example! Class,
), Examples).
% Нет примеров, которые нужно % было бы охватить описанием
learn( Examples, Class, [Conj I Conjs]) : learn_conj ( Examples, Class, Conj) , remove( Examples, Conj, RestExamples),
learnt RestExamples, Class, Conjs).
% Удалить примеры, которые % соответствуют условию Conj % Охватить описанием % остальные примеры
% learn_conj| Examples, Class, Conj):
% Conj - это список значений атрибутов, которому соответствуют некоторые
% примеры класса Class и не соответствует ни один пример какого-то
% иного класса
learn_conj ( Examples, Class, []) not ( member! example( ClassX, ClassX \== Class), ! .
: -
) , Examples) , % Нет примеров какого-то % иного класса
learn_conj ( Examples, Class, [Cond | Conds]) choose_cond( Examples, Class, Cond) , filter ( Examples, [ Cond], Examplesl), learn_conj( Examplesl, Class, Conds).
: -
% Выбрать значение атрибута
choose_condI Examples, Class, AttVal) :-
findalK AV/Score, score! Examples, Class, AV, Score), AVs),
best! AVs, AttVal). % Атрибут с наилучшей оценкой
Глава 18. Машинное обучение
best([ AttVal/_] , AttVal).
best( [ AVO/SC, AV1/S1 I AVSlist], AttVal) :-
El > SO, !, % Атрибут AVl имеет лучшую оценку, чем AVO
best{ [AV1/S1 ] AVSlist], AttVal)
best( [AVO/SO AVSlist], AttVal).
% filterf Examples, Condition, Examplesl):
Ч список Examplesl содержит элементы списка Examples, которые соответствуют
% условию Condition
filter С Examples, Cond, Examplesl) :-findalH example! Class, Obj) ,
< member С example{ class, Obj) , Examples) , satisfy( Obj , Cond)),
Examplesl).
i remove( Examples, Conj, Examplesl):
удаление из списка Examples тех примеров, которые охвачены условием Conj, % и получение списка Examplesl
remove( [ ], _, [ ]) .
remove [ [example < Class, Obj) I Es], Conj, Esl) :-
satisfy( Obj, Conj) , !, % Первый пример соответствует условию Conj remove ( Es, Conj , Esl) . % Удалить его
remove С IE I Es] r Conj , [E I Esl]) :- % Оставить первый пример в списке remove( Es, Conj, Esl) ,
satisfy{ Object, Conj) :-
not ( member; Att = Val, Conj),
member( Att - ValX, Object) , ValX \—val) .
score( Examples, Class, AttVal, Score) :-
candidate С Examples, Class, AttVal), I Подходящее значение атрибута
filter!' Examples,[ AttVal], Examplesl), % Примеры в списке Examplesl
% соответствуют условию Att = Val
length! Examples!, N1), % Длина списка
count_pos[ Examplesl, Class, NPosl), % Количество положительных примеров
NPosl > 0, % По меньшей мере один положительный
% пример соответствует значению AttVal Score is 2 * HPOSl - Ml.
candidate,- Examples, Class, Att -Val) :-
attribute! Att, Values), % Атрибут
member; Val, values), % Значение
suitable,- Att = Val, Examples, Class).
suitable( AttVal, Examples, class) :-
% По меньшей мере один отрицательный пример не должен соответствовать
% значению AttVal rr.emberf example! ClassX, ObjX) , Examples),
ClassX \== Class, Ч Отрицательный пример, который
not satisfy,- ObjX, [ AttVal]), !. % не соответствует значению AttVal
%coimt_pos( Examples, Class, Я) :
% H - количество положительных примеров класса Class
ccmnt_pos( [] , _, 0) .
count_pos { [example ( ClassX,_ ) ( Examples] , Class, И) : -count_posi Examples, Class, Ml), ( ClassX = Class, !, N is Ni + 1; К = N1) .
424 Часть II. Применение языка Prolog в области искусственного интеллекта
writelist t |
writelistt [X | LJ) :-tab[ 2), write( X) , nl, writelistt L).
Каждый список атрибутов и значений формируется с помощью следующей процедуры: learn_con]( Examples, Class, Conjunction}
Список атрибутов и значений Conjunction наращивается постепенно, начиная с пустого списка, к которому последовательно добавляются условия в следующей форме: Attribute = value
Обратите внимание на то, что в результате список атрибутов и значений становится все более и более конкретным (охватывает все меньше объектов). Список атрибутов и значений является наиболее приемлемым, если он стал настолько конкретным, что охватывает только положительные примеры класса Class.
Процесс формирования подобного конъюнктивного выражения характеризуется высокой комбинаторной сложностью. Каждый раз, когда происходит добавление нового условия, состоящего из атрибута и значения, приходится рассматривать значительное количество возможных вариантов добавления, которое почти столь же велико, как и количество пар атрибутов и значений. При этом невозможно сразу же определить, какой из этих вариантов является наилучшим. Как правило, следует стремиться к тому, чтобы все положительные примеры были охвачены с помощью минимально возможного количества правил, а сами правила были наиболее краткими. Такое обучение может рассматриваться как поиск среди возможных описаний с целью максимального уменьшения длины описания понятия. В связи с высокой комбинаторной сложностью этого поиска обычно приходится прибегать к использованию некоторых эвристических функций. Работа программы, приведенной в листинге 18.3, основана на использовании функции эвристической оценки, которая применяется локально. На каждом этапе к списку добавляется только значение атрибута с наилучшей оценкой, а все остальные варианты сразу же отбрасываются, Поэтому поиск сводится к детерминированной процедуре без какого-либо перебора с возвратами. Такой поиск называют поглощающим, или жадным (greedy), а также поиском по принципу "подъема к вершине" (hill-climbing). Он рассматривается как поглощающий, поскольку всегда предусматривает выбор наиболее перспективной альтернативы, не оставляя шансов для других вариантов выбора. Но при такой организации поиска существует риск, что не будет обнаружено кратчайшее описание понятия.
Эвристическая оценка является простой и основана на следующем интуитивном наблюдении: полезное условие, заданное в виде атрибута и значения, должно позволять хорошо отличать друг от друга положительные и отрицательные примеры. Поэтому оно должно охватывать максимально возможное количество положительных примеров и минимально возможное нрличество отрицательных примеров. На рис. 18.9 проиллюстрированы принципы работы такой эвристической функции оценки. Функция, применяемая в рассматриваемой программе, реализована в виде следующей процедуры: score[ Examples, Class, AttributeValue, Score}
где Score — разница между количеством охваченных положительных и отрицательных примеров.
Программа, приведенная в листинге 18.3, может быть вызвана на выполнение для создания некоторого описания класса для примеров, приведенных в листинге 18.1,с помощью следующего запроса:
?- learnt nut), 1еагп( key), learnf scissors). nut < = =
[ shape = compact, holes = 1] key < = =
Глава 18. Машинное обучение
[ shape - other, size = small] ( holes = 1, shape = lor.g] scissors <= [ holes = 2, size = large] |
Рис. 18.9. Эвристическая оценка значения атрибута; где 90S — множество положительных примеров изучаемого класса. NEG — множество отрицательных примерна этого класса. Затененная область. ATTVAL, представляет множество объектов, которые удовлетворяют условию, заданному в еиде атрибутов и значении. Эвристическая оценка значения атрибута определяется как разница между количеством положительных примеров в области ATTVAL и количеством отрицательных примеров в этой области
Кроме того, процедура learn вносит правила, касающиеся соответствующих классов в программе, в базу данных. Эти правила могут использоваться для классификации новых объектов. Соответствующая процедура распознавания, в которой применяются усвоенные описания, приведена ниже, classify[ Object, Class) :-
Class <= = Description, % Правило, касающееся класса Class,
1 полученное путем обучения
member! conj, Description), % Конъюнктивное условие
satisfy! Object, conj). % Объект Object удовлетворяет условию Conj