Spec-Zone.ru › TensorFlow 2.3

tf.linalg.LinearOperatorBlockLowerTriangular

Объединяет LinearOperators в блочно-нижнетреугольную матрицу.

Наследуется от: LinearOperator

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения дополнительных сведений.

tf.compat.v1.linalg.LinearOperatorBlockLowerTriangular

tf.linalg.LinearOperatorBlockLowerTriangular(
    operators, is_non_singular=None, is_self_adjoint=None,
    is_positive_definite=None, is_square=None,
    name='LinearOperatorBlockLowerTriangular'
)

Этот оператор инициализируется вложенным списком линейных операторов, которые объединяются в новую LinearOperator, чья матричная реализация является квадратной и имеет каждый оператор на или ниже главной диагонали, а в остальных местах — нули. Каждый элемент внешнего списка — это список LinearOperators , соответствующих разбиению строк блочной структуры. Количество LinearOperator в разбиении строки i должно быть равно i.

Например, блочная 3 x 3 LinearOperatorBlockLowerTriangular инициализируется списком [[op_00], [op_10, op_11], [op_20, op_21, op_22]], где op_ij, i < 3, j <= i, являются экземплярами LinearOperator. Оператор LinearOperatorBlockLowerTriangular ведет себя как следующая блочная матрица, где 0 представляет матрицы нулей соответствующего размера [парт]:

[[op_00,     0,     0],
 [op_10, op_11,     0],
 [op_20, op_21, op_22]]

Каждый op_jj на диагонали должен представлять квадратную матрицу и, следовательно, будет иметь форму batch_shape_j + [M_j, M_j]. LinearOperator в строке j блочной структуры должны иметь range_dimension равным op_jj, и LinearOperators в столбце j должен иметь domain_dimension равным op_jj.

Если каждый op_jj на диагонали имеет форму batch_shape_j + [M_j, M_j], то комбинированный оператор имеет форму broadcast_batch_shape + [sum M_j, sum M_j], где broadcast_batch_shape является взаимным вещанием batch_shape_j, j = 0, 1, ..., J, предполагая, что промежуточные формы пакетных массивов вещаются. Даже если объединенная форма хорошо определена, методы объединенного оператора могут завершиться неудачей из-за отсутствия возможности вещания в методах определенных операторов.

Например, для создания 4x4 линейного оператора, объединённого из трёх 2x2 операторов:

operator_0 = tf.linalg.LinearOperatorFullMatrix([[1., 2.], [3., 4.]]) operator_1 = tf.linalg.LinearOperatorFullMatrix([[1., 0.], [0., 1.]]) operator_2 = tf.linalg.LinearOperatorLowerTriangular([[5., 6.], [7., 8]]) operator = LinearOperatorBlockLowerTriangular( ... [[operator_0], [operator_1, operator_2]])

operator.to_dense()
<tf.Tensor: shape=(4, 4), dtype=float32, numpy=
array([[1., 2., 0., 0.],
       [3., 4., 0., 0.],
       [1., 0., 5., 0.],
       [0., 1., 7., 8.]], dtype=float32)>
operator.shape
TensorShape([4, 4])
operator.log_abs_determinant()
<tf.Tensor: shape=(), dtype=float32, numpy=4.3820267>
x0 = [[1., 6.], [-3., 4.]]
x1 = [[0., 2.], [4., 0.]]
x = tf.concat([x0, x1], 0)  # Shape [2, 4] Tensor
operator.matmul(x)
<tf.Tensor: shape=(4, 2), dtype=float32, numpy=
array([[-5., 14.],
       [-9., 34.],
       [ 1., 16.],
       [29., 18.]], dtype=float32)>

Вышеуказанный matmul эквивалентен:

tf.concat([operator_0.matmul(x0), ... operator_1.matmul(x0) + operator_2.matmul(x1)], axis=0)

Совместимость форм

