如何使用 MapReduce 在 python 中计算两个变量之间的相关性
Posted
技术标签:
【中文标题】如何使用 MapReduce 在 python 中计算两个变量之间的相关性【英文标题】:How to calculate correlation between two variables in python using MapReduce 【发布时间】:2013-02-18 17:22:00 【问题描述】:我正在尝试使用 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
变量之间的相关性时,我需要帮助。谢谢!
【问题讨论】:
【参考方案1】:其实你已经很接近了。但首先,您的代码示例的缩进是完全错误的,这使得帮助您变得更加困难。其次,您没有解释您认为错误的输出是什么。
根据您的代码,我假设您正在尝试计算热度与响度的线性回归。
为此,您需要对数据库中所有轨道的多个值求和。所以忘记映射器中的counter
变量——你想在最后输出一条记录,所以你的映射器和reducer 应该输出一个键:只需使用True 或其他东西。 (此外,如果您使用 Elastic Map-Reduce 甚至在多个本地进程中运行此代码,则使用这样的变量将不起作用。)
然后在你的减速器中,你应该做yield key, (suml, sumh, sumxy, sumxx, sumyy)
。
map-reduce 的最终输出将是一行,如下所示:
true [-205.354, NaN, NaN, 2530.9249500000005, NaN]
糟糕,NaN
s 不好。发生这种情况是因为百万歌曲数据集中的某些曲目没有有效的热度。因此,您需要在映射器中使用math.isnan
,并且仅在热度有效时才生成记录。
好的,现在你会得到一个像这样的最终输出:
true [-50.804, 2.072952243828, -20.793643182685596, 538.98803, 0.9498767028116709]
您可以使用这些值来计算线性回归(例如,请参阅http://code.activestate.com/recipes/578129-simple-linear-regression/ 的代码)。
【讨论】:
【参考方案2】:尝试在顶部(全局)声明 counter
from mrjob.job import MRJob
import track
YIELD_ALL = True
counter=0
而且我真的不明白你在 reducer 函数中的逻辑。
【讨论】:
因为在使用MRJob时,你的代码可能在多台机器上的多个进程中运行。计数器变量不会在不同进程之间保持同步。以上是关于如何使用 MapReduce 在 python 中计算两个变量之间的相关性的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Python为Hadoop编写一个简单的MapReduce程序
如何使用Python为Hadoop编写一个简单的MapReduce程序
如何使用Python为Hadoop编写一个简单的MapReduce程序
如何使用Python为Hadoop编写一个简单的MapReduce程序