dislib.math¶
- dislib.kron(a, b, block_size=None)[source]¶
Kronecker product of two ds-arrays.
- Parameters
a, b (ds-arrays) – Input ds-arrays.
block_size (tuple of two ints, optional) – Block size of the resulting array. Defaults to the block size of b.
- Returns
out
- Return type
ds-array
- Raises
NotImplementedError – If a or b are sparse.
- dislib.svd(a, compute_uv=True, sort=True, copy=True, eps=1e-09)[source]¶
Performs singular value decomposition of a ds-array via the one-sided block Jacobi algorithm described in Arbenz and Slapnicar 1 and Dongarra et al. 2.
Singular value decomposition is a factorization of the form A = USV’, where U and V are unitary matrices and S is a rectangular diagonal matrix.
- Parameters
a (ds-array, shape=(m, n)) – Input matrix (m >= n). Needs to be partitioned in two column blocks at least due to the design of the block Jacobi algorithm.
compute_uv (boolean, optional (default=True)) – Whether or not to compute u and v in addition to s.
sort (boolean, optional (default=True)) – Whether to return sorted u, s and v. Sorting requires a significant amount of additional computation.
copy (boolean, optional (default=True)) – Whether to create a copy of a or to apply transformations on a directly. Only valid if a is regular (i.e., top left block is of regular shape).
eps (float, optional (default=1e-9)) – Tolerance for the convergence criterion.
- Returns
u (ds-array, shape=(m, n)) – U matrix. Only returned if compute_uv is True.
s (ds-array, shape=(1, n)) – Diagonal entries of S.
v (ds-array, shape=(n, n)) – V matrix. Only returned if compute_uv is True.
- Raises
ValueError – If a has less than 2 column blocks or m < n.
References
- 1
Arbenz, P. and Slapnicar, A. (1995). An Analysis of Parallel Implementations of the Block-Jacobi Algorithm for Computing the SVD. In Proceedings of the 17th International Conference on Information Technology Interfaces ITI (pp. 13-16).
- 2
Dongarra, J., Gates, M., Haidar, A. et al. (2018). The singular value decomposition: Anatomy of optimizing an algorithm for extreme scale. In SIAM review, 60(4) (pp. 808-865).
Examples
>>> import dislib as ds >>> import numpy as np >>> >>> >>> if __name__ == '__main__': >>> x = ds.random_array((10, 6), (2, 2), random_state=7) >>> u, s, v = ds.svd(x) >>> u = u.collect() >>> s = np.diag(s.collect()) >>> v = v.collect() >>> print(np.allclose(x.collect(), u @ s @ v.T))