Этот оператор действует на [пакетную] матрицу со совместимой формой. x является пакетной матрицей с совместимой формой для matmul и solve если

operator.shape = [B1,...,Bb] + [M, N],  with b >= 0
x.shape =        [B1,...,Bb] + [N, R],  with R >= 0.

Например:

Создайте [2, 3] пакет из 4x4 линейных операторов:

matrix_44 = tf.random.normal(shape=[2, 3, 4, 4]) operator_44 = tf.linalg.LinearOperatorFullMatrix(matrix_44)

Создайте [1, 3] пакет из 5x4 линейных операторов:

matrix_54 = tf.random.normal(shape=[1, 3, 5, 4]) operator_54 = tf.linalg.LinearOperatorFullMatrix(matrix_54)

Создайте [1, 3] пакет из 5x5 линейных операторов:

matrix_55 = tf.random.normal(shape=[1, 3, 5, 5]) operator_55 = tf.linalg.LinearOperatorFullMatrix(matrix_55)

Объедините, чтобы создать [2, 3] пакет из 9x9 операторов:

operator_99 = LinearOperatorBlockLowerTriangular( ... [[operator_44], [operator_54, operator_55]]) operator_99.shape TensorShape([2, 3, 9, 9])

Создайте пакет векторов формы [2, 1, 9] и примените к нему оператор.

x = tf.random.normal(shape=[2, 1, 9]) y = operator_99.matvec(x) y.shape TensorShape([2, 3, 9])

Создайте блочный список векторов и примените к нему оператор. Возвращается блочный список.

x4 = tf.random.normal(shape=[2, 1, 4]) x5 = tf.random.normal(shape=[2, 3, 5]) y_blockwise = operator_99.matvec([x4, x5]) y_blockwise[0].shape TensorShape([2, 3, 4]) y_blockwise[1].shape TensorShape([2, 3, 5])

Производительность

Предположим, что operator является LinearOperatorBlockLowerTriangular, состоящим из D разбиений строк и D разбиений столбцов, таким образом, что общее количество операторов равно N = D * (D + 1) // 2.

  • operator.matmul имеет сложность, равную сумме сложностей отдельных операторов.
  • operator.solve имеет сложность, равную сумме сложностей операторов на диагонали и сложностей операторов вне диагонали.
  • operator.determinant имеет сложность, равную сумме сложностей операторов на диагонали.

Подсказки о свойствах матрицы

Этот LinearOperator инициализируется булевыми флагами вида is_X, для X = non_singular, self_adjoint, positive_definite, square. Они имеют следующее значение:

  • Если is_X == True, вызывающие стороны должны ожидать, что оператор обладает свойством X. Это обещание, которое должно быть выполнено, но это не проверка во время выполнения. Например, конечная точность чисел с плавающей запятой может привести к нарушению этих обещаний.
  • Если is_X == False, вызывающие стороны должны ожидать, что оператор не обладает свойством X.
  • Если is_X == None (по умолчанию), вызывающие стороны не должны иметь ожиданий.
Аргументы
operators Итерируемый набор итерируемых наборов объектов LinearOperator, каждый с той же формой dtype. Каждый элемент operators соответствует разбиению строк, в порядке сверху вниз. Операторы в каждом разбиении строк заполняются слева направо. Например, operators = [[op_0], [op_1, op_2], [op_3, op_4, op_5]] создает LinearOperatorBlockLowerTriangular с полной блочной структурой [[op_0, 0, 0], [op_1, op_2, 0], [op_3, op_4, op_5]]. Количество операторов в i-й строке должно быть равно i, таким образом, что каждый оператор попадает на или ниже диагонали блочной структуры. LinearOperator на диагонали (последние элементы каждой строки) должны быть квадратными. Другие LinearOperator должны иметь размер области определения, равный размеру области определения LinearOperator в том же разбиении столбцов, и размер области значений, равный размеру области значений LinearOperator в том же разбиении строк.
is_non_singular Ожидать, что этот оператор не является вырожденным.
is_self_adjoint Ожидать, что этот оператор равен своему эрмитовому транспонированию.
is_positive_definite Ожидать, что этот оператор является положительно определённым, что означает, что квадратичная форма x^H A x имеет положительную вещественную часть для всех ненулевых x. Обратите внимание, что для того, чтобы оператор был положительно определённым, он не обязательно должен быть самосопряжённым. См.: https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices
is_square Ожидать, что этот оператор действует как квадратные [пакетные] матрицы. Это вызовет ValueError если установлено значение False.
name Имя для этого LinearOperator.
Возможные исключения
TypeError Если все операторы не имеют одинаковую форму dtype.
ValueError Если operators пуст, содержит неправильное количество элементов или содержит операторы с несовместимыми формами.
Атрибуты
H Возвращает сопряжённую матрицу текущего LinearOperator.

