2017-07-16 41 views
1

我正在寫一個聚類算法,對於其中的一部分,我計算了每個聚類點的歐幾里得距離矩陣。 (僅供參考,所有這些都在Tensorflow中)。每個聚類都是一個8維向量的列表,然後我變成一個M * 8矩陣。對於每個羣集中的每個點,我想找到它與其最近的鄰居之間的距離。我相信最有效的方法是計算每個簇的點之間的成對距離,然後在得到的M×M矩陣的每一行中找到第二小的值(因爲每一行中的最小值總是0,給定點與其自身之間的距離)。如何找到tensorflow數組中的第二低值

下面是我用它來創建每個羣集的歐氏距離矩陣代碼:

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) 

所產生的基質可能看起來像這樣(注:這是距離的平方的矩陣):

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

爲輸入矩陣:

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

我想在日獲得e end是每行中第二小的值,在這種情況下是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函數正是我所需要的。這應該使它非常簡單。 –

相關問題