我試圖使用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數據集。謝謝!
根本不使用計數器變量是錯誤的。 – 2013-03-21 20:18:48
@JohnWiseman爲何如此? – Atanu 2014-03-22 18:27:56
因爲在使用MRJob時,您的代碼可能在多臺機器上的多個進程中運行。計數器變量不會在不同的進程中保持同步。 – 2015-04-25 16:30:36