一、pythonsvd分析
pythonsvd是一个Python语言下的奇异值分解函数,它可以对任何形式的矩阵进行奇异值分解,是一种比较常用的线性代数分析方法。
二、pythonsvd函数
pythonsvd函数的语法格式为:
u,s,vT = pythonsvd(matrix, full_matrices=True, compute_uv=True)
其中,参数说明如下:- matrix:需要进行奇异值分解的矩阵
- full_matrices:是否需要返回完整的矩阵,默认为True返回完整的矩阵
- compute_uv:是否需要返回矩阵的左奇异向量、奇异值和右奇异向量,默认为True返回左奇异向量、奇异值和右奇异向量
函数返回值说明如下:
- u:矩阵的左奇异向量
- s:矩阵的奇异值
- vT:矩阵的右奇异向量的转置
三、pythonsvd分解
接下来我们通过一个示例来展示pythonsvd函数的奇异值分解的过程:
我们需要对矩阵A进行奇异值分解,A如下所示:
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
进行如下操作:from numpy import array
from scipy.linalg import svd
A = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
u, s, vT = svd(A)
print(u)
print(s)
print(vT)
那么我们将得到以下的结果:[[ 0.14000523 -0.78914051 0.58119845 -0.16979796]
[ 0.34335014 -0.40824829 -0.24593576 -0.82856902]
[ 0.54669505 -0.02735608 -0.72066997 0.42026686]
[ 0.75003995 0.35353612 0.29740728 0.52109912]]
[2.54647909e+01 1.33512730e+00 2.26165978e-15]
[[-0.4796712 -0.57236779 -0.66506438]
[-0.77669099 -0.07568654 0.62531791]
[-0.40824829 0.81514672 -0.40824829]]
其中,- u是矩阵的左奇异向量
- s是矩阵的奇异值
- vT是矩阵的右奇异向量的转置
四、pythonsvd分解代码
接下来我们将给出使用pythonsvd函数进行奇异值分解的代码:
from numpy import array
from scipy.linalg import svd
from pythonsvd import pythonsvd
A = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
u, s, vT = pythonsvd(A, full_matrices=True, compute_uv=True)
print(u)
print(s)
print(vT)
五、pythonsvd分解代码不用svd函数
下面是一段示例代码,展示了如何不使用scipy库的svd函数进行奇异值分解:
from numpy import dot, transpose
from numpy.linalg import eig
from pythonsvd import pythonsvd
A = array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
AA_T = dot(A, transpose(A))
eigval, eigvec = eig(AA_T)
eigval_sorted_idx = eigval.argsort()[::-1]
eigval_sorted = eigval[eigval_sorted_idx]
U = []
for idx in eigval_sorted_idx:
U.append(eigvec[:, idx])
U = array(U).T
V = dot(transpose(U), A)
s = sorted([abs(x) for x in eigval], reverse=True)
print(U)
print(s)
print(V)
该段代码与使用scipy库的svd函数进行奇异值分解的结果是一样的。