Учитывая A , представляющее эту LinearOperator, возвращает A*. Обратите внимание, что вызов self.adjoint() и self.H эквивалентны.

batch_shape Размерность пакетных измерений этого LinearOperator.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то возвращает TensorShape([B1,...,Bb]), эквивалентное A.shape[:-2].

domain_dimension Размерность (в смысле векторных пространств) области действия этого оператора.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то возвращает N.

dtype Размерность DType Tensor , обрабатываемых этим LinearOperator.
graph_parents Список зависимостей графа этого LinearOperator. (устарело)
Предупреждение: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущих версиях. Инструкции по обновлению: Не вызывайте graph_parents.
is_non_singular
is_positive_definite
is_self_adjoint
is_square Возвращает True/False в зависимости от того, является ли этот оператор квадратным.
operators
range_dimension Размерность (в смысле векторных пространств) области значений этого оператора.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то возвращает M.

shape Размерность этого LinearOperator.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то возвращает TensorShape([B1,...,Bb, M, N]), эквивалентное A.shape.

tensor_rank Ранг (в смысле тензоров) матрицы, соответствующей этому оператору.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то возвращает b + 2.

Методы

add_to_tensor

Посмотреть исходный код

add_to_tensor(
    x, name='add_to_tensor'
)

Добавляет матрицу, представленную этим оператором, к x. Эквивалентно A + x.

Аргументы
x Tensor с той же dtype и формой, совместимой с self.shape.
name Имя для этого Op.
Возвращаемое значение
Tensor с формой расширения и той же dtype , что и self.

adjoint

Посмотреть исходный код

adjoint(
    name='adjoint'
)

Возвращает сопряжённую матрицу текущего LinearOperator.

Учитывая A , представляющее эту LinearOperator, возвращает A*. Обратите внимание, что вызов self.adjoint() и self.H эквивалентны.

Аргументы
name Имя для этого Op.
Возвращаемое значение
LinearOperator , представляющее сопряжённую матрицу этого LinearOperator.

assert_non_singular

Посмотреть исходный код

assert_non_singular(
    name='assert_non_singular'
)

Возвращает Op , утверждающий, что этот оператор невырожден.

Этот оператор считается невырожденным, если

ConditionNumber < max{100, range_dimension, domain_dimension} * eps,
eps := np.finfo(self.dtype.as_numpy_dtype).eps
Аргументы
name Имя строки, добавляемое к созданным операциям.
Возвращаемое значение
Assert Op, который, при выполнении, выведет InvalidArgumentError , если оператор вырожден.

assert_positive_definite

Посмотреть исходный код

assert_positive_definite(
    name='assert_positive_definite'
)

Возвращает Op , утверждающий, что этот оператор положительно определён.

Здесь положительная определённость означает, что квадратичная форма x^H A x имеет положительную действительную часть для всех ненулевых x. Обратите внимание, что для положительной определённости оператор не обязательно должен быть самосопряжённым.

Аргументы
name Имя для этого Op.
Возвращаемое значение
Assert Op, который, при выполнении, выведет InvalidArgumentError , если оператор не положительно определён.

