Сценарий
Я пытаюсь реализовать контролируемое обучение для набора данных в приложении Java GUI. Пользователю будет предоставлен список предметов или «отчетов» для проверки, и он будет помечать их на основе набора доступных ярлыков. Как только контролируемое обучение будет завершено, помеченные экземпляры будут переданы в алгоритм обучения. Это попытается упорядочить остальные элементы по вероятности того, что пользователь захочет их просмотреть.
Чтобы получить максимальную отдачу от времени пользователя, я хочу предварительно выбрать отчеты, которые будут содержать наибольшую информацию о всей коллекции отчетов, и попросить пользователя пометить их. Насколько я понимаю, для расчета этого потребуется найти сумму всех значений взаимной информации для каждого отчета и упорядочить их по этому значению. Обозначенные отчеты из контролируемого обучения затем будут использоваться для формирования байесовской сети для определения вероятности двоичного значения для каждого оставшегося отчета.
Пример
Здесь искусственный пример может помочь объяснить и может устранить путаницу, когда я, несомненно, использовал неправильную терминологию :-) Рассмотрим пример, в котором приложение отображает новости для пользователя. Он выбирает, какие новости показывать в первую очередь, исходя из показанных предпочтений пользователя. Особенности новостей, которые имеют корреляцию: country of origin
, category
или date
. Таким образом, если пользователь помечает отдельную новость как интересную, когда она пришла из Шотландии, он сообщает обучающемуся машине, что существует повышенная вероятность того, что другие новостные истории из Шотландии будут интересны пользователю. Аналогично для такой категории, как Спорт, или для даты, такой как 12 декабря 2004 года.
Это предпочтение можно рассчитать, выбрав любой порядок для всех новостных сообщений (например, по категории, по дате) или случайным образом упорядочив их, а затем рассчитав предпочтение по мере продвижения пользователя. То, что я хотел бы сделать, это получить своего рода «стартовую позицию» по этому заказу, попросив пользователя просмотреть небольшое количество конкретных новостей и сказать, если они им интересуются (контролируемая часть обучения). Чтобы выбрать, какие истории показывать пользователю, я должен рассмотреть всю коллекцию историй. Вот тут и появляется взаимная информация. Для каждой истории я хочу знать, сколько она может рассказать мне обо всех других историях, когда она классифицируется пользователем. Например, если есть большое количество историй, происходящих из Шотландии, я хочу, чтобы пользователь классифицировал (по крайней мере) одну из них. Аналогично для других коррелирующих функций, таких как категория или дата. Цель состоит в том, чтобы найти примеры отчетов, которые, будучи классифицированными, предоставляют наибольшую информацию о других отчетах.
Задача
Поскольку моя математика немного устарела, и я новичок в машинном обучении, у меня возникли проблемы с преобразованием определения взаимной информации в реализацию на Java. Википедия описывает уравнение для взаимной информации как:
Однако я не уверен, что это можно использовать, когда ничего не было классифицировано, а алгоритм обучения еще ничего не вычислил.
Как в моем примере, скажем, у меня было большое количество новых, немаркированных экземпляров этого класса:
public class NewsStory {
private String countryOfOrigin;
private String category;
private Date date;
// constructor, etc.
}
В моем конкретном сценарии корреляция между полями / объектами основана на точном совпадении , так что, например, разность в дате и 10 лет эквивалентна по своему неравенству.
Коэффициенты для корреляции (например, является ли дата более коррелирующей, чем категория?) Не обязательно равны, но они могут быть предопределены и постоянны. Означает ли это, что результат функции p(x,y)
равен предопределенному значению, или я путаю термины?
Вопрос (наконец)
Как я могу осуществить взаимный расчет информации, учитывая этот (фальшивый) пример новостных рассказов? Библиотеки, javadoc, примеры кода и т. Д. - все это полезная информация. Кроме того, если этот подход в корне ошибочен, объяснение, почему это так, будет столь же ценным ответом.
PS. Мне известны такие библиотеки, как Weka и Apache Mahout, поэтому упоминание о них не очень полезно для меня. Я все еще ищу документацию и примеры для обеих этих библиотек, ища материал по Взаимной информации конкретно. Что мне действительно поможет, так это ссылки на ресурсы (примеры кода, javadoc), где эти библиотеки помогают с взаимной информацией.