tf.linalg.LinearOperator
| Просмотреть исходный код на GitHub |
Базовый класс, определяющий [пачку] линейных операторов.
Наследуется от: 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
)
Подклассы 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(по умолчанию), вызывающие стороны не должны иметь ожиданий ни в ту, ни в другую сторону.
| Аргументы | |
|---|---|
dtype | Тип этого LinearOperator. Аргументы для matmul и solve должны быть этого типа. |
graph_parents | Список граф-предпосылок этого 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. |
| Исключения | |
|---|---|
ValueError | Если какой-либо член graph_parents является None или не является Tensor. |
ValueError | Если подсказки заданы неправильно. |
| Атрибуты | |
|---|---|
H | Возвращает сопряженный оператор. Дано |
batch_shape | Размерность пакетных измерений этого оператора. Если этот оператор действует как пакетная матрица |
domain_dimension | Размеры области определения этого оператора. Если этот оператор действует как пакетная матрица |
dtype | Размеры обрабатываемых тензоров этим оператором. |
graph_parents | Список граф-зависимостей этого оператора. |
is_non_singular | |
is_positive_definite | |
is_self_adjoint | |
is_square | Возвращает True/False в зависимости от того, является ли оператор квадратным. |
range_dimension | Размеры области значений этого оператора. Если этот оператор действует как пакетная матрица |
shape | След этого оператора. Если этот оператор действует как пакетная матрица |
tensor_rank | Ранг матрицы, соответствующей этому оператору. Если этот оператор действует как пакетная матрица |
Методы
add_to_tensor
add_to_tensor(
x, name='add_to_tensor'
)
Добавить матрицу, представленную этим оператором, к x. Эквивалентно A + x.
| Аргументы | |
|---|---|
x | Тензор с той же формой и формой, совместимой с вещанием, что и self.shape. |
name | Имя для этого оператора. |
| Возвращаемые значения | |
|---|---|
Тензор с расширенной формой и той же формой, что и self. |
adjoint
adjoint(
name='adjoint'
)
Возвращает сопряженный оператор.
Дано A представляющее этот оператор, вернуть A*. Обратите внимание, что вызовы self.adjoint() и self.H эквивалентны.
| Аргументы | |
|---|---|
name | Имя для этого оператора. |
| Возвращаемые значения | |
|---|---|
| Оператор, представляющий сопряженный оператор. |
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_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'
)
Возвращает объект 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 не предполагается положительно определённым и самосопряжённым. |
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 |
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 matric 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 обрабатывается как [batch] вектор, что означает, что для каждого набора ведущих измерений последнее измерение определяет вектор. Смотрите строку документации класса для определения совместимости. |
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'
)
Решить (точно или приближённо) (batch) системы уравнений: 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 обрабатывается как [batch] матрица, что означает, что для каждого набора ведущих измерений последние два измерения определяют матрицу. Смотрите строку документации класса для определения совместимости. |
adjoint | Python bool. Если True, решить систему, включающую сопряжённый оператор: A^H X = rhs. |
adjoint_arg | Python bool. Если True, решить A X = rhs^H, где rhs^H — эрмитово транспонирование (транспонирование и комплексное сопряжение). |
name | Область имён Python для операций, добавленных этим методом. |
| Возвращаемое значение | |
|---|---|
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] вектор, что означает, что для каждого набора ведущих измерений последнее измерение определяет вектор. Смотрите строку документации класса для определения совместимости по отношению к batch измерениям. |
adjoint | Python bool. Если True, решить систему, включающую сопряжённый оператор: A^H X = rhs. |
name | Область имён Python для операций, добавленных этим методом. |
| Возвращаемое значение | |
|---|---|
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'
)
Возвратить плотно представленную (batch) матрицу, представляющую этот оператор.
trace
trace(
name='trace'
)
След линейного оператора, равный сумме self.diag_part().
Если оператор квадратный, это также сумма собственных значений.
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемое значение | |
|---|---|
Форма [B1,...,Bb] Tensor с той же dtype что и self. |
© 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/r1.15/api_docs/python/tf/linalg/LinearOperator