Алгоритм сравнения тортов - PullRequest
4 голосов
/ 01 августа 2009

Это буквально о сравнении тортов. Мой друг устраивает кекс-вечеринку с целью определения лучшей кекс-кондитерской на Манхэттене. На самом деле, это гораздо более амбициозно, чем это. Читайте дальше.

Присутствуют 27 пекарен и 19 человек (возможно, один или два неявки). В каждой пекарне будет по 4 кекса, по возможности, включая скобы - ванильный, шоколадный и красный бархатный - и закруглите 4 с подстановочными ароматами. Есть 4 атрибута, по которым можно оценивать кексы: вкус, влажность, представление (красивость) и общее качество. Люди будут предоставлять оценки по 5-балльной шкале для каждого атрибута для каждого кекса, который они пробуют. Наконец, каждый кекс можно разрезать на 4 или 5 кусочков.

Вопрос заключается в следующем: какова процедура для составления статистически значимого ранжирования хлебобулочных изделий для каждого атрибута и для каждого вкуса (трактуя «подстановочный знак» как аромат)? В частности, мы хотим ранжировать пекарни 8 раз: для каждого вкуса мы хотим ранжировать пекарни по доброте (добродетель является одним из атрибутов), а для каждого атрибута мы хотим ранжировать пекарни по всем вкусам (то есть, независимо от вкуса агрегирование по всем вкусам). Главный приз достается пекарне высшего ранга за атрибут доброты.

Бонусные баллы за обобщение, конечно.

Это происходит примерно через 12 часов, поэтому я опубликую в качестве ответа, что мы в итоге сделали, если никто не ответит за это время.

PS: Вот пост-пост в блоге об этом: http://gracenotesnyc.com/2009/08/05/gracenotes-nycs-cupcake-cagematch-the-sweetest-battle-ever/

Ответы [ 5 ]

3 голосов
/ 03 августа 2009

Вот что мы в итоге сделали. Я составил огромную таблицу, чтобы собрать все рейтинги на уровне http://etherpad.com/sugarorgy (редакция 25, на всякий случай, если она добавит мне эту публичную ссылку), а затем использовал следующий скрипт Perl для анализа данных в CSV-файле. :

#!/usr/bin/env perl
# Grabs the cupcake data from etherpad and parses it into a CSV file.

use LWP::Simple qw(get);

$content = get("http://etherpad.com/ep/pad/export/sugarorgy/latest?format=txt");
$content =~ s/^.*BEGIN_MAGIC\s*//s;
$content =~ s/END_MAGIC.*$//s;
$bakery = "none";
for $line (split('\n', $content)) {
  next if $line =~ /sar kri and deb/;
  if ($line =~ s/bakery\s+(\w+)//) { $bakery = $1; }
  $line =~ s/\([^\)]*\)//g; # strip out stuff in parens.
  $line =~ s/^\s+(\w)(\w)/$1 $2/;
  $line =~ s/\-/\-1/g;
  $line =~ s/^\s+//;
  $line =~ s/\s+$//;
  $line =~ s/\s+/\,/g;
  print "$bakery,$line\n"; 
}

Затем я сделал усреднение и еще много чего в Mathematica:

data = Import["!~/svn/sugar.pl", "CSV"];

(* return a bakery's list of ratings for the given type of cupcake *)
tratings[bak_, t_] := Select[Drop[First@Select[data, 
                        #[[1]]==bak && #[[2]]==t && #[[3]]=="g" &], 3], #!=-1&]

(* return a bakery's list of ratings for the given cupcake attribute *)
aratings[bak_, a_] := Select[Flatten[Drop[#,3]& /@ 
                        Select[data, #[[1]]==bak && #[[3]]==a&]], #!=-1&]

(* overall rating for a bakery *)
oratings[bak_] := Join @@ (tratings[bak, #] & /@ {"V", "C", "R", "W"})

bakeries = Union@data[[All, 1]]

SortBy[{#, oratings@#, Round[Mean@oratings[#], .01]}& /@ bakeries, -#[[3]]&]

Результаты находятся внизу http://etherpad.com/sugarorgy.

2 голосов
/ 01 августа 2009

Возможно, будет полезно прочитать о системах голосования . PS: не принимайте все, что написано в Википедии, как «хорошая рыба». Там я обнаружил фактические ошибки в сложных темах.

1 голос
/ 03 августа 2009

Возможно, это слишком общая проблема для вас, но к этому типу проблемы можно обратиться с помощью Conjoint Analysis ( текст ссылки ). Пакетом R для реализации этого является bayesm ( текст ссылки ).

1 голос
/ 01 августа 2009

Разбейте проблему на подзадачи.

Какова ценность кекса? Основным подходом является «среднее из баллов». Несколько более надежным подходом может быть «средневзвешенная оценка». Но могут быть и другие осложнения ... кекс с 3 вкусностями и 3 вкусами может быть «лучше», чем с 5 вкусами и 1 вкусом, даже если вкус и вкус имеют одинаковый вес (IOW, низкий балл может иметь непропорциональный эффект).

Составьте несколько примеров оценок кексов (особенности! Покройте обычные сценарии и несколько странных) и оцените, как вы думаете, разумный «общий» результат был бы, если бы у вас был идеальный алгоритм. Затем используйте эти данные для обратного проектирования алгоритма.

Например, кекс с добротой 4, вкусом 3, представлением 1 и влажностью 4 может заслуживать 4 балла в целом, тогда как один с добротой 4, вкусом 2, представлением 5 и влажностью 4 может получить только 3 балла.

Затем сделайте то же самое для пекарни. Учитывая набор кексов с диапазоном оценок, какой будет соответствующая оценка? Затем выясните функцию, которая даст вам эти данные.

Рейтинг «доброты» кажется немного странным, так как кажется, что это общий рейтинг, и поэтому его наличие уже является общим счетом, так зачем рассчитывать общий счет?

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

0 голосов
/ 01 августа 2009

Если вы можете написать SQL, вы можете создать небольшую базу данных и написать несколько запросов. Это не должно быть так сложно.

например. выберите сумму (балл) / кол-во (балл) как финальный балл, пекарня, ароматизатор из таблиц, в которых группируются по пекарне, аромат

...