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