2013-02-18 71 views
1

我試圖使用AWS上提供的Million Song數據集來查找軌道的響度與其流行度之間的關聯。我遵循一個基本教程(http://musicmachinery.com/2011/09/04/how-to-process-a-million-songs-in-20-minutes/)來獲取每個音軌的數據,並使用MRJob和Python構建了我的項目。現在我迷失瞭如何在使用映射器和縮減器時找到軌道之間的相關性。這是到目前爲止我的代碼:如何使用MapReduce計算python中兩個變量之間的相關性

from mrjob.job import MRJob 
import track 
YIELD_ALL = True 

class MRDensity(MRJob): 

    def mapper(self, _, line): 
    t = track.load_track(line) 
    if t: 
     if t['tempo'] > 0: 

      loudness = t['loudness'] 
      #print loudness 
      hotness = t['song_hotttnesss'] 
      xy = loudness * hotness 
      x2 = loudness * loudness 
      y2 = hotness * hotness 
      counter = counter + 1 
      yield (counter, (loudness, hotness, xy,x2,y2)) 

def reducer(self, key, val): 
    sumx2 = 0 
    sumy2 = 0 
    sumxy = 0 
    sumh = 0 
    suml = 0 

    for l, h, xy, x2, y2 in val: 
     suml = suml + l 
     sumh += h 
     sumxy += xy 
     sumx2 += x2 
     sumy2 += y2 
     yield key, suml 

if __name__ == '__main__': 
    MRDensity.run() 

此代碼是不是真的工作,因爲它產生這樣的:

1 -10.142 
1 -10.212 
1 -11.137 
1 -11.197 
1 -13.496 
1 -15.568 
1 -15.607 
1 -17.302 
1 -22.262 
1 -3.383 
1 -3.809 
1 -5.816 
1 -5.902 
1 -6.671 
1 -7.24 
1 -7.591 
1 -8.729 
1 -9.689 
1 -9.738 
1 -9.863 

我需要編寫代碼的其餘部分來計算loudness之間的相關性幫助和hotness變量爲MSD數據集。謝謝!

回答

-1

嘗試在頂部(全球)宣佈計數器

from mrjob.job import MRJob 
import track 
YIELD_ALL = True 
counter=0 

我真的不明白,在減速功能,你的邏輯。

+0

根本不使用計數器變量是錯誤的。 – 2013-03-21 20:18:48

+0

@JohnWiseman爲何如此? – Atanu 2014-03-22 18:27:56

+0

因爲在使用MRJob時,您的代碼可能在多臺機器上的多個進程中運行。計數器變量不會在不同的進程中保持同步。 – 2015-04-25 16:30:36

1

你其實很接近。但首先,你的代碼示例的縮進是完全錯誤的,這使得它很難幫助你。其次,你沒有解釋你認爲錯誤的輸出是什麼。

從您的代碼中,我假設您正在嘗試計算熱度與響度的線性迴歸。

要做到這一點,你想在數據庫中的所有軌道上總結一些值。因此,在映射器中忘記counter變量 - 您希望在最後輸出一條記錄,因此您的映射器和縮減器應該輸出一個鍵:只需使用True或其他。 (另外,使用這樣的一個變量,如果您使用的是彈性的map-reduce,甚至在多個地方的進程中運行該代碼將無法正常工作。)

然後在你減速,你應該做yield key, (suml, sumh, sumxy, sumxx, sumyy)

從你的最終輸出的map-reduce將是單行線,這樣的事情:

true [-205.354, NaN, NaN, 2530.9249500000005, NaN] 

哎呀,NaN s爲不好。發生這種情況是因爲百萬歌曲數據集中的某些曲目沒有有效的熱度。因此,您需要在映射器中使用math.isnan,並且只有在熱度有效時纔會生成記錄。

OK,現在你會得到一個最終的輸出是這樣的:

true [-50.804, 2.072952243828, -20.793643182685596, 538.98803, 0.9498767028116709] 

您可以使用這些值來計算線性迴歸(例如,看到代碼爲http://code.activestate.com/recipes/578129-simple-linear-regression/)。

相關問題