一、几个梯度的栗子
1.1 迹函数相对于矩阵的梯度
迹函数对矩阵求导:
1.2 行列式相对于矩阵的梯度
矩阵的行列式对矩阵求导:
二、实值函数相对于实向量的梯度
2.1 实值标量函数对向量的梯度
其实就是标量函数对向量的求导,在之前我们用过定义法求导:
寻找较复杂的实值函数求导更方便的方法,不是每次都先针对任意一个分量,再进行排列。
标量对向量求导的基本法则(PS:和我们以前标量对标量求导的法则类似):
常量对向量的求导结果为0
线性法则:如果f ff、g gg都是实值函数,c 1 c1c1、c 2 c2c2为常数,则:
以列向量为自变量的标量函数,其对于自变量的梯度仍然为一阶数相同的列向量
梯度的每个分量代表着函数在该分量方向上的变化率。
2.2 实值向量函数对向量的梯度
即向量对向量求导。
(1)先回顾之前的定义法:
y = A x \mathbf{y} = \mathbf{A} \mathbf{x}y=Ax是向量。
A \mathbf{A}A为n×m矩阵
x \mathbf{x}x为m维向量;y \mathbf{y}y为n维向量
先分别求【矩阵的第 i ii 行和向量的内积】对向量的第 j jj 分量求导,定义法:
- 向量函数对于向量的求导,相当于向量函数中的每一个分量函数对向量求导。
- 行向量函数对列向量自变量求导形成矩阵;
- 列向量函数对行向量自变量求导也可以形成矩阵。
2.3 简单练习
三、矩阵向量化vec
3.1 向量化定义
四、Python实现Kronecker积等
可以参考numpy的官方文档。
from numpy import dot,cross,kron # cross ref:https://docs.scipy.org/doc/numpy/reference/generated/numpy.cross.html#numpy.cross # dot,kron ref:https://docs.scipy.org/doc/numpy/reference/routines.linalg.html from scipy.linalg import hadamard # hadamard ref:https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.hadamard.html#scipy.linalg.hadamard
这里举个求Kronecker积和向量的外积的栗子:
import numpy as np a = np.array([[1], [2]]) b = np.array([[3], [4]]) kron1 = np.kron(a, b) outer = np.outer(a, b) kron2 = np.kron(a, b.T)
结果如下,可以发现Kronecker积结果是,a的1乘b向量,a的2乘b向量,然后两个向量拼接起来。并且如果a向量和b向量的转置进行Kronecker积,其结果和a和b做向量外积outer结果相同。
复习:K=kron(A,B),获得 A 和 B 的 Kronecker 张量积。如果 A 是 m×n 矩阵,而 B 是 p×q 矩阵,则 kron(A,B) 是通过获取 A 元素与矩阵 B 元素之间的所有可能积而形成的一个 mp×nq 矩阵。
【外积】即两个向量的向量积,即两个向量的组成的平面的法向量。
符号表示:a× b
向量积的大小:|a|·|b|·sin<a,b>.
栗子:(x1,y1,z1)×(x2,y2,z2)=(y1z2-y2z1,z1x2-z2x1,x1y2-x2y1)