Платформа для построения алгоритмов машинного обучения, основанных на правилах

1И.Г. Казовский

ПЛАТФОРМА ДЛЯ ПОСТРОЕНИЯ АЛГОРИТМОВ МАШИННОГО ОБУЧЕНИЯ, ОСНОВАННЫХ НА ПРАВИЛАХ

Цель статьи - описание программы, представляющей собой универсальную платформу для разработки, отладки и сравнения алгоритмов машинного обучения, основанных на правилах. В статье рассматриваются общие вопросы организации платформы, ограничения, накладываемые на выполнимые в рамках данной платформы алгоритмы. Автором также приводится пример обучения системы при помощи ДСМ-метода на двух разных типах объектов.

Ключевые слова: платформа, алгоритмы машинного обучения, основанные на правилах, системонезависимость, инвариантность относительно типа данных, инвариантность относительно алгоритма.

Введение

Написанная программа представляет собой интегрированную платформу для построения систем анализа данных, основанных на правилах1. Платформа предоставляет объектную модель для реализации как систем анализа данных, так и структуры самих данных. Это позволяет проводить эксперименты не только с различными системами, но и с различными представлениями данных при работе с одной системой.

Нельзя сказать, что раньше подобных программ не создавалось. Но ни одна из них не претендует на такую степень универсальности. Существующие аналоги почти всегда основаны на готовом наборе алгоритмов. В основном этот набор исчерпывающий и добавить новые алгоритмы нельзя, хотя бывают исключения (например, ЛЗБШЬ, но его рассмотрим особо). Также большинство аналогичных систем накладывают какие-либо ограничения как на структуру данных, так и на системы анализа данных.

© Казовский И.Г., 2011

Также следует отметить, что практически все подобные программы либо являются непереносимыми, либо их надо собирать для каждой конкретной платформы (кроме написанных на языке Java). Представленная в данной работе платформа написана на языке C# и разработана под mono, что делает ее почти столь же переносимой, как и программы, написанные на языке Java. С другой стороны, среда исполнения mono исполняет код IL, что позволяет писать модули к платформе на любом языке высокого уровня, компилируемом в IL.

Предшественники

1. ASDIEL

Система ASDIEL ориентирована на подбор композиции алгоритмов для решения какой-либо конкретной задачи классификации или распознавания2. В системе реализовано множество алгоритмов, и она нацелена на работу в основном с ними.

Для запуска пользовательского модуля в данной системе необходимо написать динамическую библиотеку на языке C или C++. Этот подход порождает множество неудобств при необходимости отладки пользовательского модуля.

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

- набор пар объектов;

- набор моментов времени (в динамических задачах);

- набор функций над парами объектов (расстояния, отношения и т. д.);

- набор свойств признаков (информативности, средние значения и т. д.);

- набор функций над парами признаков (близости, корреляции и т. д.);

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

Затем декартовым произведениям некоторых из введенных наборов сопоставляются массивы, предназначенные для хранения и представления данных2.

Спорным моментом системы ASDIEL можно считать то, что она обладает собственным интерпретируемым языком для написания

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

2. QuDA

Система QuDA осуществляет интеллектуальный анализ данных по встроенным алгоритмам анализа формальных понятий, ДСМ-метода и др.3, 4 Каждый алгоритм имеет свои настройки, которые пользователь может изменить, открыв соответствующую форму. Обилие встроенных алгоритмов порождает обилие форм настроек этих алгоритмов, что либо увеличивает размер самой программы, либо усложняет код.

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

Система написана на языке Java, что можно отнести к достоинствам. Язык Java является действительно кроссплатформенным, однако сама система не предусматривает дополнений и расширений. Пользователь может добавлять новую функциональность только встраивая ее в проект на этапе сборки.

3. Weka5

Система Weka, как и QuDA, написана на языке Java, однако в отличие от нее, имеет подробное руководство пользователя.

К плюсам системы Weka можно также отнести модульность -система предоставляет пользователю возможность написать свой алгоритм анализа данных и встроить его в систему во время исполнения (run-time).

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

4. Прочие решатели