assert_self_adjoint

Просмотр исходного кода

assert_self_adjoint(
    name='assert_self_adjoint'
)

Возвращает Op, который утверждает, что этот оператор является самосопряжённым.

Здесь мы проверяем, что этот оператор точно равен своему эрмитовому транспонированию.

Аргументы
name Имя строки, добавляемое к создаваемым операциям.
Возвращаемое значение
Assert Op, который, при выполнении, выведет InvalidArgumentError, если оператор не является самосопряжённым.

batch_shape_tensor

Просмотр исходного кода

batch_shape_tensor(
    name='batch_shape_tensor'
)

Форма пакетных измерений этого оператора, определяемая во время выполнения.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает Tensor, содержащую [B1,...,Bb].

Аргументы
name Имя для этого Op .
Возвращаемое значение
int32 Tensor

cholesky

Просмотр исходного кода

cholesky(
    name='cholesky'
)

Возвращает фактор Холецкого как LinearOperator.

Учитывая A , представляющее этот LinearOperator, если A является положительно определённой самосопряжённой, верните L, где A = L L^T, то есть разложение Холецкого.

Аргументы
name Имя для этого Op .
Возвращаемое значение
LinearOperator , представляющее нижнюю треугольную матрицу в разложении Холецкого.
Исключения
ValueError При указании, что LinearOperator не предполагается положительно определённым и самосопряжённым.

cond

Просмотр исходного кода

cond(
    name='cond'
)

Возвращает числовую характеристику (число обусловленности) этого линейного оператора.

Аргументы
name Имя для этого Op .
Возвращаемое значение
Форма [B1,...,Bb] Tensor той же dtype, что и self.

determinant

Просмотр исходного кода

determinant(
    name='det'
)

Определитель для каждого члена группы.

Аргументы
name Имя для этого Op.
Возвращает
Tensor с формой self.batch_shape и такой же dtype как у self.
Возможные исключения
NotImplementedError Если self.is_square является False.

diag_part

Просмотреть исходный код

diag_part(
    name='diag_part'
)

Эффективно получить [групповой] диагональный элемент этого оператора.

Если у этого оператора форма [B1,...,Bb, M, N], это возвращает Tensor diagonal, с формой [B1,...,Bb, min(M, N)], где diagonal[b1,...,bb, i] = self.to_dense()[b1,...,bb, i, i].

my_operator = LinearOperatorDiag([1., 2.])

# Efficiently get the diagonal
my_operator.diag_part()
==> [1., 2.]

# Equivalent, but inefficient method
tf.linalg.diag_part(my_operator.to_dense())
==> [1., 2.]
Аргументы
name Имя для этого Op.
Возвращает
diag_part Tensor с такой же dtype как у self.

domain_dimension_tensor

Просмотреть исходный код

domain_dimension_tensor(
    name='domain_dimension_tensor'
)

Размерность (в смысле векторных пространств) области действия этого оператора.

Определяется во время выполнения.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает N.

Аргументы
name Имя для этого Op.
Возвращает
int32 Tensor

eigvals

Просмотреть исходный код

eigvals(
    name='eigvals'
)

Возвращает собственные значения этого линейного оператора.

Если оператор помечен как самосопряженный (через is_self_adjoint) это вычисление может быть более эффективным.

Примечание: В настоящее время поддерживаются только самосопряженные операторы.
Аргументы
name Имя для этого Op.
Возвращает
Форма [B1,...,Bb, N] Tensor с такой же dtype как у self.

inverse

Просмотреть исходный код

inverse(
    name='inverse'
)

Возвращает обратную матрицу для этого LinearOperator.

Учитывая A , представляющий этот LinearOperator, вернуть LinearOperator , представляющий A^-1.

Аргументы
name Область имен для операций, добавленных этим методом.
Возвращает
LinearOperator , представляющий обратную матрицу.
Возможные исключения
ValueError Если LinearOperator не указано как non_singular.

