多元函数的梯度:
多元函数对各个自变量偏导数形成的向量叫做多元函数的梯度。
写成修饰器时这样的
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)
雅可比矩阵
如果有一个多元函数,它输入的每个参数对应着某一n维向量的每一维度,并且这个n元函数的输出为m维向量,那么,输出向量的每个分量对输入向量的每个分量的偏导数构成一个m行n列的矩阵,这个m行n列的矩阵叫做这个函数的雅可比矩阵。
计算举例
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元函数的二阶偏导数有n^2个,如果把它们依次排开,能够得到一个对称矩阵,这个矩阵就叫做这个函数的Hessian矩阵。
矩阵主对角线上的n个元素是对同一个自变量求二阶偏导数。
例如,求下面这个的Hessian矩阵
f = x**2+2*x*y+4*y**2+6*y*z+4*z**2
hessian(f,(x,y,z))
二次型
二次型是只由二次项构成的二次函数,例如下面的三元二次函数:
写成矩阵的形式为
这个矩阵形式也叫二次型,其中,
等于这个二次型的Hessian矩阵的一半。
矩阵的各种“定”
矩阵正定
用任意一个非零的n维行向量,乘以一个n阶方阵,再乘以这个n维行向量的转置,得到一个只有一个元素的矩阵,这个元素都大于0,则这个n阶方阵是一个正定矩阵。
判定矩阵正定的常用方法:
- 矩阵的特征值全大于0
- 矩阵的顺序主子式都大于0(n阶方阵的前i行和前i列构成的矩阵的行列式,叫做这个方阵的i阶顺序主子式,n阶方阵总共有n个顺序主子式)
- 矩阵合同于与之同阶的单位矩阵(如果存在一个可逆矩阵C,使得C的转置乘以n阶方阵A,再乘以C的结果等于n阶方阵B,则矩阵A合同与矩阵B)
矩阵负定
用任意一个非零的n维行向量,乘以一个n阶方阵,再乘以这个n维行向量的转置,得到一个只有一个元素的矩阵,这个元素都小于0,则这个n阶方阵是一个负定矩阵。
矩阵半定
用任意一个非零的n维行向量,乘以一个n阶方阵,再乘以这个n维行向量的转置,得到一个只有一个元素的矩阵,这个元素都大于或小于0,则这个n阶方阵是一个半定矩阵。
矩阵半正定
用任意一个非零的n维行向量,乘以一个n阶方阵,再乘以这个n维行向量的转置,得到一个只有一个元素的矩阵,这个元素都大于或等于0,则这个n阶方阵是一个半正定矩阵。
矩阵半负定
用任意一个非零的n维行向量,乘以一个n阶方阵,再乘以这个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代码,输入的必须是方阵,函数没有做输入检查,请注意。
推论——针对多元函数
如果一个多元函数的Hessian矩阵半正定,则此函数为凸函数;如果一个多元函数的Hessian矩阵正定,则此函数为严格凸函数。