Существует большое количество реализаций отдельных систем анализа данных, но они нацелены на решение одной конкретной задачи или класса задач, поэтому мы их не будем здесь рассматривать.

Описание системы анализа данных

Поскольку каждая система анализа данных работает с множеством данных, то среда содержит подсистему управления множеством объектов, и, чтобы реализовать новую систему анализа данных, необходимо задать только алгоритм работы с этим множеством. Для описания этого алгоритма можно попробовать обойтись настройками подсистемы управления множеством объектов только через графический интерфейс. Но тогда либо интерфейс будет чрезмерно сложен, либо класс алгоритмов, реализуемых в рамках данной среды, будет слишком узким. Поэтому возможны два варианта -использовать модули расширения среды или встроить в систему интерпретируемый язык подсистемы управления данными. Сама среда написана на языке C#, что позволяет писать модули на языках высокого уровня (на любом языке, компилируемом в IL).

Средствами API невозможно добиться такой же гибкости, как скриптовым языком. Чтобы сделать среду максимально универсальной, было решено использовать уже существующую систему управления данными. Наиболее естественный путь - встроить в среду какую-либо СУБД. Это возможно, но сильно увеличивает размер программы и ее требования к аппаратной части. Кроме того, языки управления СУБД - процедурные (в большей или меньшей степени), а это усложняет описание правил в данном языке.

Можно написать свой язык сценариев и, соответственно, свой интерпретатор этого языка. Однако это нерационально по двум причинам:

- разработка адекватного языка (и его интерпретатора) - задача далеко не тривиальная и довольно продолжительная по времени;

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

Гораздо удобнее со всех точек зрения - встроить в среду язык логического программирования (такой, как Prolog или CLIPS).

Интерпретатор языка Prolog осуществляет резолютивный вывод в логике дизъюнктов Хорна методом обратного логического вывода (backward chaining), т. е. от резольвенты к начальным посылкам6. Prolog, как и многие системы с обратным выводом, не сохраняет промежуточных результатов. Это существенно экономит память, но очень плачевно сказывается на времени выполнения программы. Такие особенности языка Prolog накладывают ограничения на область применения использующей его среды.

В обсуждаемую в данной работе среду встроен скриптовый язык, а именно CLIPS7. Он позволяет задавать разные системы вывода (на классической и неклассической логике), что только добавляет гибкость среде. В отличие от языка Prolog и его потомков, интерпретатор языка CLIPS осуществляет вывод методом прямых рассуждений (forward chainig), сохраняя промежуточные результаты, что, конечно, занимает память, но увеличивает производительность (иногда довольно существенно).

При описании правил вывода в логике предикатов часто определяются новые операции над объектами. Интерпретатор CLIPS допускает определение новых, пользовательских, функций (User-Function8). Кроме того, язык CLIPS имеет объектно-ориентированное расширение - COOL. В предлагаемой среде эти возможности сохранены. Таким образом, описание правил на языке CLIPS может содержать как описание новых операций (на языке CLIPS, например, с помощью конструкции deffunction, или в .NET-модуле через API среды), так и описание типов данных (также либо на расширении языка CLIPS - на языке COOL, либо во внешнем модуле на .NET-языке).

Далее, под языком CLIPS будем понимать как собственно CLIPS, так и его расширение COOL. Реализацию .NET-модуля, расширяющего язык CLIPS, будем называть CLIPS-модуль, а описание правил на языке CLIPS и модуля (возможно пустого) - стратегией.

Модельная задача для такой среды - ДСМ-метод порождения гипотез. Метод применим для широкого класса задач и использует правдоподобные рассуждения при порождении гипотез. Правила рассуждений описываются на языке логики предикатов и легко переписываются на язык CLIPS. Для проверки работы метода можно использовать объекты с примитивной структурой и простым поведением.

Пример системы анализа данных

В качестве примера рассмотрим ДСМ-метод порождения гипотез (как уже отмечалось выше, это модельная задача для среды), предложенный В.К. Финном9. Подробное описание ДСМ-метода также можно найти в работах10, 11.

В рамках данной работы для краткости опишем только алгоритм упрощенного ДСМ-метода без запрета на контрпример. Для описания алгоритма сделаем несколько допущений. Пусть

