2011-02-07 58 views
4

我真的很抱歉,如果我錯了我的問題,但我想一些主意......我希望有與排名算法的思想包括時間,他們提交有票。如何評價或排名投票

+0

+1好問題。 – enam 2011-02-07 19:13:00

+0

非常好的questino!通常難以解決或根本沒有想到的問題。期待討論和各種方法! – 2011-02-07 20:15:07

回答

1

Reddit的代碼是開源的。目前他們的排名算法的一個很好的討論,在這裏,用代碼:http://amix.dk/blog/post/19588

+1

(p - 1)/(t + 2)^ 1.5在這個公式中,我不明白它爲什麼是p-1 ?,爲什麼時間加2並乘以1.5? – faded 2011-02-07 18:56:47

3

有趣的問題!

好讓把它!

,你可以計算好的收視率時,並非所有的一件事首先是Bayesianaverage

您運行讀上去就可以了,但很簡單,需要注意以下幾點:

  • 項與小票都沒有了它們的投票的真實平均值,但在整個數據集中具有平均評級的組分。例如在IMDB上,默認評分是6.4。因此,只有兩張10星的電影可能仍然會有6到7個之間的東西。票越多,它們的意義就越強烈,評級就會從默認值中「拉開」。 Imdb還實現了他們的電影在列表中顯示的最低票數。

另一件我覺得困惑的事情是:爲什麼選票的時間很重要?你是不是指進入表決的時間?那麼在我們的電影中,剛剛發佈的電影更重要?

但無論如何!在這兩種情況下,通過應用對數函數常常可以獲得好的結果。

對於我們的電影例如:電影的相關性可以通過

1 + 1/SQRT(1 + CURRENT_YEAR - RELEASE_YEAR) 

相乘所以1是插座額定值每部電影獲得。 本年度的電影將有100%的提升(200%相關度),因爲上述內容將會恢復正確。去年170%,2歲157%和兒子。

但電影從1954年1963年或差別遠沒有那麼大。

所以請記住:你在你的計算中使用

  • 一切。它真的是線性的嗎?它可能會扭曲你的收視率嗎?整個數據集中的關係是否合理?

如果您想讓最近的投票數更多,您可以以完全相同的方式進行投票。如果你希望最近投票的東西能夠「熱身」,這也是有道理的......因爲它目前很熱門,並且在你的社區中被討論過。

這beeing說,它仍然只是努力工作。很多玩耍等。

讓我給你最後一個想法。

在我公司工作,我們計算了電影的相關性。

我們有一個配置數組,我們在最後的相關性中存儲了幾個因素的「權重」。

它看起來像這樣:

 $weights = array(
       "year" => 2, // release year 
       "rating" =>13, // rating 0-100 
       "cover" => 4, // cover available? 
       "shortdescription" => 4, // short descr available? 
       "trailer" => 3, // trailer available? 
       "imdbpr" => 13, // google pagerank of imdb site 
     ); 

然後我們計算0和1之間的一個數值爲每公噸。有不同的方法。但讓我告訴你我們的評級的例子(它本身就是我們所抓取的幾個平臺的聚合等級,並有不同的權重themsevles等)

 $yearDiff = $data["year"] - date('Y'); 
     //year 
     if (!$data["year"]){ 
       $values['year'] = 0; 
     } else if($yearDiff==0) { 
       $values['year'] = 1; 
     } else if($yearDiff < 3) { 
       $values['year'] = 0.8; 
     } else if($yearDiff < 10) { 
       $values['year'] = 0.6; 
     } else { 
       $values['year'] = 1/sqrt(abs($yearDiff)); 
     } 

所以你看,我們硬編碼了一些「年齡間隔」和僅依靠sqrt功能才能播放老電影。事實上,差異很小,因此這裏的SQRT示例非常差。 但數學函數通常很有用!例如,您可以使用像竇曲線等週期性函數來計算季節相關性!例如,您的年份範圍爲0-1,那麼您可以使用竇功能爲當年的當前時間加權夏季點擊/冬季點擊/秋季點擊!

IMDB Pagerank的最後一個例子。因爲只有10種不同的值可能是它完全是硬編碼和他們沒有分佈在統計均勻的方式(PageRank的1或2個甚至不如無):

 if($imdbpr >= 7) { 
       $values['imdbpr'] = 1; 
     } else if($imdbpr >= 6) { 
       $values['imdbpr'] = 0.9; 
     } else if($imdbpr >= 5) { 
       $values['imdbpr'] = 0.8; 
     } else if($imdbpr >= 4) { 
       $values['imdbpr'] = 0.6; 
     } else if($imdbpr >= 3) { 
       $values['imdbpr'] = 0.5; 
     } else if($imdbpr >= 2) { 
       $values['imdbpr'] = 0.3; 
     } else if($imdbpr >= 1) { 
       $values['imdbpr'] = 0.1; 
     } else if($imdbpr >= 0) { 
       $values['imdbpr'] = 0.0; 
     } else { 
       $values['imdbpr'] = 0.4; // no pagerank available. probably new 
     } 

然後我們總結起來是這樣的:

 foreach($values as $field=>$value) { 
       $malus += ($value*$weights[$field])/array_sum($weights); 
     } 

這可能不是您的問題的確切答案,但更廣泛一點,但我希望我指出你在正確的方向,並給你一些點,你的想法可以拿起!

與您的應用程序一起玩得開心又成功!