log_abs_determinant

Просмотреть исходный код

log_abs_determinant(
    name='log_abs_det'
)

Логарифм абсолютного значения определителя для каждого члена группы.

Аргументы
name Имя для этого Op.
Возвращает
Tensor с формой self.batch_shape и такой же dtype как у self.
Возможные исключения
NotImplementedError Если self.is_square является False.

matmul

Просмотреть исходный код

matmul(
    x, adjoint=False, adjoint_arg=False, name='matmul'
)

Преобразование [групповой] матрицы x левым умножением: x --> Ax.

# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
operator.shape = [..., M, N]

X = ... # shape [..., N, R], batch matrix, R > 0.

Y = operator.matmul(X)
Y.shape
==> [..., M, R]

Y[..., :, r] = sum_j A[..., :, j] X[j, r]
Аргументы
x LinearOperator, Tensor с совместимой формой и такой же dtype как у self, или блочный итерируемый объект LinearOperator или Tensor. См. строку документа класса для определения совместимости формы.
adjoint Python bool. Если True, умножьте слева на сопряжённое: A^H x.
adjoint_arg Python bool. Если True, вычислите A x^H, где x^H - эрмитово транспонирование (транспонирование и комплексное сопряжение).
name Имя для этого Op.
Возвращает
LinearOperator или Tensor с формой [..., M, R] и такой же dtype как у self, или, если x является блочным итерируемым объектом, список Tensor с формами, которые конкатенируются в [..., M, R].

matvec

Просмотреть исходный код

matvec(
    x, adjoint=False, name='matvec'
)

Преобразование [группового] вектора x левым умножением: x --> Ax.

# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)

X = ... # shape [..., N], batch vector

Y = operator.matvec(X)
Y.shape
==> [..., M]

Y[..., :] = sum_j A[..., :, j] X[..., j]
Аргументы
x Tensor с совместимой формой и такой же dtype как у self, или итерируемый объект Tensor . Tensor рассматриваются как [групповые] векторы, т.е. для каждой группы ведущих измерений последнее измерение определяет вектор. См. строку документа класса для определения совместимости.
adjoint Python bool. Если True, умножьте слева на сопряжённое: A^H x.
name Имя для этого Op.
Возвращает
Tensor с формой [..., M] и такой же dtype как у self.

range_dimension_tensor

Просмотреть исходный код

range_dimension_tensor(
    name='range_dimension_tensor'
)

Размерность (в смысле векторных пространств) области значений этого оператора.

Определяется во время выполнения.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает M.

Аргументы
name Имя для этого Op.
Возвращает
int32 Tensor

shape_tensor

Просмотреть исходный код

shape_tensor(
    name='shape_tensor'
)

Форма этого LinearOperator, определяемая во время выполнения.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает Tensor , содержащую [B1,...,Bb, M, N], эквивалентную tf.shape(A).

Аргументы
name Имя для этого Op.
Возвращает
int32 Tensor

solve

Просмотреть исходный код

solve(
    rhs, adjoint=False, adjoint_arg=False, name='solve'
)

Решить (точно или приближённо) R (пакетные) системы уравнений: A X = rhs.

Возвращаемое значение Tensor будет близко к точному решению, если A хорошо обусловлено. В противном случае близость будет меняться. Подробности см. в строке документации класса.

Учитывая блочно-построенный n + 1×n + 1 линейный оператор:

op = [[A_00 0 ... 0 ... 0], [A_10 A_11 ... 0 ... 0], ... [A_k0 A_k1 ... A_kk ... 0], ... [A_n0 A_n1 ... A_nk ... A_nn]]

мы находим x = op.solve(y) , заметив, что

y_k = A_k0.matmul(x_0) + A_k1.matmul(x_1) + ... + A_kk.matmul(x_k)

и следовательно