• О - коллекция объектов обучения;

• Р - коллекция целевых свойств;

• S - коллекция возможных причин наличия / отсутствия свойств объектов (далее для краткости будем считать, что возможные причины - элементы структуры объектов);

• у класса «объект обучения» определен метод Similarity, возвращающий результат операции сходства двух объектов -возможную причину наличия / отсутствия свойств(а);

• класс «возможная причина» определяет метод IsIn, который возвращает true, если данная причина содержится в объекте, переданном в качестве аргумента, и false в противном случае;

• определено перечисление InternalTruthValues (типы внутренних истиностных значений) как:

True = +1 (фактически истинно);

False = -1 (фактически ложно);

Contradictory = 0 (фактически противоречиво);

Uncertain = ? (не определено);

• у классов «объект обучения» и «возможная причина» определен оператор индексирования ([,]), который в качестве параметра принимает целевое свойство и возвращает или устанавливает значение типа InternalTruthValues.

Теперь определим алгоритмы вывода и запишем их на псевдокоде следующим образом.

1. Алгоритм порождения гипотез о возможных причинах

foreach in O {

foreach o2 in O where o1 != o2 {

foreach p in P {

if(o1[p] == o2[p] && o1[p] != Uncertain) { s = o1.Similarity(o2);

foreach o in O where o != o1 && o != o2 { if(o[p]!= Uncertain &&

o[p] != o1[p] && s.IsIn(o)) { s[p]= Contradictory; gotoNextStep;

}}

s[p]= o1[p];

NextStep :

S.Add(s);

}}}}

2. Алгоритм порождения гипотез о наличии или отсутствии целевых свойств

foreach s in S {

foreach p in P where s[p] != Uncertain { foreach o in O where o[p] == Uncertain { if(s.IsIn(o)) {

foreach s1 in S where s != s1 && s[p] != s1[p] {

if(s1 .IsIn(o)) gotoContr; }} 1

o[p] = s[p]; continue;

Contr :

o[p] = Contradictory;

}}}

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

1. Стратегия

Опишем на языке CLIPS правила обучения. Для начала определим шаблон объекта и причины:

)

Слот id будет содержать объект (точнее ссылку на .Net-части описания объекта), data-type - SYMBOL, указывающий тип факта (объект или причина), мультислот properties - множество свойств объекта.

Правила, записанные на языке CLIPS, будут выглядеть следующим образом:

(defrule reason-search

=>

(assert

)

)

(defrule refill-knowledge-base

?f <-

=>

)

Функции similarity, get-properties, is-in, change-property, очевидно, являются функциями пользователя. Реализацию их прототипов переложим на C#-модуль.

Еще один момент, который был сознательно опущен выше, но который необходимо упомянуть - каждый объект, удовлетворяющий первому шаблону из левой части правила reason-search, удовлетворяет и второму шаблону, и наоборот. То есть для двух разных объектов o1 и o2 система CLIPS дважды применит правило reason-search - один раз для пары (o1, o2), а второй раз для пары (o2, o1). Чтобы этого не происходило, введем еще один тип факта и изменим правило reason-search следующим образом:

)

