夜行録 - 酔歩.net

日暮れて道遠し さらに夜道を行く もって夜行録と名付く

Sparkで全要素対の距離計算

Sparkで距離計算をしてみる。 データは (key, [v1, v2,..., vn]) というタプルのリストであるとする

#直積で全ペアの作成(AはRDDで上のようなリスト)
B = A.cartesian(A)
# ((a, a), (a, b), (a, c)...) が生成され、aが上の(key, [val])
#キーと値をそれぞれタプルに分離
C=B.map(lambda x: ((x[0][0], x[1][0]), (x[0][1], x[1][1])))
#自分との距離は無視
D=C.filter(lambda x: x[0][0] != x[0][1])
#numpy でベクトルの引き算、内積、sqrt
E=D.map(lambda x: (x[0], np.array(x[1][0])-np.array(x[1][1])))
F=E.map(lambda x: (x[0], np.sqrt(np.dot(x[1], x[1]))))
F.persist()
#((i, j), r_ij) の形になっている
# (i, r_ij) に変換
G=F.map(lambda x: (x[0][0], x[1]))
#同じキーの距離をリストにまとめる
H=G.groupByKey()
#(イテレータからリストへ変換するおまじない)
I=H.map(lambda x: (x[0], list(x[1])))
#ある要素からの距離が全てリストにまとめられている
#最大最小の探索
#値(距離)だけ抽出
J=F.map(lambda x: x[1])
J.persist()
#RDDのStatsCounter object
j=J.stats()
print j.max(), j.min(), j.mean(), j.stdev()
#ヒストグラムも自前でかける from RDD
Q=J.histogram(50)

In [17]: ?Q
Type:        tuple
String form: ([0.056793451016426098, 6.482786133784419, 12.908778816552413, 19.334771499320404, 25.76076418208 <...> 406, 27434, 17670, 11478, 7324, 4280, 2550, 2038, 1316, 346, 328, 210, 34, 10, 8, 6, 8, 2, 0, 2])
Length:      2
Docstring:
tuple() -> empty tuple
tuple(iterable) -> tuple initialized from iterable's items

If the argument is a tuple, the return value is the same object.

In [18]: print Q[0]
[0.056793451016426098, 6.482786133784419, 12.908778816552413, 19.334771499320404, 25.760764182088398, 32.186756864856392, 38.612749547624382, 45.03874223039238, 51.46473491316037, 57.890727595928361, 64.316720278696366, 70.742712961464363, 77.168705644232347, 83.594698327000344, 90.020691009768342, 96.446683692536325, 102.87267637530432, 109.29866905807232, 115.7246617408403, 122.1506544236083, 128.5766471063763, 135.0026397891443, 141.42863247191229, 147.85462515468026, 154.28061783744826, 160.70661052021626, 167.13260320298426, 173.55859588575225, 179.98458856852025, 186.41058125128822, 192.83657393405622, 199.26256661682422, 205.68855929959221, 212.11455198236021, 218.54054466512821, 224.96653734789621, 231.39253003066418, 237.81852271343217, 244.24451539620017, 250.67050807896817, 257.09650076173614, 263.52249344450411, 269.94848612727213, 276.3744788100401, 282.80047149280813, 289.2264641755761, 295.65245685834407, 302.07844954111209, 308.50444222388006, 314.93043490664809, 321.35642758941606]

In [19]: print Q[1]
[3246, 4956, 6868, 11482, 24108, 53192, 114492, 228950, 413436, 661572, 948358, 1224238, 1446794, 1585532, 1642804, 1615678, 1519618, 1365182, 1186784, 1000046, 829116, 666752, 533750, 419492, 321666, 247242, 183192, 135116, 95748, 66502, 44406, 27434, 17670, 11478, 7324, 4280, 2550, 2038, 1316, 346, 328, 210, 34, 10, 8, 6, 8, 2, 0, 2]

この先が思いつかないなぁ

2016年02月02日 (Tue) - 01:00:43 - その他雑記 - 1075x - permalink
Karma points: 0. Do you like this article? [yes/no]