2017-07-16 20 views
1

私はクラスタリングアルゴリズムを書いており、その一部については、各クラスターのユークリッド距離行列を計算しています。 (FYIのすべてはTensorflowにあります)。各クラスタは8次元ベクトルのリストであり、それを1つのM * 8行列に変換します。各クラスタの各点について、そのクラスタと最も近い隣人との間の距離を求めたい。私は、これを行う最も効率的な方法は、各クラスタのポイント間の対間距離を計算し、結果のM * M行列の各行で2番目に小さい値を見つけることです(各行の最小値は常に0、与えられた点とそれ自身の間の距離)。ここでテンソルフローの2番目に小さい値を見つける方法

は、私は、各クラスタのユークリッド距離行列を作成するために使用するコードです:

partitionedData = tf.dynamic_partition(inputs, pred, num_classes) 
    for partition in partitionedData: 
     N = tf.to_int32(partition.get_shape()[0]) 
     qexpand = tf.expand_dims(partition,1) 
     qTexpand = tf.expand_dims(partition,0) 
     qtile = tf.tile(qexpand,[1,N,1]) 
     qTtile = tf.tile(qTexpand,[N,1,1]) 
     deltaQ = qtile - qTtile 
     deltaQ2 = deltaQ*deltaQ 
     d2Q = tf.reduce_sum(deltaQ2,2) 

結果の行列は、この(注:これは距離の二乗の行列である):のようなものに見えるかもしれません

を私が目に取得したいと思い何

[[2,3],[4,5],[1,4],[5,6]] 

:の入力行列のため

[[ 0. 8. 2. 18.] 
[ 8. 0. 10. 2.] 
[ 2. 10. 0. 20.] 
[ 18. 2. 20. 0.]] 

e endは、各行の2番目に小さい値です。この場合は2,2,2および2です。さらに、計算上のクラスター内のすべての点について、テンソルフローで最も近い隣にある距離を見つけるより良い方法があれば効率的な、それは非常に役に立つでしょう。

答えて

0

TFのk番目の要素を見つけるにはtf.nn.top_kが必要です。最小必要な場合は、Xではなく、-Xで検索してください。

あなたの場合、あなたはそれも必要ありません。あなたの行列が距離である場合、対角線は常に0であり、これはあなたのために物事をねじ込みます。だからちょうどtf.matrix_set_diagとあなたの行列の対角線を変更して、あなたの対角線があなたのXのサイズのベクトルであるところに変更してください。各値はtf.reduce_maxです。

このコードを書くのは簡単です。

+0

ありがとうございます。 tf.matrix_set_diag関数は必要なものです。それは非常に簡単にする必要があります。 –

関連する問題