(defrule reason-search

=>

(assert (Analyzed (first ?x1)(second ?x2))) (bind ?x (similarity ?x1 ?x2)) (if (neq ?x FALSE) then (bind $?p (get-properties ?x)) (assert

)

)

2. .Net ДСМ-модуль

Прежде всего необходимо прототипировать внешние для интерпретатора CLIPS функции. Чтобы система анализа данных корректно встроила прототипы функций, CLIPS-модуль должен содержать реализацию некоторых интерфейсов и наследников классов.

Класс, расширяющий базовый набор функций языка CLIPS, должен наследоваться от класса BaseClasses.Education.Engine и реализовывать два абстрактных метода: RegistrateFunctions и UnregistrateFunctions. Первый метод вызовется автоматически в конструкторе базового класса, поэтому, в частности, в конструктор передается экземпляр класса BaseClasses.CLIPS. CLIPSProvider - обертка (wrapper) вокруг .NET окружения CLIPS (CLIPSNet.Environment). Второй метод вызывается тоже автоматически, при вызове метода BaseClasses.Education. Engine.Dispose() .

Чтобы зарегистрировать обработчик новой функции пользователя, необходимо вызвать метод RegistrateFunction экземпляра класса CLIPSNet.Environment. Первый параметр - имя функции, второй - делегат (System.Delegate), реализующий саму функцию. Указанный делегат должен принимать параметры только типов, унаследованных от типа CLIPSNet.CLIPSDataTypes. DataType, и возвращать значение только типа, реализующего интерфейс CLIPSNet.CLIPSDataTypes.IDataType.

2.1. Similarity

Исходя из вышеописанных правил функция Similarity должна возвращать символ FALSE, если сходство объектов пустое, или идентификатор созданного объекта - причины. В варианте библиотеки CLIPS, написанной на языке C, есть возможность передать в окружение CLIPS указатели на внешние объекты. В библиотеке CLIPSNet подобная функциональность инкапсулирована в классе CLIPSDataTypes.ExternalObject. Описание метода Similarity на C# будет выглядеть так:

public IDataType Similarity(ExternalObject eo1,

ExternalObject eo2) {2

JSM.Object o1 = (JSM.Object)eo1 .Value; JSM.Object o2 = (JSM.Object)eo2 .Value; JSM.Peculiarity o = ol.Similarity (o2); if(o == null || peculiarities.Contains(o)) return new Symbol(«FALSE»);

peculiarities.Add(o); //peculiarities - список причин

return new ExternalObject(o); }

А регистрация этой пользовательской функции в окружении CLIPS так:

protected override void RegistrateFunctions() {

CLIPSNet.Environment env = CLIPSProvider. Environment;

env.RegistrateFunction(«similarity»,

new LikeDelegate(Similarity));

}

Из приведенного выше описания метода Similarity следует требование к классу JSM.Object - он должен содержать определение операции сходства. Эта операция должна выдавать причину свойств объектов, если свойства определены и равны у обоих объектов, или null в противном случае.

2.2. GetProperties

Исходя из описания стратегии эта функция должна возвращать список свойств объекта. Поскольку свойств может быть несколько, то делегат, реализующий эту функцию, должен возвращать объект типа CLIPSNet.CLIPSDataTypes.Multifield - коллекцию объектов, реализующих интерфейс CLIPSNet.CLIPSDataTypes. IDataType.

public Multifield GetProperties(ExternalObject eo) {

Object o = (Object)eo.Value; PropertyCollection pc = o.Properties; Multifield mf = new Multifield();

foreach(IProperty p in pc) {

mf.Add(new Symbol(p.Name));

mf.Add(new CLIPSNet.CLIPSDataTypes.

String(p.ValueToString()));

}

return mf;

}

Нетрудно увидеть, что объект записывается в Multifield в виде пар «имя - значение».

2.3. IsIn

IsIn - метод, позволяющий определить, содержится ли возможная причина в объекте. А поскольку на данном этапе разработки ДСМ-системы нам ничего не известно про структуру объектов, то оставим определение этого метода реализациям прикладных систем.

public CLIPSDataTypes.Boolean Is In(ExternalObject eo1(

ExternalObject eo2)

{

}

Peculiarity p = (Peculiarity)eo1.Value; Object o = (Object)eo2.Value;

return new CLIPSNet.CLIPSDataTypes.Boolean(p. IsIn(o));

2.4. ChangeProperty

Эта функция изменяет свойства объекта и возвращает все свойства объекта в виде списка (multifield в CLIPS или CLIPSNet. DataTypes.Multifield - в С#).

public Multifield ChangeProperty(ExternalObject eo1f

ExternalObject eo2) {2

Object o = (Object)eo1.Value; Peculiarity p = (Peculiarity)eo2.Value;

foreach(IProperty ip in p.Properties) {

((Property)o.Properties[ip.Name]).

ChangeTo(ip.ValueToString()); PropertyCollection pc = o.Properties; Multifield mf = new Multifield();

foreach(IProperty p in pc) {

mf.Add(new Symbox (p.Name));

mf.Add(new CLIPSNet.CLIPSDataTypes.String(

p.ValueToString()));

}

return mf;

}

}

2.5. JSM.Object и JSM.Peculiarity

Теперь, исходя из требований, предъявленных выше к классам JSM.Object и JSM.Peculiarity, можно описать их структуру примерно так (ограничимся словесным описанием второстепенных методов и классов или вовсе опустим их):

public interface ISimilar {

ISimilar Similarity(ISimilar il);

}

public abstract class Object : ISimilar {

protected PropertyCollection properties;

public PropertyCollection Properties {

get { return properties; } }

public Object() {

properties = new PropertyCollection(); }

public abstract string ValueToString();

public ISimilar Like(ISimilar c) {

return Similarity((Object)c); }

public abstract Peculiarity Similarity(Object o);

}

public abstract class Peculiarity : Object {

public abstract bool IsIn(Object o);

}

Класс Property - описывает целевое свойство, а Property Collection - множество целевых свойств. Поскольку значения це-

левых свойств могут быть разных типов, заранее неизвестных, то сам класс Property - Generic-класс, а класс PropertyCollection содержит элементы типа интерфейса IProperty (который, в частности, реализуется классом Property).

Внутренние истиностные значения ДСМ-метода определим в виде перечисления:

public enum InternalValues {

False = (int)'-', True = (int)'+', Contradictory = (int)'O', Uncertain = (int)'?'

}

Тестовые задачи

1. Определение рода слова

Построив модель, теперь перейдем к описанию данных. Пусть дано множество слов. Слова могут быть только женского или неженского рода. Пусть в этом множестве есть несколько слов, помеченных как слова женского рода, и несколько слов, помеченных как слова неженского рода. Определим операцию сходства двух слов, результат выполнения которой равен последней букве этих слов, если они совпадают, в противном случае FALSE. Задача состоит в том, чтобы найти все признаки рода и по ним определить род всех непомеченных слов (проект SexDerminer).

Пусть дан список слов, для которых известен род.

Слово Женский род Слово Женский род

Palka + Oko -

Caplja + Liko -

А для слов luna, duga, reka, lozka, polka, stenka, ruchka, krishka, pulja, kopalka, veko, varevo, ruka, duga, steklo, dulja род не известен, и его надо определить.

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

Слово Женский род Слово Женский род

Palka + Oko -

Caplja + Liko -

Luna + Veko -

Duga + Varevo -

Reka + Ruka +

Lozka + Duga +

Polka + Cteklo -

Stenka + Ruchka +

Krishka + Pulja +

Kopalka + Dulja +

2. Определение тематики текста

Пусть дано множество текстов, каждый из которых состоит из пары ключевых слов. Про какие-то тексты известно, что они про оружие, про некоторые другие известно, что они не про оружие. Операцию сходства для двух текстов определим как общее ключевое слово, содержащееся в каждом тексте. Будем также считать, что если немаркированный текст содержит маркированное ключевое слово, то и весь текст становится маркированным. Задача - определить тематику каждого текста и найти и пометить все ключевые слова (проект WeaponTest).

Пусть известно про следующие тексты.

Текст Про оружие Текст Про оружие

(bow, sword) + (mattok, hook) -

(bow, pike) + (hook, plow) -

(sword, pike) + (plow, mattok) -

И пусть есть непомеченные тексты: (bow, crossbow), (sword, crossbow), (crossbow, smallsword), (sword, smallsword), (smallsword, musquet), (smallsword, pistol), (crossbow, musquet), (crossbow, pistol), (musquet, rifle), (pistol, rifle), (rifle, gun), (pistol, gun), (gun, machine-gun), (pistol, machine-gun), (pistol, revolver), (gun, revolver), (hook, scythe), (mattok, scythe), (mattok, plough), (plow, plough), (scythe, cropper), (plough, cropper), (plough, field-engine), (cropper, field-engine).

По завершении работы программа определяет тематику текстов:

Текст Про оружие Текст Про оружие

(bow, sword) + (mattok, hook) -

(bow, pike) + (hook, plow) -

(sword, pike) + (plow, mattok) -

(bow, crossbow) + (hook, scythe) -

(sword, crossbow) + (mattok, scythe) -

(crossbow, smallsword) + (mattok, plough) -

(smallsword, musquet) + (scythe, cropper) -

(smallsword, pistol) + (plough, cropper) -

(crossbow, musquet) + (plough, field-engine) -

(crossbow, pistol) + (cropper, field-engine) -

(musquet, rifle) + (pistol, rifle) +

(rifle, gun) + (pistol, gun) +

(gun, machine-gun) + (pistol, machine-gun) +

(pistol, revolver) + (gun, revolver) +

Попутно с определением тематики текстов определяется и тематика ключевых слов.

Текст Про оружие Текст Про оружие

plow - mattok -

plough - hook -

scythe - cropper -

field-engine - pike +

sword + bow +

crossbow + smallsword +

musquet + pistol +

rifle + gun +

machine-gun + revolver +

Дальнейшее развитие

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

- Производительность. Понятно, что речь идет не только о тактах процессора, но и о сложности алгоритма, количестве выходов из среды CLIPS, количестве вызовов системных функций и т. д. Производительность должна измеряться по разным параметрам - не только системным. Будут реализованы API среды для профилирования пользовательских функций системы CLIPS и базовая подсистема профилирования выполнения правил анализа данных.

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

Раз унифицируются способы задания структуры данных, то должна унифицироваться и процедура инициализации данных. То есть должна быть возможность для разных задач задать входные данные в одном формате. Соответственно, встает вопрос о подсистеме инициализации данных. Подсистема должна будет читать входной файл (поток, базу данных) и инициализировать базу фактов и, возможно, автоматически генерировать новые типы для описания и хранения введенных данных. После окончания анализа подсистема будет записывать результаты в выходной поток.

Ну и наконец, в дальнейшем графические средства платформы будут только улучшаться (в частности, в планах создание встроенного редактора для языка CLIPS и для .NET-модуля).

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

Примечания

i

2

Исходные коды доступны по адресу: URL: http://sourceforge.net/projects/ mlplatform (дата обращения: 20.12.2010).

См.: Язык описания алгоритмических композиций ASDIEL. [Электронный ресурс] // Сайт «Распознавание, Классификация, Прогнозирование». [М., 2010]. URL: http://www.ccas.ru/frc/asdiel.html (дата обращения: 20.12.2010). См.: Eklund Peter W. Concept Lattices // Second International Conference on Formal Concept Analysis, ICFCA 2004, Sydney, Australia, February 23-26, 2004. Proceedings. 2004. Springer. 428 p.

См.: Grigoriev P.A., Yevtushenko S.A. QuDA: Applying Formal Concept Analysis In a Data Mining Environment. Berlin: Springer, 2004.

См.: BouckaertR.R., Frank E., Hall M., Kirkby R., Reutemann P., Seewald A., Scuse D. WEKA Manual for Version 3-6-1. June 4. New Zealand, Hamilton: University of Waikato, 2009.

См.: Пролог (язык программирования) [Электронный ресурс] // Сайт Википедия. [М., 2010]. URL: http://ru.wikipedia.org/wiki/Prolog (дата обращения: 20.12.2010).

Библиотека CLIPSNet [Электронный ресурс] // Сайт Sourceforge. [USA, 2010]. URL: http://sourceforge.net/projects/clipsnet (дата обращения: 20.12.2010). См.: CLIPS Reference Manual Volume II Advanced Programming Guide. March 22, 2008.

См.: ДСМ-метод. [Электронный ресурс] // Сайт Википедия. [М., 2010]. URL: http://ru.wikipedia.org/wiki/ДСМ-метод (дата обращения: 20.12.2010). Финн В.К. О машинно-ориентированной формализации правдоподобных рассуждений в стиле Ф. Бэкона - Д.С. Милля // Семиотика и информатика. 1983. Вып. 20. С. 35-101.

Аншаков О.М., Скворцов Д.П., Финн В.К. О дедуктивной имитации некоторых вариантов ДСМ-метода автоматического порождения гипотез // Семиотика и информатика. 1993. Вып. 33. С. 164-233.

3

4

5

6

7

8

9

10