tf.linalg.LinearOperator
Базовый класс, определяющий [пачку] линейного оператора[ов].
Наследуется от: Module
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_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)
Пользователи могут затем получить доступ к my_linear_operator.parameters, чтобы увидеть все аргументы, переданные в его инициализатор.
| Args | |
|---|---|
dtype | Тип данного LinearOperator. Аргументы matmul и solve должны быть этого типа. |
graph_parents | (Устарело) Список Python предварительных условий графика для этого LinearOperator. Обычно это тензоры, переданные во время инициализации |
is_non_singular | Ожидается, что этот оператор невырожден. |
is_self_adjoint | Ожидается, что этот оператор равен своему сопряженному транспонированному. Если dtype вещественный, это эквивалентно тому, что он симметричный. |
is_positive_definite | Ожидается, что этот оператор положительно определен, то есть квадратичная форма x^H A x имеет положительную вещественную часть для всех ненулевых x. Обратите внимание, что мы не требуем, чтобы оператор был самосопряженным, чтобы быть положительно определенным. См.: https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices |
is_square | Ожидается, что этот оператор действует как квадратные [пакетные] матрицы. |
name | Имя для этого LinearOperator. |
parameters | Список Python параметров, использованных для создания этого LinearOperator. |
| Raises | |
|---|---|
ValueError | Если какой-либо член graph_parents является None или не является Tensor. |
ValueError | Если указания заданы неправильно. |
| Атрибуты | |
|---|---|
H | Возвращает сопряженный оператор данного LinearOperator. Учитывая |
batch_shape | Форма пакета этого LinearOperator. Если этот оператор действует как пакетная матрица |
domain_dimension | Размер (в смысле векторных пространств) области действия этого оператора. Если этот оператор действует как пакетная матрица |
dtype | Размерность (в смысле тензоров) матриц, обрабатываемых этим LinearOperator. |
graph_parents | Список зависимостей графа этого LinearOperator. (устарело)
|
is_non_singular | |
is_positive_definite | |
is_self_adjoint | |
is_square | Возвращает True/False в зависимости от того, является ли оператор квадратным. |
parameters | Словарь параметров, используемых для инициализации этого LinearOperator. |
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: str = 'adjoint'
) -> 'LinearOperator'
Возвращает сопряжённый оператор текущего LinearOperator.
Дано A, представляющее этот LinearOperator, вернуть A*. Обратите внимание, что вызов self.adjoint() и self.H эквивалентны.
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемое значение | |
|---|---|
LinearOperator, представляющее сопряжённый оператор этого LinearOperator. |
assert_non_singular
assert_non_singular(
name='assert_non_singular'
)
Возвращает утверждение, что этот оператор невырожден.
Этот оператор считается невырожденным, если
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'
)
Возвращает утверждение, что этот оператор положительно определён.
Здесь положительная определённость означает, что квадратичная форма x^H A x имеет положительную действительную часть для всех ненулевых x. Обратите внимание, что для положительной определённости оператор не обязан быть самосопряжённым.
| Аргументы | |
|---|---|
name | Имя для данного Op. |
| Возвращаемое значение | |
|---|---|
Утверждение Assert Op, которое при выполнении вызовет InvalidArgumentError, если оператор не является положительно определённым. |
assert_self_adjoint
assert_self_adjoint(
name='assert_self_adjoint'
)
Возвращает утверждение, что этот оператор самосопряжён.
Здесь мы проверяем, что этот оператор точно равен своему эрмитовому транспонированию.
| Аргументы | |
|---|---|
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: str = 'cholesky'
) -> 'LinearOperator'
Возвращает фактор Холецкого как 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: str = 'inverse'
) -> 'LinearOperator'
Возвращает обратное значение этого 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, решить систему, связанную с сопряженным оператором: 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 равно False. |
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 обрабатывается как [batch] вектор, то есть для каждого набора ведущих измерений последнее измерение определяет вектор. Определение совместимости относительно размерностей пакетов см. в документации класса. |
adjoint | Python bool. Если True, решите систему, включающую сопряжённый с этим LinearOperator: A^H X = rhs. |
name | Имя области действия для операций, добавленных этим методом. |
| Возвращаемое значение | |
|---|---|
Tensor с формой [...,N] и тем же dtype, что и rhs. |
| Исключения | |
|---|---|
NotImplementedError | Если self.is_non_singular или is_square равно False. |
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. |
__getitem__
__getitem__(
slices
)
__matmul__
__matmul__(
other
)
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/linalg/LinearOperator