x_k = A_kk.solve(y_k - A_k0.matmul(x_0) - ... - A_k(k-1).matmul(x_(k-1)))

где x_k и y_k — k-ые блоки, полученные путём разложения x и y вдоль соответствующих осей.

Сначала мы решаем x_0 = A_00.solve(y_0). Индуктивно мы решаем для x_k, k = 1..n, учитывая x_0..x_(k-1).

Аналогично решается случай сопряжённого оператора, начиная с x_n = A_nn.solve(y_n, adjoint=True) и двигаясь назад.

Примеры:

# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
operator.shape = [..., M, N]

# Solve R > 0 linear systems for every member of the batch.
RHS = ... # shape [..., M, R]

X = operator.solve(RHS)
# X[..., :, r] is the solution to the r'th linear system
# sum_j A[..., :, j] X[..., j, r] = RHS[..., :, r]

operator.matmul(X)
==> RHS
Аргументы
rhs Tensor с такими же dtype как у данного оператора и совместимой формой, или список Tensor. Tensor обрабатываются как [пакетные] матрицы, то есть для каждого набора ведущих измерений последние два измерения определяют матрицу. Определение совместимости см. в строке документации класса.
adjoint Python bool. Если True, решить систему, включающую сопряжённый оператор LinearOperator: A^H X = rhs.
adjoint_arg Python bool. Если True, решить A X = rhs^H, где rhs^H — эрмитово-сопряжённая (транспонированная и комплексно сопряжённая) матрица.
name Имя области видимости для операций, добавленных этим методом.
Возвращает
Tensor с формой [...,N, R] и такими же dtype как у rhs.
Исключения
NotImplementedError Если self.is_non_singular или is_square ложно.

solvevec

Просмотреть исходный код

solvevec(
    rhs, adjoint=False, name='solve'
)

Решить единственное уравнение с максимальной точностью: A X = rhs.

Возвращаемое значение Tensor будет близко к точному решению, если A хорошо обусловлено. В противном случае близость будет меняться. Подробности см. в строке документации класса.

Примеры:

# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
operator.shape = [..., M, N]

# Solve one linear system for every member of the batch.
RHS = ... # shape [..., M]

X = operator.solvevec(RHS)
# X is the solution to the linear system
# sum_j A[..., :, j] X[..., j] = RHS[..., :]

operator.matvec(X)
==> RHS
Аргументы
rhs Tensor с такими же dtype как у данного оператора, или список Tensor (для блочных операторов). Tensor обрабатываются как [пакетные] векторы, то есть для каждого набора ведущих измерений последнее измерение определяет вектор. Определение совместимости относительно пакетных измерений см. в строке документации класса.
adjoint Python bool. Если True, решить систему, включающую сопряжённый оператор LinearOperator: A^H X = rhs.
name Имя области видимости для операций, добавленных этим методом.
Возвращает
Tensor с формой [...,N] и такими же dtype как у rhs.
Исключения
NotImplementedError Если self.is_non_singular или is_square ложно.

tensor_rank_tensor

Просмотреть исходный код

tensor_rank_tensor(
    name='tensor_rank_tensor'
)

Ранг (в смысле тензоров) матрицы, соответствующей этому оператору.

Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает b + 2.

Аргументы
name Имя для данного Op.
Возвращает
int32 Tensor, определяемый во время выполнения.

to_dense

Просмотреть исходный код

to_dense(
    name='to_dense'
)

Возвратить плотную (пакетную) матрицу, представляющую этот оператор.

trace

Просмотреть исходный код

trace(
    name='trace'
)

След линейного оператора, равный сумме self.diag_part().

Если оператор квадратный, то это также сумма собственных значений.

Аргументы
name Имя для данного Op.
Возвращает
Форма [B1,...,Bb] Tensor тех же dtype как у self.

__matmul__

Просмотреть исходный код

__matmul__(
    other
)

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/linalg/LinearOperatorBlockLowerTriangular

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API