Вопрос: Как реализовать рекомендательную систему по формуле Байеса?

Лучший ответ:
Видимо, речь идёт о наивном Байесовском классификаторе.
Во-первых, поставим проблему чуть иначе: вместо рекомендациях следует говорить о классификации на 2 класса (нравится или не нравится).
Далее, наивный Байесовский классификатор основывается на 2 идеях: собственно, Теорема Байеса и условная независимость признаков объектов.
Пусть P(like|x) — вероятность того, что данному пользователю понравится объект x, описывающийся характеристиками x1, ..., xn. Эти характеристики могут быть совершенно произвольными, не обязательно одного "типа". Вопрос лишь в том, какое вы зададите на них распределение. Очевидно, что если вероятность P(like|x) > 1/2, то вероятность негативной оценки будет меньше, а значит, нужно предсказывать "нравится". Таким образом, нашей задачей является оценить вероятности P(like|x) и P(dislike|x) (которая, в свою очередь равна 1-P(like|x), поскольку сумма вероятностей равна 1) и выбрать наибольшую.
Тут самое время применить теорему Байеса:
P(like|x) = P(x|like) P(like) / P(x) и P(dislike|x) = P(x|dislike) P(dislike) / P(x)
Примечательным фактом является то, что знаменатель мы можем проигнорировать, ведь он один и тот же для P(like|x) и P(dislike|x), а нас интересует только соотношение между этими числами, а не они сами. Тогда сравнивать мы будем P(x|like) P(like) и P(x|dislike) P(dislike). В данном случае P(like) выражает наши априорные знания о том, насколько вероятно, что объект понравится пользователю. Если таких знаний нет, можно смело брать 1/2.
P(x|like), в свою очередь, описывает, насколько вероятно встретить такой объект в классе понравившихся. Вся наивность рассматриваемого классификатора заключается именно в моделировании этого распределения.
Поскольку вероятность P(x|like) может зависеть от x самым причудливым и произвольным образом, нам нужно сделать какое-то предположение. В случае наивного Байесовского классификатора этим предположением выступает ничем не подкреплённая гипотеза условной независимости признаков объекта при заданном классе, то есть: P(x|like) = P1(x1|like) ... Pn(xn|like). Здесь Pk — произвольное распределение, оно может быть как дискретным (цвет или тип, в Вашем случае), так и "непрерывным" (клиренс). Данные распределения должны быть выбраны разработчиком классификатора. Обычно они содержат какие-то параметры, которые мы в дальнейшем настроим по данным с помощью метода максимального правдоподобия. Для многих распределений оценки можно выписать аналитически. Например, для дискретных признаков можно посчитать эмпирическую частоту значения (плюс сглаживание для тех объектов, которые пользователь ни разу не видел), а для нормального распределения посчитать выборочное среднее и дисперсию.
Резюмируя, ответы на Ваши вопросы:
1. Формула Байеса имеет такое же отношение к Байесовскому классификатору, какое дерево к столу. Да, формула используется, но это ещё не всё.
2. Про известные подходы ничего не скажу, но на ум приходит следующее: при классификации можно сравнивать не произведение вероятностей, а его логарифм (благодаря его монотонности) log(P1(x1|like) ... Pn(xn|like)) = log(P1(x1|like)) + ... + log(Pn(xn|like)). Чем больше эта сумма — тем больше вероятность лайка. Можно попробовать взвесить эти слагаемые.
3. На отдельные признаки можно задавать произвольные распределения, например, нормальное для численных значений.
Теперь о проблемах: вышеописанный подход хорош, но обладает существенным недостатком: если применять её ко всем пользователям без разбору, то получится модель среднего пользователя, которое будет рекомендовать всем одно и то же. Фишка же рекомендательной системы заключается в персонализации. С другой стороны, если строить по байесовскому классификатору на пользователя, скорее всего, Вам не хватит данных для получения каких-либо значимых результатов. Со второй проблемой можно бороться, если принять во внимание существование похожих пользователей: Если Алиса заинтересовалась объектами {A, B, C, D}, а Борису понравились {B, C, D, E}, то наивный Байес либо усреднит их со всеми остальными (представим, что существует 1000 пользователей, заинтересовавшихся объектом P. Тогда его "вес" будет существенно больше, но только лишь благодаря его популярности, а ведь для нахождения наиболее популярных объектов хватит и простой сортировки), либо построит для обоих по собственному классификатору, даже не подозревая о том, что эти пользователи похожи. Одним из подходов, учитывающих это, является коллаборативная фильтрация, наиболее активно используемая в задачах рекомендации.

Худший ответ:
Согласно описанию стоит задача классификации.
На входе дан вектор
  - тип кузова
  - цвет кузова
  - дорожный просвет
На выходе
  - рекомендовать/не рекомендовать (да/нет, т.е. 1.0/0.0)
Это можно описать многомерной функцией F(x1, x2, .., xN) = в идеале хотелось бы 0.0 или 1.0, а на практике - где-то между ними (типа, низкая/средняя/высокая вероятность рекомендации).
Входные параметры могут быть качественными (характеристика объекта: пол человека, должность), количественными (дискретными -1, 0, 1, 2 и непрерывными -30.2°C .. 44.6°C). Подробнее в www.pm298.ru/shkala3.php (Классификация данных и измерительные шкалы)
Рассмотрим каждый параметр.
Цвет - довольно ёмкое понятие, а не просто HTML код #FE33CC (magenta в RGB). Упрощая, математически цвет можно представить как сочетание тона (все цветовые оттенки в палитре), насыщенности (пёстрый/тусклый) и интенсивности света (светлый/тёмный) - цветовое пространство HSL. Для осмысленных результатов по формуле преобразования нужно получить три этих составляющих и работать с ними отдельно.
Оттенок измеряется в радианах, от 0 до 2 пи, или в нормированном промежутке от 0.0 до 1.0.
Насыщенность и интенсивность цвета - от слабого до сильного - масштабируются также в промежутке 0.0 до 1.0.
Мне кажется, что с цветом человеку сложнее всего определиться, так как он влияет на него психо-физиологически.
Тип кузова - номинальный тип (нет значения очерёдности).
Номинальные типы - это вектор, состоящий из значений классов да/нет. Когда выбран определённый класс, то он имеет значение максимума, т.е. 1.0 (да), а остальные устанавливаются в 0.0 (нет).
Таким образом, если обозначить типы кузова как A (купе),B (седан) и C (кабриолет), то в форме вектора они будут представлены как [A, B, C].
Например, выбрав тип "седан", вектор имеет значения [0.0, 1.0, 0.0].
Дорожный просвет - непрерывный тип в исходных данных. Его нужно преобразовать в категории (мал., сред., выс.) - аналогично представлению типа кузова.
Гораздо более весомым параметром в выборе машин является, по-моему, ценовая категория (лучше не более 3-4-х категорий).
Скорее всего, пол человека (номинальный тип) также может влиять на выбор авто м/ж, 0/1.
Полагаю, что не только нейронные сети справятся с этим заданием.