Corvid Exsys на примере проекта недвижимости

В данной статье я наглядно показываю пример создания интеллектуальной систему поиска при купле/продажи жилых квартир и домов.

Теория

Я уже писал что такое ИС, и что это не тот "расширенный поиск" которые видны на kv.ee и city24.ee, скорей dom.ru и gdeetotdom.ru, propsmart, zillow, cazoodle потому что поиск должен быть не только многопараметрическим но и "взвешенным", как будто клиента опрашивал бы живой человек, эксперт в своей области.

Агент - аппарат или программа, способная действовать в интересах целей, поставленных перед ним пользователем или владельцем Mike Wooldridge

Язык входа и выхода

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

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


Возможные переменные
Квартира (База данных), по важности Человек
  • Цена / цена за метр2
  • Местонахождение / Расстояние от центра
    • Географические координаты / Адрес
    • Район / Инфраструктура
    • Уровень шума / Чистота воздуха / Близость моря, реки / Вид из окна / Солнечная сторона / Готовящееся рядом строительство
  • Постройка
    • Дерево / Панельный / Кирпич / Монолит
    • Состояние квартиры
      • Нужен ремонт частичный / капитальный / антисанитария
      • Реновировано
      • Евроремонт
      • Строится
    • Состояние дома / Возраст
    • Стеклопакет
  • Дом
    • Площадь прилегающей территории
    • Тип канализации / газовая трасса
    • Гараж / Сад / Огород / Бассейн / Ландшафт / Спортивный тренажер / Бильярд
    • Близость дороги / автобусных, ЖД стоянок и возкалов
  • Квартира
    • Лифт / состояние подъезда
    • Балкон / Лоджия / Застеклённость
    • Парковка
    • Этаж / Число этажей
    • Жилая площадь / объём
    • Число комнат / планировка
    • Ванна и туалет объединены
      • Сантехника
    • Подвал / Сауна
    • Открытая кухня / площадь кухни
    • Покрытие пола / Двери
  • Отопление
    • газовое / электрическое / центральное
    • камин
  • Связь
    • Интернет, скорость
    • Телевидение, число каналов
  • Безопасность
    • Закрытый подъезд / площадка
    • Сигнализация / видео наблюдение
    • Служба охраны / администратор
    • Статистическая криминальность района
  • Цена / Готовность тратить в месяц
  • Семья
  • Автомобиль
  • Срочность переезда (время оформления)
  • Профессия
  • Возраст / День рождения
    • Университет
    • Фирма/Работа
      • Работает дома?
      • Художник
    • Пенсионер
  • Характер / Образ жизни
    • Аккуратность / Общительность
      • Мода / Дискотеки/ Кафе
      • Гостеприимен / Классика
      • Аскетизм / Уединённость
    • Активен / Самостоятелен
      • Животные
      • Спорт
      • Кулинар
      • Строитель

 

Определение целевой аудитории

Зодиакальные характеристики в Sims 2
Zodiac Sign Neat Outgoing Active Playful Nice
Aries 5 8 6 3 3
Taurus 5 5 3 8 4
Gemini 4 7 8 3 3
Cancer 6 3 6 4 6
Leo 4 10 4 4 3
Virgo 9 2 6 3 5
Libra 2 8 2 6 7
Scorpio 6 5 8 3 3
Sagittarius 2 3 9 7 4
Capricorn 7 4 1 8 5
Aquarius 4 4 4 7 6
Pisces 5 3 7 3 7

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

Группировать аудиторию можно по разным признакам, в зависимости от вашей цели:

  • Антропологически - мало зависящие от человека параметры (физиогномика, привлекательность, телосложение, состояние здоровья, группа крови, раса, национальность)
  • Культурно (религия, политика, искусство, одежда и внешний вид, хобби, спорт, музыка, литература, кино, кругозор знаний)
  • Психологически (эмоциональность, аккуратность, гуманизм, концептуализм, экстраверт-интроверт)
  • Социально - статус и отношения с другими людьми (популярность, класс - воины/торговцы/интеллигенция, семья, этикет)
  • Экономически (профессия, заработок, капитал, место жительства)
  • Интеллектуально (образование, авторитетность, профессия, IQ)
  • Исторически и географически по принципу "здесь и сейчас" (язык, поколение, возраст) в том числе - совместный опыт (одноклассники, однокурсники, однополчане, сокамерники, соседи, коллеги)

А если вы видели "Futurama", то заметили насколько различны характеры у персонажей. В действительности они характеризуют разные психотипы, тоесть устойчивые черты характера. Характер как и рост формируется до 20 лет и неустойчивые черты просто отторгаются, а комбинация оставшихся и описывает психотип.

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

  1. Реформисты, судьи, идеалисты. Стремятся к совершенству
  2. Помогающие, дающие, заботящиеся. Стремятся быть любимыми
  3. Достигающие, исполнители, искатели статуса. Стремятся к процессу победы и надежде
  4. Романтики, индивидуалисты, атеисты, актёры. Стремятся познать себя, самореализоваться, быть оригинальным
  5. Изучающие, эксперты, обозреватели. Стремятся делать выводы на основе существующих данных и быть этим полезными
  6. Герои, защитники, скептики. Стремятся к продолжительному постоянству мира.
  7. Энтузиасты, авантюристы. Стремятся к многогранному испытанию всего своими руками
  8. Боссы, кандидаты, утвердители. Стремятся управлять своей жизнью и судьбой
  9. Медиаторы, миротворцы. Стремятся избегать конфликты и по возможности уменьшать их силу, понимая доводы обоих сторон конфликта

