Spec-Zone.ru › TensorFlow 2.4

tf.linalg.LinearOperator

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

Базовый класс, определяющий [группу] линейного оператора[ов].

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

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

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

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

tf.compat.v1.linalg.LinearOperator

tf.linalg.LinearOperator(
    dtype, graph_parents=None, is_non_singular=None, is_self_adjoint=None,
    is_positive_definite=None, is_square=None, name=None, parameters=None
)

Подклассы LinearOperator обеспечивают доступ к общим методам (группы) матрицы без необходимости ее материализации. Это позволяет:

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

Наследование

Для включения публичного метода подклассы должны реализовать метод с ведущим подчеркиванием. Подпись аргументов должна быть идентична, за исключением пропуска name="...". Например, для включения matmul(x, adjoint=False, name="matmul") подкласс должен реализовать _matmul(x, adjoint=False).

Контракт производительности

Подклассы должны реализовывать только методы assert (например, assert_non_singular) если они могут быть выполнены менее чем за O(N^3) времени.

Документация класса должна содержать объяснение вычислительной сложности. Поскольку это библиотека высокой производительности, необходимо обращать внимание на детали, а объяснения могут включать константы и обозначения Big-O.

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

Подклассы LinearOperator должны работать с [группой] матрицей с совместимой формой. Документация класса должна определить, что подразумевается под совместимой формой. Некоторые подклассы могут не поддерживать группирование.

Примеры:

x — это групповая матрица с совместимой формой для matmul если

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

rhs — это групповая матрица с совместимой формой для solve если

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

Пример документации для подклассов.

Этот оператор действует как (групповая) матрица A с формой [B1,...,Bb, M, N] для некоторого b >= 0. Первые b индексы индексируют члена группы. Для каждого индекса группы (i1,...,ib), A[i1,...,ib, : :] является m x n матрицей. Опять же, эта матрица A может не быть материализована, но для целей идентификации и работы с совместимыми аргументами форма является актуальной.

Примеры:

some_tensor = ... shape = ????
operator = MyLinOp(some_tensor)

operator.shape()
==> [2, 4, 4]

operator.log_abs_determinant()
==> Shape [2] Tensor

x = ... Shape [2, 4, 5] Tensor

operator.matmul(x)
==> Shape [2, 4, 5] Tensor

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

Этот оператор действует на групповые матрицы с совместимой формой. ЗАПОЛНИТЕ, ЧТО ПОНИМАТЬ ПОД СОВМЕСТИМОЙ ФОРМОЙ

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

ЗАПОЛНИТЕ ЭТО

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

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

  • Если is_X == True, вызывающие стороны должны ожидать, что оператор будет обладать свойством X. Это обещание, которое должно быть выполнено, но это не проверка во время выполнения. Например, конечная точность чисел с плавающей запятой может привести к нарушению этих обещаний.
  • Если is_X == False, вызывающие стороны должны ожидать, что оператор не будет обладать X.
  • Если is_X == None (по умолчанию), у вызывающих сторон не должно быть ожиданий ни в ту, ни в другую сторону.

Параметры инициализации

Все подклассы LinearOperator должны передавать аргумент parameters в super().__init__(). Он должен быть dict содержащим необработанные аргументы, переданные подклассу __init__. Например, MyLinearOperator с инициализатором должен выглядеть так:

