케이크 비교 알고리즘
-
06-07-2019 - |
문제
이것은 말 그대로 케이크를 비교하는 것입니다.내 친구는 맨해튼 최고의 컵케이크 가게를 결정한다는 목표로 컵케이크 파티를 열고 있습니다.실제로는 그보다 훨씬 더 야심찬 일입니다.읽어.
27개의 빵집이 있고 19명의 사람들이 참석하고 있습니다(1~2명의 노쇼도 있을 수 있습니다).가능한 경우 스테이플(바닐라, 초콜릿, 레드 벨벳)을 포함하고 와일드카드 맛으로 4개를 마무리하는 등 각 베이커리에는 4개의 컵케이크가 있습니다.컵케이크를 평가하는 데는 4가지 속성이 있습니다.향미, 촉촉함, 표현력(예쁨), 전반적으로 좋음.사람들은 샘플링한 각 컵케이크의 각 속성에 대해 5점 척도로 평가를 제공합니다.마지막으로 각 컵케이크를 4~5개 조각으로자를 수 있습니다.
질문은 ~이야:각 속성 및 각 맛("와일드카드"를 맛으로 처리)에 대해 통계적으로 의미 있는 빵집 순위를 도출하는 절차는 무엇입니까?구체적으로 우리는 빵집 순위를 8번 지정하려고 합니다.각 맛에 대해 우리는 좋음을 기준으로 빵집의 순위를 매기려고 하며(좋음은 속성 중 하나임), 각 속성에 대해 모든 맛에 걸쳐 빵집의 순위를 매기고 싶습니다(즉, 맛과 무관함, 즉 모든 맛에 대해 집계).최우수상은 좋음 속성이 가장 높은 빵집에 돌아갑니다.
물론 이것을 일반화하면 보너스 포인트가 됩니다.
이 작업은 약 12시간 후에 발생하므로 그 동안 아무도 답변하지 않으면 어떻게 되었는지 답변으로 게시하겠습니다.
추신:이에 대한 파티 후 블로그 게시물은 다음과 같습니다. http://gracenotesnyc.com/2009/08/05/gracenotes-nycs-cupcake-cagematch-the-sweetest-battle-ever/
해결책
우리가 한 일은 다음과 같습니다.모든 사람의 평가를 수집하기 위해 거대한 테이블을 만들었습니다. 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.
다른 팁
아마도 읽는 중일 것입니다. 투표 시스템 도움이 될 것입니다.추신:Wikipedia에 "좋은 물고기"라고 쓰여 있는 것을 받아들이지 마십시오.나는 그곳의 고급 주제에서 사실적 오류를 발견했습니다.
문제를 하위 문제로 나눕니다.
컵케이크의 가치는 얼마인가요?기본적인 접근법은 "점수의 평균"입니다. 약간 더 강력한 접근 방식은 "점수의 가중 평균"일 수 있습니다. 그러나 그 이상의 합병증이있을 수 있습니다 ...맛과 맛의 가중치가 같더라도 3가지 맛과 3가지 맛이 있는 컵케이크는 5가지 맛과 1가지 맛이 있는 컵케이크보다 '더 좋을' 수 있습니다(IOW, 낮은 점수는 불균형한 영향을 미칠 수 있음).
샘플 컵케이크 점수를 만들어 보세요(구체적인 내용!일반적인 시나리오와 몇 가지 이상한 시나리오를 다루고, 이상적인 알고리즘이 있을 경우 합리적인 "전체" 점수가 얼마라고 생각하는지 추정해 보세요.그런 다음 해당 데이터를 사용하여 알고리즘을 리버스 엔지니어링합니다.
예를 들어, 좋음 4, 맛 3, 표현 1, 촉촉함 4를 가진 컵케이크는 전체적으로 4점을 받을 수 있는 반면, 좋음 4, 맛 2, 표현 5, 촉촉함 4를 가진 컵케이크는 3점만 평가할 수 있습니다.
다음으로 빵집에서도 같은 일을 하세요.다양한 점수의 컵케이크 세트가 주어졌을 때 적절한 등급은 무엇입니까?그런 다음 해당 데이터를 제공하는 함수를 알아보세요.
'좋음' 순위는 일반 평점인 것 같아서 좀 이상해 보이는데, 거기에 포함하면 이미 전체 점수가 있는데 왜 전체 점수를 계산합니까?
이 작업을 할 시간이 있다면 항상 원시 데이터를 캡처하고 이를 기초로 사용하여 보다 자세한 분석을 수행할 것을 제안하지만 여기서는 실제로 관련성이 없다고 생각합니다.
SQL을 작성할 수 있다면 작은 데이터베이스를 만들고 쿼리를 작성할 수 있습니다.그렇게 어렵지는 않습니다.
예를 들어베이커리, 맛별로 그룹화된 테이블에서 합계(점수) / 개수(점수)를 최종 점수, 빵집, 맛으로 선택합니다.