Да и наверняка вы слышали про разделение на темпераменты:

  • Холерик. Активен, эмоционален, агрессивен
  • Сангвиник. Непостоянен, энергичен, в меру эмоционален, общителен
  • Флегматик. Уравновешен, спокоен
  • Меланхолик. Робок, замкнут, нерешителен

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

Психотип Черты характера
Активные акцентуации
Профессор / Доктор House (Шизоид) теоретизирование, неэнергичен, неаккуратен, занимается тем что ему интересно, не общителен, критичен, иногда гениален
Бендер (Гипертрим)
не любит подчиняться, критику не воспринимает, груб

Лила (Параноидал)

целеустремлённый, дисциплинирован, неэмоционален, требователен и критичен
Гермес (Эпилептоид)
прагматичен, ленив, традиционен, морализатор, надежность, исполнительность, бюрократ
Зепп (Истероидал) Демонстративен, завышенная самооценка, пуглив
Защитные акцентуации
Зойдберг (Астоник) не уверен в себе, раним, ипохондрик, нерешителен
Фрай (Неустойчивый)
плохо организован, ленив, безответсвеннен, болезненно относится к критике, легко попадает под чужое влияние
Эмми (Лабил)
Весел, добродушен, открыт, частые смены настроения, внушаем и робок, мягкосердечен и добродушен
Киф (Сенситив)
Эмоционален, впечатлителен, невыразителен, не способен дать отпор, утомителен, завидует успешным

Практика

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

Corvid Exsys

Corvid это графический интерфейс для создания экспертной/интеллектуальной/интеллигентной системы на основе правил - т.н. rule-based logic. Corvid генерирует несколько своих файлов (с раширениями .cvr, .cvd, cvru), которые можно использовать потом java-аплете (смотрите ниже пример).

Мы уже познакомились со входными и выходными переменными, но поскольку Corvid занимается фактически заменой языков программирования в своей узкой области, и в нём есть свои переменные нескольких типов:

  1. Static - статичные переменные с заданными вариантами, аналог
    <input type='radio'>
  2. Dynamic list - ??
  3. Continuous - по умолчанию аналог
    <input type='text'>
  4. Collection - фактические данные искомых объектов (если они есть и их много), аналог базы данных - вводится в виде текстового файла с tab-разделителем данных
  5. Confidence - тип переменной, указывающей на порядок результатов (ranking). Может вычисляться по алгоритмам - Sum, Average, Multiply, Min / Max.

Выбранные переменные

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

Выходные переменные Входные переменные
  • price - цена
  • square_area - площадь
  • rooms - число комнат
  • has_lift - есть ли в подъезде лифт
  • has_joined_bath - общий сан.узел
  • has_open_kitchen -открытая кухня
  • has_parking - парковка
  • garden_distance - расстояние до парка или леса
  • center_distance - близость центра города
  • school_distance - близость школ
  • floor / floors - этаж и всего этажей
  • overall_state - состояние квартиры
  • heating - тип отопления
  • kitchen_area - площадь кухни
  • cost - плата в месяц
  • family - семейность
  • has_car - мобильность
  • urgency - срочность
  • age - возраст
  • popularity - социальная активность
  • animals - активные животные
  • culina - любитель кулинарии

Внутренние переменные служат в качестве базы знаний о человеке либо временному поиску объекта. Например это может быть список отклонённых предложений (квартир), из которых можно так же делать выводы.

  • distance - рассчитываемая переменная между preferred_location и настоящим местоположением квартиры (разница в координатах), в метрах
  • lift_importance - нужда в лифте или нижних этажах

 

Правила

Правила, или Business Rules это жёсткие выводы, которые симулируют гибкую логику (fuzzy logic) благодаря использованию алгоритмов взвешивания (важности) переменных. Если мы не хотим делать выводы, то можно просто прикрутить эдакий бегунок (slider) где пользователь будет гибко указывать насколько тот или иной параметр ему важен, а система уже будет переводить это в реальные цифры - мегабайты, метры 2, расход топлива и тп.

Но в Corvid'е все правила начинаются с ввода переменных - открываем Logic block, добавляем IF-условие и автоматически пользователю будет задан вопрос. После ввода можно добавлять THEN-действия присваивания или вызова комманд.

Вход Влияния Пояснение
cost price

