tf.linalg.LinearOperatorBlockLowerTriangular
Объединяет LinearOperators в блочно-нижнетреугольную матрицу.
Наследуется от: LinearOperator
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. Учитывая |
batch_shape | Размерность пакетных измерений этого LinearOperator. Если этот оператор действует как пакетная матрица |
domain_dimension | Размерность (в смысле векторных пространств) области действия этого оператора. Если этот оператор действует как пакетная матрица |
dtype | Размерность DType Tensor , обрабатываемых этим LinearOperator. |
graph_parents | Список зависимостей графа этого LinearOperator. (устарело)
|
is_non_singular | |
is_positive_definite | |
is_self_adjoint | |
is_square | Возвращает True/False в зависимости от того, является ли этот оператор квадратным. |
operators | |
range_dimension | Размерность (в смысле векторных пространств) области значений этого оператора. Если этот оператор действует как пакетная матрица |
shape | Размерность этого LinearOperator. Если этот оператор действует как пакетная матрица |
tensor_rank | Ранг (в смысле тензоров) матрицы, соответствующей этому оператору. Если этот оператор действует как пакетная матрица |
Методы
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