1

我正在尝试使用 AWS 上提供的百万歌曲数据集来查找曲目响度与其流行度之间的相关性。我按照基本教程(http://musicmachinery.com/2011/09/04/how-to-process-a-million-songs-in-20-minutes/)获取每个曲目的数据,并建立我的项目使用 MRJob 和 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

我需要帮助编写其余代码来计算MSD 数据集的loudness和变量之间的相关性。hotness谢谢!

4

2 回答 2

1

你其实很接近。但首先,您的代码示例的缩进是完全错误的,这使得帮助您变得更加困难。其次,您没有解释您认为错误的输出是什么。

从您的代码中,我假设您正在尝试计算热度与响度的线性回归。

为此,您需要对数据库中所有轨道的多个值求和。所以忘记counter映射器中的变量——你想在最后输出一条记录,所以你的映射器和化简器应该输出一个键:只需使用 True 或其他东西。(此外,如果您使用 Elastic Map-Reduce 甚至在多个本地进程中运行此代码,则使用这样的变量将不起作用。)

然后在你的减速器中,你应该做yield key, (suml, sumh, sumxy, sumxx, sumyy).

map-reduce 的最终输出将是一行,如下所示:

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

糟糕,NaNs 不好。发生这种情况是因为百万歌曲数据集中的某些曲目没有有效的热度。因此,您将需要math.isnan在映射器中使用,并且仅在热度有效时才产生记录。

好的,现在你会得到一个像这样的最终输出:

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

您可以使用这些值来计算线性回归(例如,请参阅http://code.activestate.com/recipes/578129-simple-linear-regression/上的代码)。

于 2013-03-21T00:17:37.010 回答
-1

尝试在顶部(全局)声明计数器

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

而且我真的不明白您在减速器功能中的逻辑。

于 2013-03-06T05:49:32.300 回答