多元函數(shù)的梯度:
多元函數(shù)對各個自變量偏導(dǎo)數(shù)形成的向量叫做多元函數(shù)的梯度。
寫成修飾器時這樣的
def grad(func):
def f(*args):
return Matrix([diff(func(*args),i,1) for i in args]).T
return f
計算舉例:
@grad
def gf(x,y):
return x**2+x*y+y**2
gf(x,y)
雅可比矩陣
如果有一個多元函數(shù),它輸入的每個參數(shù)對應(yīng)著某一n維向量的每一維度,并且這個n元函數(shù)的輸出為m維向量,那么,輸出向量的每個分量對輸入向量的每個分量的偏導(dǎo)數(shù)構(gòu)成一個m行n列的矩陣,這個m行n列的矩陣叫做這個函數(shù)的雅可比矩陣。
計算舉例
u=x**2+2*x*y+z
v=x-y**2+z**2
X = Matrix([u, v])
Y = Matrix([x, y, z])
X.jacobian(Y)
Hessian矩陣
n元函數(shù)的二階偏導(dǎo)數(shù)有n^2個,如果把它們依次排開,能夠得到一個對稱矩陣,這個矩陣就叫做這個函數(shù)的Hessian矩陣。
矩陣主對角線上的n個元素是對同一個自變量求二階偏導(dǎo)數(shù)。
例如,求下面這個的Hessian矩陣
f = x**2+2*x*y+4*y**2+6*y*z+4*z**2
hessian(f,(x,y,z))
二次型
二次型是只由二次項構(gòu)成的二次函數(shù),例如下面的三元二次函數(shù):
寫成矩陣的形式為
這個矩陣形式也叫二次型,其中,
等于這個二次型的Hessian矩陣的一半。
矩陣的各種“定”
矩陣正定
用任意一個非零的n維行向量,乘以一個n階方陣,再乘以這個n維行向量的轉(zhuǎn)置,得到一個只有一個元素的矩陣,這個元素都大于0,則這個n階方陣是一個正定矩陣。
判定矩陣正定的常用方法:
- 矩陣的特征值全大于0
- 矩陣的順序主子式都大于0(n階方陣的前i行和前i列構(gòu)成的矩陣的行列式,叫做這個方陣的i階順序主子式,n階方陣總共有n個順序主子式)
- 矩陣合同于與之同階的單位矩陣(如果存在一個可逆矩陣C,使得C的轉(zhuǎn)置乘以n階方陣A,再乘以C的結(jié)果等于n階方陣B,則矩陣A合同與矩陣B)
矩陣負定
用任意一個非零的n維行向量,乘以一個n階方陣,再乘以這個n維行向量的轉(zhuǎn)置,得到一個只有一個元素的矩陣,這個元素都小于0,則這個n階方陣是一個負定矩陣。
矩陣半定
用任意一個非零的n維行向量,乘以一個n階方陣,再乘以這個n維行向量的轉(zhuǎn)置,得到一個只有一個元素的矩陣,這個元素都大于或小于0,則這個n階方陣是一個半定矩陣。
矩陣半正定
用任意一個非零的n維行向量,乘以一個n階方陣,再乘以這個n維行向量的轉(zhuǎn)置,得到一個只有一個元素的矩陣,這個元素都大于或等于0,則這個n階方陣是一個半正定矩陣。
矩陣半負定
用任意一個非零的n維行向量,乘以一個n階方陣,再乘以這個n維行向量的轉(zhuǎn)置,得到一個只有一個元素的矩陣,這個元素都小于或等于0,則這個n階方陣是一個半負定矩陣。
矩陣不定
除了上述五種定的情形外的矩陣不定。
from sympy import *
from sympy.matrices import Matrix
def classify_matrix(matrix):
eigenvalues = matrix.eigenvals()
positive = 0
negative = 0
zero = 0
for eigenvalue in eigenvalues.values():
if eigenvalue > 0:
positive += 1
elif eigenvalue < 0:
negative += 1
else:
zero += 1
if positive == matrix.shape[0]:
return "正定"
elif negative == matrix.shape[0]:
return "負定"
elif zero > 0:
return "不定"
elif positive > 0 and negative > 0:
return "半定"
elif positive > 0 and negative == 0:
return "半正定"
elif positive == 0 and negative > 0:
return "半負定"
matrix = Matrix([[1, -2, -3], [-2, -5, -3], [-3, -3, -6]])
print(classify_matrix(matrix))
這是用來判斷矩陣如何定的python代碼,輸入的必須是方陣,函數(shù)沒有做輸入檢查,請注意。
推論——針對多元函數(shù)
如果一個多元函數(shù)的Hessian矩陣半正定,則此函數(shù)為凸函數(shù);如果一個多元函數(shù)的Hessian矩陣正定,則此函數(shù)為嚴格凸函數(shù)。