Spec-Zone.ru › TensorFlow

tf.linalg.LinearOperatorCirculant2D

LinearOperator, действующий как блочно-циркулянтная матрица.

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

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

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

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

tf.compat.v1.linalg.LinearOperatorCirculant2D

tf.linalg.LinearOperatorCirculant2D(
    spectrum: tf.Tensor,
    input_output_dtype=tf.dtypes.complex64,
    is_non_singular: bool = None,
    is_self_adjoint: bool = None,
    is_positive_definite: bool = None,
    is_square: bool = True,
    name='LinearOperatorCirculant2D'
)

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

Описание в терминах блочно-циркулянтных матриц

Если A является блочно-циркулянтной матрицей с размерами блоков N0, N1 (N0 * N1 = N): A имеет блочно-циркулянтную структуру, составленную из N0 x N0 блоков, каждый из которых является циркулянтной матрицей N1 x N1.

Например, при W, X, Y, Z, каждое из которых является циркулянтной матрицей,

A = |W Z Y X|
    |X W Z Y|
    |Y X W Z|
    |Z Y X W|

Обратите внимание, что A в общем случае сама не будет циркулянтной.

Описание в терминах частотного спектра

Существует эквивалентное описание через спектр [пакета] H и преобразования Фурье. Здесь мы рассматриваем A.shape = [N, N] и не учитываем размерности пакета.

Если H.shape = [N0, N1], (N0 * N1 = N): в общих чертах умножение матриц эквивалентно действию фурье-множителя: A u = IDFT2[ H DFT2[u] ]. Точнее, для заданной матрицы [N, R] u пусть DFT2[u] будет [N0, N1, R] Tensor, полученной изменением формы u на [N0, N1, R] и применением двумерного ДПФ по первым двум размерностям. Пусть IDFT2 будет обратным к DFT2. Умножение матриц можно выразить по столбцам:

(A u)_r = IDFT2[ H * (DFT2[u])_r ]

Свойства оператора, выведенные из спектра.

  • Этот оператор является положительно определённым тогда и только тогда, когда Real{H} > 0.

Общее свойство преобразований Фурье — соответствие между эрмитовыми функциями и вещественными преобразованиями.

Предположим, что H.shape = [B1,...,Bb, N0, N1]; будем говорить, что H имеет эрмитов спектр, если при %, обозначающем деление по модулю,

