es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python acelera la descomposición de valores singulares.

Quiero calcular la descomposición en valores singulares de cada rebanada de una matriz tridimensional.

Utilicé numpy y scipy para calcular la descomposición SVD, pero ambos son significativamente más lentos que la implementación de MATLAB. Mientras que las versiones de numpy y scipy tardan alrededor de 7 s, la versión de MATLAB solo tarda 0.7 s.

¿Hay alguna forma de acelerar el cálculo de SVD en Python?

Python

import time
import scipy.linalg
import numpy.linalg

A = np.random.rand(100, 100, 1000) + 1j * np.random.rand(100, 100, 1000)
S = np.empty((A.shape[2], min(A.shape[0:1])))

t1 = time.time()
for i in range(A.shape[2]):
    S[i, :] = numpy.linalg.svd(A[:, :, i], compute_uv=False)
print("[numpy] Tiempo transcurrido: {:.3f} s".format(time.time() - t1))

t1 = time.time()
for i in range(A.shape[2]):
    S[i, :] = scipy.linalg.svdvals(A[:, :, i])
print("[scipy] Tiempo transcurrido: {:.3f} s".format(time.time() - t1))

[numpy] Tiempo transcurrido: 7.137 s

[scipy] Tiempo transcurrido: 7.435 s

MATLAB
MATLAB
A = randn(100, 100, 1000) + 1j * randn(100, 100, 1000);
S = nan(size(A,3), min(size(A, [1 2])));
tic;
for i = 1:size(A, 3)
S(i, :) = svd(A(:,:,i));
end
toc;
% Elapsed time is 0.702556 seconds.

Este es el resultado de np.show_config():

blas_mkl_info:
NO DISPONIBLE
blis_info:
NO DISPONIBLE
openblas_info:
library_dirs = ['D:\a\1\s\numpy\build\openblas_info']
libraries = ['openblas_info']
language = f77
define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
library_dirs = ['D:\a\1\s\numpy\build\openblas_info']
libraries = ['openblas_info']
language = f77
define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
NO DISPONIBLE
openblas_lapack_info:
library_dirs = ['D:\a\1\s\numpy\build\openblas_lapack_info']
libraries = ['openblas_lapack_info']
language = f77
define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
library_dirs = ['D:\a\1\s\numpy\build\openblas_lapack_info']
libraries = ['openblas_lapack_info']
language = f77
define_macros = [('HAVE_CBLAS', None)]
Extensiones SIMD compatibles en esta instalación de NumPy:
baseline = SSE,SSE2,SSE3
encontradas = SSSE3,SSE41,POPCNT,SSE42,AVX,F16C,FMA3,AVX2,AVX512F,AVX512CD,AVX512_SKX
no encontradas = AVX512_CLX,AVX512_CNL
None

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una posible solución para acelerar el cálculo de la descomposición en valores singulares (SVD) en Python es utilizar una biblioteca de álgebra lineal diferente que esté mejor optimizada para el hardware dado. Por ejemplo, instalar la Biblioteca del Núcleo Matemático Intel (MKL) y vincularla con numpy y scipy puede mejorar el rendimiento. Alternativamente, el uso de una implementación diferente de SVD, como SVD aleatorizada o SVD incremental, también puede resultar en tiempos de cálculo más rápidos. Sin embargo, vale la pena señalar que en muchos casos, las implementaciones incorporadas de MATLAB están altamente optimizadas y pueden superar a las implementaciones de Python.

Comments are closed.