def __init__(self, operator, is_square=False, name=None):
   parameters = dict(
       operator=operator,
       is_square=is_square,
       name=name
   )
   ...
   super().__init__(..., parameters=parameters)
 ```

 Users can then access `my_linear_operator.parameters` to see all arguments
 passed to its initializer.

<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Args</h2></th></tr>

<tr>
<td>
`dtype`
</td>
<td>
The type of the this `LinearOperator`.  Arguments to `matmul` and
`solve` will have to be this type.
</td>
</tr><tr>
<td>
`graph_parents`
</td>
<td>
(Deprecated) Python list of graph prerequisites of this
`LinearOperator` Typically tensors that are passed during initialization
</td>
</tr><tr>
<td>
`is_non_singular`
</td>
<td>
Expect that this operator is non-singular.
</td>
</tr><tr>
<td>
`is_self_adjoint`
</td>
<td>
Expect that this operator is equal to its hermitian
transpose.  If `dtype` is real, this is equivalent to being symmetric.
</td>
</tr><tr>
<td>
`is_positive_definite`
</td>
<td>
Expect that this operator is positive definite,
meaning the quadratic form `x^H A x` has positive real part for all
nonzero `x`.  Note that we do not require the operator to be
self-adjoint to be positive-definite.  See:
<a href="https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices">https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices</a>
</td>
</tr><tr>
<td>
`is_square`
</td>
<td>
Expect that this operator acts like square [batch] matrices.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
A name for this `LinearOperator`.
</td>
</tr><tr>
<td>
`parameters`
</td>
<td>
Python `dict` of parameters used to instantiate this
`LinearOperator`.
</td>
</tr>
</table>



<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Raises</h2></th></tr>

<tr>
<td>
`ValueError`
</td>
<td>
If any member of graph_parents is `None` or not a `Tensor`.
</td>
</tr><tr>
<td>
`ValueError`
</td>
<td>
If hints are set incorrectly.
</td>
</tr>
</table>





<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2"><h2 class="add-link">Attributes</h2></th></tr>

<tr>
<td>
`H`
</td>
<td>
Returns the adjoint of the current `LinearOperator`.

Given `A` representing this `LinearOperator`, return `A*`.
Note that calling `self.adjoint()` and `self.H` are equivalent.
</td>
</tr><tr>
<td>
`batch_shape`
</td>
<td>
`TensorShape` of batch dimensions of this `LinearOperator`.

If this operator acts like the batch matrix `A` with
`A.shape = [B1,...,Bb, M, N]`, then this returns
`TensorShape([B1,...,Bb])`, equivalent to `A.shape[:-2]`
</td>
</tr><tr>
<td>
`domain_dimension`
</td>
<td>
Dimension (in the sense of vector spaces) of the domain of this operator.

If this operator acts like the batch matrix `A` with
`A.shape = [B1,...,Bb, M, N]`, then this returns `N`.
</td>
</tr><tr>
<td>
`dtype`
</td>
<td>
The `DType` of `Tensor`s handled by this `LinearOperator`.
</td>
</tr><tr>
<td>
`graph_parents`
</td>
<td>
List of graph dependencies of this `LinearOperator`. (deprecated)

Warning: THIS FUNCTION IS DEPRECATED. It will be removed in a future version.
Instructions for updating:
Do not call `graph_parents`.
</td>
</tr><tr>
<td>
`is_non_singular`
</td>
<td>

</td>
</tr><tr>
<td>
`is_positive_definite`
</td>
<td>

</td>
</tr><tr>
<td>
`is_self_adjoint`
</td>
<td>

</td>
</tr><tr>
<td>
`is_square`
</td>
<td>
Return `True/False` depending on if this operator is square.
</td>
</tr><tr>
<td>
`parameters`
</td>
<td>
Dictionary of parameters used to instantiate this `LinearOperator`.
</td>
</tr><tr>
<td>
`range_dimension`
</td>
<td>
Dimension (in the sense of vector spaces) of the range of this operator.

If this operator acts like the batch matrix `A` with
`A.shape = [B1,...,Bb, M, N]`, then this returns `M`.
</td>
</tr><tr>
<td>
`shape`
</td>
<td>
`TensorShape` of this `LinearOperator`.

If this operator acts like the batch matrix `A` with
`A.shape = [B1,...,Bb, M, N]`, then this returns
`TensorShape([B1,...,Bb, M, N])`, equivalent to `A.shape`.
</td>
</tr><tr>
<td>
`tensor_rank`
</td>
<td>
Rank (in the sense of tensors) of matrix corresponding to this operator.

If this operator acts like the batch matrix `A` with
`A.shape = [B1,...,Bb, M, N]`, then this returns `b + 2`.
</td>
</tr>
</table>



## Methods

<h3 id="add_to_tensor"><code>add_to_tensor</code></h3>

<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v2.4.0/tensorflow/python/ops/linalg/linear_operator.py#L1077-L1090">View source</a>

<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>add_to_tensor(
    x, name=&#x27;add_to_tensor&#x27;
)
</code></pre>

Add matrix represented by this operator to `x`.  Equivalent to `A + x`.


<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>

<tr>
<td>
`x`
</td>
<td>
`Tensor` with same `dtype` and shape broadcastable to `self.shape`.
</td>
</tr><tr>
<td>
`name`
</td>
<td>
A name to give this `Op`.
</td>
</tr>
</table>



<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr class="alt">
<td colspan="2">
A `Tensor` with broadcast shape and same `dtype` as `self`.
</td>
</tr>

</table>



<h3 id="adjoint"><code>adjoint</code></h3>

<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v2.4.0/tensorflow/python/ops/linalg/linear_operator.py#L933-L948">View source</a>

<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>adjoint(
    name=&#x27;adjoint&#x27;
)
</code></pre>

Returns the adjoint of the current `LinearOperator`.

Given `A` representing this `LinearOperator`, return `A*`.
Note that calling `self.adjoint()` and `self.H` are equivalent.

<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Args</th></tr>

<tr>
<td>
`name`
</td>
<td>
A name for this `Op`.
</td>
</tr>
</table>



<!-- Tabular view -->
 <table class="responsive fixed orange">
<colgroup><col width="214px"><col></colgroup>
<tr><th colspan="2">Returns</th></tr>
<tr class="alt">
<td colspan="2">
`LinearOperator` which represents the adjoint of this `LinearOperator`.
</td>
</tr>

</table>



<h3 id="assert_non_singular"><code>assert_non_singular</code></h3>

<a target="_blank" href="https://github.com/tensorflow/tensorflow/blob/v2.4.0/tensorflow/python/ops/linalg/linear_operator.py#L541-L559">View source</a>

<pre class="devsite-click-to-copy prettyprint lang-py tfo-signature-link">
<code>assert_non_singular(
    name=&#x27;assert_non_singular&#x27;
)
</code></pre>

Returns an `Op` that asserts this operator is non singular.

This operator is considered non-singular if

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. См. строку документа класса для определения совместимости.
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.

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. x рассматривается как [пакетный] вектор, то есть для каждой группы ведущих размерностей последняя размерность определяет вектор. См. строку документа класса для определения совместимости.
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 хорошо обусловлена. В противном случае близость будет варьироваться. Подробности см. в строке документа класса.

Примеры:

# 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 , что и у этого оператора, и совместимой формой. rhs обрабатывается как [пакетная] матрица, что означает, что для каждого набора ведущих измерений последние два измерения определяют матрицу. См. строку документации класса для определения совместимости.
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 , что и у этого оператора. rhs обрабатывается как [пакетный] вектор, что означает, что для каждого набора ведущих измерений последнее измерение определяет вектор. См. строку документации класса для определения совместимости по пакетным измерениям.
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.4/api_docs/python/tf/linalg/LinearOperator

Spec-Zone.ru

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