高速化したいならLapackとかPythonから使うことないと思うので、そういう科学技術計算をcudaとかCとかC++でやる人の答え合わせ程度に使っていただけると
と思ってメモ
#ソースコード
low_rank_approximation.py
import numpy as np
from scipy import linalg
def low_rank_approximation(a,rank):
u, s, v = linalg.svd(a)
ur = u[:, :rank]
sr = np.matrix(linalg.diagsvd(s[:rank], rank,rank))
vr = v[:rank, :]
return np.asarray(ur*sr*vr)
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
print A
B = low_rank_approximation(A,1)
print B
# python low_rank_approximation.py
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [[ 1.73621779 2.07174246 2.40726714]
# [ 4.2071528 5.02018649 5.83322018]
# [ 6.6780878 7.96863051 9.25917322]]
#参考