H[..., n0 % N0, n1 % N1] = ComplexConjugate[ H[..., (-n0) % N0, (-n1) % N1 ].
  • Этот оператор соответствует вещественной матрице тогда и только тогда, когда H является эрмитовым.
  • Этот оператор является самосопряжённым тогда и только тогда, когда H вещественно.

См., например, «Discrete-Time Signal Processing» Оппенгейма и Шафера.

Пример самосопряжённого положительно определённого оператора

# spectrum is real ==> operator is self-adjoint
# spectrum is positive ==> operator is positive definite
spectrum = [[1., 2., 3.],
            [4., 5., 6.],
            [7., 8., 9.]]

operator = LinearOperatorCirculant2D(spectrum)

# IFFT[spectrum]
operator.convolution_kernel()
==> [[5.0+0.0j, -0.5-.3j, -0.5+.3j],
     [-1.5-.9j,        0,        0],
     [-1.5+.9j,        0,        0]]

operator.to_dense()
==> Complex self adjoint 9 x 9 matrix.

Пример определения через вещественное ядро свёртки,

# convolution_kernel is real ==> spectrum is Hermitian.
convolution_kernel = [[1., 2., 1.], [5., -1., 1.]]
spectrum = tf.signal.fft2d(tf.cast(convolution_kernel, tf.complex64))

# spectrum is shape [2, 3] ==> operator is shape [6, 6]
# spectrum is Hermitian ==> operator is real.
operator = LinearOperatorCirculant2D(spectrum, input_output_dtype=tf.float32)

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

Предположим, что operator — это LinearOperatorCirculant формы [N, N], а x.shape = [N, R]. Тогда

  • operator.matmul(x) имеет сложность O(R*N*Log[N])
  • operator.solve(x) имеет сложность O(R*N*Log[N])
  • operator.determinant() требует выполнения reduce_prod размера N.

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

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

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

  • Если is_X == True, вызывающие код должен исходить из того, что оператор обладает свойством X. Это обещание, которое должно выполняться, но оно не является проверкой во время выполнения. Например, конечная точность чисел с плавающей запятой может привести к нарушению этих обещаний.
  • Если is_X == False, вызывающий код должен исходить из того, что оператор не обладает свойством X.
  • Если is_X == None (значение по умолчанию), вызывающий код не должен рассчитывать ни на один из вариантов.
Аргументы
spectrum Форма [B1,...,Bb, N0, N1] Tensor. Допустимые типы данных: float16, float32, float64, complex64, complex128. Тип может отличаться от input_output_dtype
input_output_dtype dtype для входных и выходных данных.
is_non_singular Предполагается, что этот оператор невырожденный.
is_self_adjoint Предполагается, что этот оператор равен своему эрмитово-сопряжённому. Если spectrum является вещественным, это условие всегда выполняется.
is_positive_definite Предполагается, что этот оператор положительно определён, то есть квадратичная форма x^H A x имеет положительную вещественную часть для всех ненулевых x. Обратите внимание, что для положительной определённости оператору не обязательно быть самосопряжённым. См.: https://en.wikipedia.org/wiki/Positive-definite_matrix
#Extension_for_non_symmetric_matrices
is_square Предполагается, что этот оператор действует как квадратные матрицы [пакета].
name Имя, добавляемое в начало имён всех операций, создаваемых этим классом.
Атрибуты
H Возвращает сопряжённый оператор текущего LinearOperator.

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

batch_shape TensorShape размерностей пакета этого LinearOperator.

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

block_depth Глубина рекурсивно определённых циркулянтных блоков, задающих этот Operator.

Пусть A — плотное представление этого Operator,

block_depth = 1 означает, что A является симметричной циркулянтной матрицей. Например,

A = |w z y x|
    |x w z y|
    |y x w z|
    |z y x w|

block_depth = 2 означает, что A является блочно-симметричной циркулянтной матрицей с симметричными циркулянтными блоками. Например, при W, X, Y, Z, являющихся симметричными циркулянтными матрицами,

A = |W Z Y X|
    |X W Z Y|
    |Y X W Z|
    |Z Y X W|

block_depth = 3 означает, что A является блочно-симметричной циркулянтной матрицей с блочно-симметричными циркулянтными блоками.

block_shape
domain_dimension Размерность (в смысле векторных пространств) области определения этого оператора.

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

dtype DType Tensor, обрабатываемых этим LinearOperator.
graph_parents Список зависимостей графа для этого LinearOperator. (устарело)
Устарело: ЭТА ФУНКЦИЯ УСТАРЕЛА. Она будет удалена в будущей версии. Инструкции по обновлению: не вызывайте graph_parents.
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.

spectrum
tensor_rank Ранг (в смысле тензоров) матрицы, соответствующей этому оператору.

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

Методы

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_hermitian_spectrum

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

assert_hermitian_spectrum(
    name='assert_hermitian_spectrum'
)

Возвращает Op, проверяющий, что спектр этого оператора является эрмитовым.

Этот оператор соответствует матрице с вещественными значениями тогда и только тогда, когда его спектр является эрмитовым.

Аргументы
name Имя для этого Op.
Возвращает
Op, проверяющий, что спектр этого оператора является эрмитовым.

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

block_shape_tensor

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

block_shape_tensor()

Форма размерностей блоков self.spectrum.

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.

convolution_kernel

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

convolution_kernel(
    name='convolution_kernel'
)

Ядро свёртки, соответствующее self.spectrum.

D-мерное ДПФ этого ядра является спектром данного оператора в частотной области.

Аргументы
name Имя для этого Op.
Возвращает
Tensor с dtype self.dtype.

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, что и у самого объекта.

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/LinearOperatorCirculant2D

Spec-Zone.ru

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