2013-02-18 66 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/)。

相关问题