numpy linalg模块的具体使用方法
最近在看机器学习的 LogisticRegressor,BayesianLogisticRegressor算法,里面得到一阶导数矩阵g和二阶导数Hessian矩阵H的时候,用到了这个模块进行求解运算,记录一下。
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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。