Цена - чем больше зарплата или капитал, тем дороже можно себе позволить жильё. Возможно для вас будет откровением, но формула для расчёта ежемесячной платы на самом деле не такая простая. Вот к примеру как расчитывается цена в эстонском SEB-банке (источник - javascript код на kv.ee)
month_intress = ((intress/100/)12) + 1; //1.00417 к примеру - т.е. оффициально 5% годовыхmonth_payment = real_money * (month_intress - 1) / (1 - month_intress-months )Я беру фиксированные 5% на 20 лет. Получается простой коэффициент 6.602% ои всей суммы в месяц

family

type
rooms,
has_lift,
floor,
square_area,
has_joined_bath,
school_distance,
center_distance,
garden_distance

Этаж и лифт - новорожденных таскать на 5 этаж очень тяжко
Площадь, число комнат и тип - семья всегда нуждается в большей площади для детей
Объединённый туалет и ванная - в семье мешает сходить в туалет когда кто-то в ванной
Местоположение - наличие детей нуждается в развитой инфраструктуре района, школах и детсадах
Парк или сад поблизости говорит о том, где можно отдохнуть с детьми.

has_car

distance,
has_parking

Расстояние между желаемым местоположением и фактическим может быть дальше
Парковка или гараж необходимы для удобства
urgency overall_state
В случае спешки не подходят строящиеся дома. В случае если есть семья, то состояние должно быть лучше что-бы избежать стрессов
age

rooms,
school_distance,
lift_importance,
heating,
garden_distance,
heating

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

preferred_location(x,y) location (x,y)
Местоположение - В качестве предлагаемого места жительства могут выступать места учёбы, работы, места жительства родственников.
animals garden_distance,
activity,
floor,
has_lift,
square_area
Наличие собак говорит о ежедневных прогулках, поэтому желательно что-бы рядом был парк, а по ступенькам бегать можно было меньше.
Для домашних животных, как и для детей надо больше пространства что-бы они не сходили с ума.
popularity

has_open_kitchen,
center_distance,
type

Общительность значит возможное гостеприимство, следовательно открытая кухня и местоположение ближе к центру города, либо собственный дом.
sport
center_distance, garden_distance
Лучше подальше от центра - там больше свободных тротуаров.
Также лучше поближе к паркам, где можно побегать.
culina has_open_kitchen,
kitchen_area
Любители готовить нуждаются в большой площади и желательно открытой кухне


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

Вопросы

Итого вопросы примерно такие..

  1. Сколько вы готовы тратить на кредит в месяц?
  2. Есть ли у вас семья?
  3. Сколько вам лет?
  4. У вас есть автомобиль?
  5. Как срочно вам нужна квартира?
  6. У вас есть домашние животные?
  7. Любите ли вы готовить?
  8. Считаете ли вы себя социально активным?

Правила как формулы

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

Пример из проекта. Я придумал вот такой вот расчёт на каком-то шаге для расчёта расстояния до парка:

[garden_distance] = [garden_distance]*0.6+0.4*10*(50 - 0.5*NUM([animals]))

Видно, что раньше это значение уже было каким-то образом установлено, но теперь я влияю на старое значение, заменяя 40% из старого значения плавающим значением веса, зависящего от уровня "животной активности" (оценивается тоже в %).

В приведённом случае зависимость линейная (функция NUM просто конвертирует строку в целочисленное значение), но приходится вспоминать и квадратичные, логарифмические и модульные функции, проходимые ещё в школе.

Вывод результатов

После ввода результатов, присваивания значений весов, в конце надо вывести результат о том чего мы добивались в результате теста - выходных переменных. Для этого в конце логического блока надо добавить "продвинутую комманду" DERIVE RESULTS, которая выведет переменные у которых был отмечен флажок "Final Results Display Tag".

P.S. quarti.ru я уже зарегил :)

По теме:

is_structure.png exsys_corvid.PNG corvid_exsys_quarti_ru.PNG p2.jpg
RSS

Комментарии

  • Елена
    avatar
    Артем, спасибо! Отличная работа.
    Я написала у себя в блоге отзыв:-)
    http://www.creshka.ru/?p=489
  • Спасибо, я уже заметил в статистике :)
  • ЛЕОНИД
    avatar
    Артем!!!
    как открыть твой файл по этой проге??
    у меня нет крэка ???
    скинь если есть возможность на мыло??? эту работу по Эс и крек!!заранее спасибо!!!!
  • Кряк для этой проги не нужен - там месяц можно бесплатно работать. Возможно надо новую версию скачать
  • Erron
    Интересно.
    Классические принципы экспертных систем в любой области, будь то промышленность http://zekakt.ru/expertSystems или недвижимость как у вас http://quarti.ru это нужно развивать причем очень активно!
  • Daria
    avatar
    Здравствуйте) Делаю Курсовую в корвиде)Скажите пожалуйста, есть ли у корвида возможность ввода коэффициента уверенности в режиме консультации пользователем? и чтобы в итоге считался итог из входных данных? Подскажите плз как это можно реализовать?
  • Статье уже более 3 лет, так что увы я не помню. Но я могу подозревать что на основе вводимых данных можно правилами менять коэффициент уверенности.
  • Daria
    avatar
    Печально((но все равно спасибо))))