怎么在numpy中使用linalg模块
作者
这期内容当中小编将会给大家带来有关怎么在numpy中使用linalg模块,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
importnumpyasnp
#1.计算逆矩阵 #创建矩阵 A=np.mat("012;103;4-38") print(A) #[[012] #[103] #[4-38]]
#使用inv函数计算逆矩阵 inv=np.linalg.inv(A) print(inv) #[[-4.57.-1.5] #[-2.4.-1.] #[1.5-2.0.5]]
#检查原矩阵和求得的逆矩阵相乘的结果为单位矩阵 print(A*inv) #[[1.0.0.] #[0.1.0.] #[0.0.1.]]
注:矩阵必须是方阵且可逆,否则会抛出LinAlgError异常。
#2.求解线性方程组 #numpy.linalg中的函数solve可以求解形如Ax=b的线性方程组,其中A为矩阵,b为一维或二维的数组,x是未知变量 #创建矩阵和数组 B=np.mat("1-21;02-8;-459") b=np.array([0,8,-9]) #调用solve函数求解线性方程 x=np.linalg.solve(B,b) print(x) #[29.16.3.] #使用dot函数检查求得的解是否正确 print(np.dot(B,x)) #[[0.8.-9.]]
#3.特征值和特征向量 #特征值(eigenvalue)即方程Ax=ax的根,是一个标量。 #其中,A是一个二维矩阵,x是一个一维向量。特征向量(eigenvector)是关于特征值的向量 #numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组 #创建一个矩阵 C=np.mat("3-2;10") #调用eigvals函数求解特征值 c0=np.linalg.eigvals(C) print(c0) #[2.1.] #使用eig函数求解特征值和特征向量 #(该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量) c1,c2=np.linalg.eig(C) print(c1) #[2.1.] print(c2) #[[0.894427190.70710678] #[0.44721360.70710678]] #使用dot函数验证求得的解是否正确 foriinrange(len(c1)): print("left:",np.dot(C,c2[:,i])) print("right:",c1[i]*c2[:,i]) #left:[[1.78885438] #[0.89442719]] #right:[[1.78885438] #[0.89442719]] #left:[[0.70710678] #[0.70710678]] #right:[[0.70710678] #[0.70710678]]
#4.奇异值分解 #SVD(SingularValueDecomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积 #numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。 importnumpyasnp #分解矩阵 D=np.mat("41114;87-2") #使用svd函数分解矩阵 U,Sigma,V=np.linalg.svd(D,full_matrices=False) print("U:",U) #U:[[-0.9486833-0.31622777] #[-0.316227770.9486833]] print("Sigma:",Sigma) #Sigma:[18.973665969.48683298] print("V",V) #V[[-0.33333333-0.66666667-0.66666667] #[0.666666670.33333333-0.66666667]] #结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma #使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘 print(U*np.diag(Sigma)*V) #[[4.11.14.] #[8.7.-2.]]
#5.广义逆矩阵 #使用numpy.linalg模块中的pinv函数进行求解, #注:inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制 importnumpyasnp #创建一个矩阵 E=np.mat("41114;87-2") #使用pinv函数计算广义逆矩阵 pseudoinv=np.linalg.pinv(E) print(pseudoinv) #[[-0.005555560.07222222] #[0.022222220.04444444] #[0.05555556-0.05555556]] #将原矩阵和得到的广义逆矩阵相乘 print(E*pseudoinv) #[[1.00000000e+00-5.55111512e-16] #[0.00000000e+001.00000000e+00]]
#6.行列式 #numpy.linalg模块中的det函数可以计算矩阵的行列式 importnumpyasnp #计算矩阵的行列式 F=np.mat("34;56") #使用det函数计算行列式 print(np.linalg.det(F)) #-2.0
学完这些之后,再用其中的numpy.linalg.solve()函数对(H,g)线性方程组进行求解。
def_fit(self,X,t,max_iter=100):#输入样本,0,1标签,最大迭代步数 self._check_binary(t) w=np.zeros(np.size(X,1))#初始化权重矩阵X行 for_inrange(max_iter): w_prev=np.copy(w)#保存原先的权重信息用来更新权重 y=self._sigmoid(X@w)#sigmoid特征向量@权重矩阵输出y grad=X.T@(y-t)#一阶导数 hessian=(X.T*y*(1-y))@X#二阶导数Hessian矩阵 try: w-=np.linalg.solve(hessian,grad) print(w) exceptnp.linalg.LinAlgError: break ifnp.allclose(w,w_prev):#收敛到一定的精度 break self.w=w #[-0.179247721.029820330.54459921] #[-0.259945861.768923410.90294418] #[-0.351806642.603460271.25122256] #[-0.4685093.543099291.60131553] #[-0.585915284.437875421.93496706] #[-0.658961594.978390952.14764763] #[-0.676597255.106154572.20048333] #[-0.677361915.111592742.20281247] #[-0.677363255.111602142.20281657]
PS:更多示例
#线性代数 #numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。 importnumpyasnp #1.计算逆矩阵 #创建矩阵 A=np.mat("012;103;4-38") print(A) #[[012] #[103] #[4-38]] #使用inv函数计算逆矩阵 inv=np.linalg.inv(A) print(inv) #[[-4.57.-1.5] #[-2.4.-1.] #[1.5-2.0.5]] #检查原矩阵和求得的逆矩阵相乘的结果为单位矩阵 print(A*inv) #[[1.0.0.] #[0.1.0.] #[0.0.1.]] #注:矩阵必须是方阵且可逆,否则会抛出LinAlgError异常。 #2.求解线性方程组 #numpy.linalg中的函数solve可以求解形如Ax=b的线性方程组,其中A为矩阵,b为一维或二维的数组,x是未知变量 importnumpyasnp #创建矩阵和数组 B=np.mat("1-21;02-8;-459") b=np.array([0,8,-9]) #调用solve函数求解线性方程 x=np.linalg.solve(B,b) print(x) #[29.16.3.] #使用dot函数检查求得的解是否正确 print(np.dot(B,x)) #[[0.8.-9.]] #3.特征值和特征向量 #特征值(eigenvalue)即方程Ax=ax的根,是一个标量。其中,A是一个二维矩阵,x是一个一维向量。特征向量(eigenvector)是关于特征值的向量 #numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组 importnumpyasnp #创建一个矩阵 C=np.mat("3-2;10") #调用eigvals函数求解特征值 c0=np.linalg.eigvals(C) print(c0) #[2.1.] #使用eig函数求解特征值和特征向量(该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量) c1,c2=np.linalg.eig(C) print(c1) #[2.1.] print(c2) #[[0.894427190.70710678] #[0.44721360.70710678]] #使用dot函数验证求得的解是否正确 foriinrange(len(c1)): print("left:",np.dot(C,c2[:,i])) print("right:",c1[i]*c2[:,i]) #left:[[1.78885438] #[0.89442719]] #right:[[1.78885438] #[0.89442719]] #left:[[0.70710678] #[0.70710678]] #right:[[0.70710678] #[0.70710678]] #4.奇异值分解 #SVD(SingularValueDecomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积 #numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。 importnumpyasnp #分解矩阵 D=np.mat("41114;87-2") #使用svd函数分解矩阵 U,Sigma,V=np.linalg.svd(D,full_matrices=False) print("U:",U) #U:[[-0.9486833-0.31622777] #[-0.316227770.9486833]] print("Sigma:",Sigma) #Sigma:[18.973665969.48683298] print("V",V) #V[[-0.33333333-0.66666667-0.66666667] #[0.666666670.33333333-0.66666667]] #结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma #使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘 print(U*np.diag(Sigma)*V) #[[4.11.14.] #[8.7.-2.]] #5.广义逆矩阵 #使用numpy.linalg模块中的pinv函数进行求解, #注:inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制 importnumpyasnp #创建一个矩阵 E=np.mat("41114;87-2") #使用pinv函数计算广义逆矩阵 pseudoinv=np.linalg.pinv(E) print(pseudoinv) #[[-0.005555560.07222222] #[0.022222220.04444444] #[0.05555556-0.05555556]] #将原矩阵和得到的广义逆矩阵相乘 print(E*pseudoinv) #[[1.00000000e+00-5.55111512e-16] #[0.00000000e+001.00000000e+00]] #6.行列式 #numpy.linalg模块中的det函数可以计算矩阵的行列式 importnumpyasnp #计算矩阵的行列式 F=np.mat("34;56") #使用det函数计算行列式 print(np.linalg.det(F)) #-2.0
上述就是小编为大家分享的怎么在numpy中使用linalg模块了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
目录
推荐阅读
-
怎么使用numpy中的norm()函数求范数
-
Python如何使用Numpy库
-
使用numpy对数组求平均时怎么忽略nan值
-
numpy中np.nanmax和np.max的区别及坑是什么
-
python numpy中怎么对ndarry按照index增删改查
python numpy中怎么对ndarry按照index增删改查...
-
NumPy下的索引与切片的用法
-
numpy如何实现神经网络反向传播算法
-
Python3.7.1中无法导入Numpy如何解决
-
numpy 中dot()函数的计算方式有哪些
-
怎么在numpy库中使用concatenate函数拼接数组
这篇文章给大家介绍怎么在numpy库中使用concatenate函数拼接数组,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大...
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~