Spec-Zone.ru › TensorFlow

tf.linalg.LinearOperatorLowRankUpdate

Возмущение LinearOperator с помощью обновления ранга K.

Наследует от: LinearOperator, Module

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

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

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

tf.compat.v1.linalg.LinearOperatorLowRankUpdate

tf.linalg.LinearOperatorLowRankUpdate(
    base_operator,
    u,
    diag_update=None,
    v=None,
    is_diag_update_positive=None,
    is_non_singular=None,
    is_self_adjoint=None,
    is_positive_definite=None,
    is_square=None,
    name='LinearOperatorLowRankUpdate'
)

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

LinearOperatorLowRankUpdate представляет A = L + U D V^H, где

L, is a LinearOperator representing [batch] M x N matrices
U, is a [batch] M x K matrix.  Typically K << M.
D, is a [batch] K x K matrix.
V, is a [batch] N x K matrix.  Typically K << N.
V^H is the Hermitian transpose (adjoint) of V.

Если M = N, определители и решения вычисляются с использованием леммы о детерминанте матрицы и тождеств Вудбери, поэтому L и D должны быть невырожденными.

Вычисление решений и определителей будет выполняться, если только свойство «is_non_singular» для L и D не равно False.

Если L и D являются положительно определёнными, а U = V, решения и определители можно вычислить с помощью разложения Холецкого.

# Create a 3 x 3 diagonal linear operator.
diag_operator = LinearOperatorDiag(
    diag_update=[1., 2., 3.], is_non_singular=True, is_self_adjoint=True,
    is_positive_definite=True)

# Perturb with a rank 2 perturbation
operator = LinearOperatorLowRankUpdate(
    operator=diag_operator,
    u=[[1., 2.], [-1., 3.], [0., 0.]],
    diag_update=[11., 12.],
    v=[[1., 2.], [-1., 3.], [10., 10.]])

operator.shape
==> [3, 3]

operator.log_abs_determinant()
==> scalar Tensor

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

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

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

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

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

Предположим, что operator — это LinearOperatorLowRankUpdate формы [M, N], полученное с помощью обновления ранга K для base_operator, которое выполняет .matmul(x) над x, имеющим x.shape = [N, R] со сложностью O(L_matmul*N*R) (и аналогично для solve, determinant. Тогда, если x.shape = [N, R],

  • operator.matmul(x) имеет сложность O(L_matmul*N*R + K*N*R)

а если M = N,

  • operator.solve(x) имеет сложность O(L_matmul*N*R + N*K*R + K^2*R + K^3)
  • operator.determinant() имеет сложность O(L_determinant + L_solve*N*K + K^2*N + K^3)

Если вместо этого operator и x имеют форму [B1,...,Bb, M, N] и [B1,...,Bb, N, R], сложность каждой операции увеличивается на B1*...*Bb.

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

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

  • Если is_X == True, вызывающим сторонам следует ожидать, что оператор обладает свойством X. Это обещание должно выполняться, но оно не является проверкой во время выполнения. Например, конечная точность чисел с плавающей запятой может привести к нарушению этих обещаний.
  • Если is_X == False, вызывающим сторонам следует ожидать, что оператор не обладает свойством X.
  • Если is_X == None (значение по умолчанию), вызывающим сторонам не следует ожидать ни того, ни другого.
Аргументы
base_operator Форма [B1,...,Bb, M, N].
u Форма [B1,...,Bb, M, K] Tensor с тем же dtype, что и у base_operator. Это U выше.
diag_update Необязательная форма [B1,...,Bb, K] Tensor с тем же dtype, что и у base_operator. Это диагональ D выше. По умолчанию D является оператором тождества.
v Необязательный Tensor с тем же dtype, что и у u, и формы [B1,...,Bb, N, K]. По умолчанию v = u, и в этом случае возмущение симметрично. Если M != N, необходимо задать v, поскольку возмущение не является квадратным.
is_diag_update_positive Объект Python bool. Если True, ожидается diag_update > 0.
is_non_singular Ожидание, что этот оператор невырожден. По умолчанию None, если только is_positive_definite автоматически не установлено в True (см. ниже).
is_self_adjoint Ожидание, что этот оператор равен своему эрмитово-сопряжённому. По умолчанию None, если только base_operator не является самосопряжённым и v = None (то есть u=v); в этом случае по умолчанию используется True.
is_positive_definite Ожидание, что этот оператор положительно определён. По умолчанию None, если только base_operator не является положительно определённым v = None (то есть u=v) и is_diag_update_positive; в этом случае по умолчанию используется True. Обратите внимание: оператор считается положительно определённым, если квадратичная форма x^H A x имеет положительную действительную часть для всех ненулевых x.
is_square Ожидание, что этот оператор действует как квадратные матрицы [пакета].
name Имя для этого LinearOperator.
Вызывает исключения
ValueError Если флаги is_X заданы противоречиво.
Атрибуты
H Возвращает сопряжённый оператор текущего LinearOperator.

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

base_operator Если этот оператор является A = L + U D V^H, это L.
batch_shape TensorShape пакетных размерностей этого LinearOperator.

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

diag_operator Если этот оператор является A = L + U D V^H, это D.
diag_update Если этот оператор является A = L + U D V^H, это диагональ D.
domain_dimension Размерность области определения этого оператора (в смысле векторных пространств).

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

dtype DType Tensor, обрабатываемых этим LinearOperator.
graph_parents Список зависимостей графа этого LinearOperator. (устарело)
Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в одной из будущих версий. Инструкции по обновлению: не вызывайте graph_parents.
is_diag_update_positive Если этот оператор является A = L + U D V^H, это указывает на D > 0 поэлементно.
is_non_singular
is_positive_definite
is_self_adjoint
is_square Возвращает True/False в зависимости от того, является ли этот оператор квадратным.
parameters Словарь параметров, использованных для создания этого LinearOperator.
range_dimension Размерность образа этого оператора (в смысле векторных пространств).

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

shape TensorShape этого 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.

u Если этот оператор является A = L + U D V^H, это U.
v Если этот оператор является A = L + U D V^H, это V.

Методы

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'
)

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

Spec-Zone.ru

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