2009-08-01 59 views
4

这实际上是关于比较蛋糕。我的朋友正在举办一场蛋糕派对,目的是确定曼哈顿最好的杯子蛋糕。实际上,它比这更雄心勃勃。请继续阅读。蛋糕比较算法

有27个面包房,19人参加(可能有一两个没有表演)。如果可能的话,包括主食 - 香草,巧克力和红色天鹅绒在内,每个面包店都会有4个纸杯蛋糕,并且通配符口味四舍五入。有4个属性可以评价纸杯蛋糕:味道,湿度,呈现(可爱)和一般的善良。人们将为他们抽样的每个蛋糕的每个属性提供5分制的评分。最后,每个蛋糕可以切成4或5块。

的问题是:什么是未来与面包店的每个属性的统计意义排名的过程,并针对每种口味(治疗“通配符”的味道)?具体来说,我们希望对面包店进行8次排名:对于每种口味,我们希望通过良好度来评定面包房(优点是其中一个属性),并且对于每种属性,我们想要在所有口味上对面包房进行排名(即独立于口味,即聚合所有味道)。大奖颁发给优质属性的顶级面包店。

当然,这个概括性的奖励要点。

这是在约12小时发生的事情,所以我会后作为回答我们结束了,如果在此期间没有一个答案做。

PS:这里有专方博客文章吧:http://gracenotesnyc.com/2009/08/05/gracenotes-nycs-cupcake-cagematch-the-sweetest-battle-ever/

+6

我担心有人会认为这是作业,所以我讲了有关派对的全部故事。我死得很严肃;我们真的有这个派对! – dreeves 2009-08-01 06:13:52

+0

这与编程有什么关系? – 2009-08-01 06:16:41

+2

那么,一个理想的答案会推广它,并将其编码为一个程序,该程序将个人评级和输出排名,甚至可能计算统计显着性水平。这可能是一个有趣的小问题! – dreeves 2009-08-01 06:22:50

回答

3

这就是我们最终做的。我在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"; 
} 

然后我做数学中的平均和诸如此类的东西:

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

(* return a bakery's list of ratings for the given type of cupcake *) 
tratings[bak_, t_] := Select[Drop[[email protected][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 = [email protected][[All, 1]] 

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

的结果是在http://etherpad.com/sugarorgy底部。

0

如果你能写SQL,你可以做一个小数据库,并编写一些查询。这不应该那么困难。

例如选择作为finalscore,面包店,风味从表在由面包店基,风味

1

打破问题成子问题总和(评分)/计数(评分)。

蛋糕的价值是什么?基本的方法是“分数的平均值”。稍强的方法可能是“分数的加权平均值”。但除此之外还可能有复杂情况......一种具有三种味道和三种味道的蛋糕可能比具有五种味道和一种善良的蛋糕更好,即使味道和善良具有相同的重量(IOW,低分可能具有不成比例的影响)。

做了一些样品蛋糕得分(具体!覆盖正常情况下和一些怪异的),并估计你认为合理的“整体”的分数是,如果你有一个理想的算法。然后,使用该数据对算法进行逆向工程。

例如,对于善4,风味3,展示1和湿润感4可能值得4总体一个杯形蛋糕,而一个与善良4,风味2,呈现5和湿润4可能只率3.

接下来,为面包店做同样的事情。给定一系列分数的纸杯蛋糕,合适的分数是多少?然后,找出能给你这些数据的函数。

的“善”的排名似乎有点奇怪,因为它似乎就像是一个普通等级,所以有它已经有整体分数,那么为什么计算总得分?

如果你有时间和这个工作,我总是建议捕获原始数据,并将它作为一个基础上做了更详细的分析,但我不认为这真的与此有关。

2

也许阅读voting systems会有所帮助。 PS:不要把维基百科上写的任何东西当作“好鱼”。我在那里的高级话题中发现了事实错误。

1

也许这对你来说太笼统了,但是这种类型的问题可以用联合分析(link text)来解决。用于实现此目的的R包是bayesm(link text)。