2009-08-01 58 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)。