2
私はPythonとPandasにはかなり新しいです。 私はパンダDatframeの列を次のようしている。パンダを使用して類似度/行間の距離をより速く計算する
SongNumber songID ALBUMID ARTISTID similarArtists artistHotttnesss songHotnessラウドネステンポ年
年の列にartistHotnesssから数値データで。 だから私は以下のコードを使用して曲間の距離/コサインを計算してみました:
t1=time()
m = 1000
mat = np.zeros((m, m))
for i in range(0,m):
for j in range(0,m):
if i != j:
mat[i][j] = euclidean(data.ix[i,5:], data.ix[j,5:])
'''if data.ix[i,2] == data.ix[j,2]:
mat[i][j] += 1
if data.ix[i,3] == data.ix[j,3]:
mat[i][j] += 1
#l1,l2 - list of similar artists
l1_str = data.ix[i,4].strip(']')[1:]
l2_str = data.ix[j,4].strip(']')[1:]
l1 = l1_str.split()
l2 = l2_str.split()
common = len(set(l1).intersection(l2))
mat[i][j] += common
mat[i][j] /= 3'''
else:
mat[i][j] = 0.0
t2 =time()
print(t2-t1)
だから、これは基本的に10^4 * 10^4回のループが必要です。 これをm = 1000に対して実行すると、2249秒または37.48分で結果が得られるので、m = 10000の結果は得られません。
私はどのように高速化できますか(ループやパンダの機能を避ける)?
おかげで助け
'sklearn 'を使って証明することは、' numpy'と 'for'ループを使うよりも速いのですか? –
は、forループとは異なり線形代数を使用して距離を計算するためです。 (x、y)= sqrt(dot(x、x) - 2 * dot(x、y)+ dot(y、y))(ドットは内積) – dmb
することができます。必要ならnumpyで独自のベクトル化関数を作成しますが、forループが高速になる方法はありません – dmb