Извлечь подматрицы максимальной суммы - PullRequest
0 голосов
/ 16 октября 2018

У меня есть матрица 2D NxN, в которой есть элементы из набора действительных чисел.Мне нужно идентифицировать верхние n DxD подматрицы из него так, чтобы их сумма была максимальной, и возвращать верхний левый индекс подматриц.Мне нужно сделать это в Tensorflow.

Например, у меня есть следующая матрица 4x4:

[1 1 4 4]
[1 1 4 4]
[3 3 2 2]
[3 3 2 2]

Мне нужно определить 2 подматрицы, которые имеют наибольшую сумму, и вернуть их вершину.левый указатель.В приведенном выше случае 2 подматрицы, которые имеют наибольшую и вторую по величине суммы:

[[4 4]    [[3 3]
 [4 4]] &  [3 3]]

Мне нужно вернуть [[0,2],[2,0]], верхние левые индексы для обеих матриц.Спасибо.

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете получить это с помощью следующего фрагмента.Идея состоит в том, чтобы построить тензор, содержащий индексы строк и столбцов каждого элемента каждой подматрицы, затем суммировать подматрицы и найти самые большие суммы.

import tensorflow as tf

# Input data
input = tf.placeholder(tf.int32, [None, None])
# Submatrix dimension
dims = tf.placeholder(tf.int32, [2])
# Number of top submatrices to find
k = tf.placeholder(tf.int32, [])
# Sizes
input_shape = tf.shape(input)
rows, cols = input_shape[0], input_shape[1]
d_rows, d_cols = dims[0], dims[1]
subm_rows, subm_cols = rows - d_rows + 1, cols - d_cols + 1
# Index grids
ii, jj = tf.meshgrid(tf.range(subm_rows), tf.range(subm_cols), indexing='ij')
d_ii, d_jj = tf.meshgrid(tf.range(d_rows), tf.range(d_cols), indexing='ij')
# Add indices
subm_ii = ii[:, :, tf.newaxis, tf.newaxis] + d_ii
subm_jj = jj[:, :, tf.newaxis, tf.newaxis] + d_jj
# Make submatrices tensor
subm = tf.gather_nd(input, tf.stack([subm_ii, subm_jj], axis=-1))
# Add submatrices
subm_sum = tf.reduce_sum(subm, axis=(2, 3))
# Use TopK to find top submatrices
_, top_idx = tf.nn.top_k(tf.reshape(subm_sum, [-1]), tf.minimum(k, tf.size(subm_sum)))
# Get row and column
top_row = top_idx // subm_cols
top_col = top_idx % subm_cols
result = tf.stack([top_row, top_col], axis=-1)

# Test
with tf.Session() as sess:
    mat = [
        [1, 1, 4, 4],
        [1, 1, 4, 4],
        [3, 3, 2, 2],
        [3, 3, 2, 2],
    ]
    print(sess.run(result, feed_dict={input: mat, dims: [2, 2], k: 2}))

Вывод:

[[0 2]
 [1 2]]

Обратите внимание, что в этом случае выходные данные равны [0, 2] и [1, 2], но не [2, 0].Это связано с тем, что подматрица, начинающаяся с [1, 2], суммирует ту же сумму, что и матрица с [2, 0], и она находится в матрице, если вы повторяете ее по строкам.Если вы пройдете k: 3 в тесте, вы также получите [2, 0] в результате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...