怎么在numpy中使用linalg模块

这期内容当中小编将会给大家带来有关怎么在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模块了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-03-17 20:56:05
收藏
分享
海报
0 条评论
170
上一篇:如何正确的使用numpy.random模块 下一篇:怎么在Node.js中使用readline模块
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码