1

AWS で利用可能な Million Song Dataset を使用して、トラックのラウドネスと人気の相関関係を見つけようとしています。基本的なチュートリアル ( 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、マッパーの変数を忘れてください。最後に 1 つのレコードを出力する必要があるため、マッパーとリデューサーは単一のキーを出力する必要があります。True などを使用するだけです。(さらに、Elastic Map-Reduce を使用して、または複数のローカル プロセスでこのコードを実行する場合、そのような変数を使用しても機能しません。)

次に、レデューサーで、実行する必要がありますyield key, (suml, sumh, sumxy, sumxx, sumyy)

map-reduce からの最終的な出力は、次のような 1 行になります。

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

おっと、NaNダメです。これは、Million Song Dataset 内の一部のトラックに有効なホットネスがないために発生します。したがって、マッパーで使用する必要がありmath.isnan、ホットネスが有効な場合にのみレコードを生成します。

OK、次のような最終出力が得られます。

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 に答える