【机器学习中的矩阵求导】(九)矩阵论大复习

简介: kron(A,B) 是通过获取 A 元素与矩阵 B 元素之间的所有可能积而形成的一个 mp×nq 矩阵。先来看一个Python实现Kronecker积等。可以参考numpy的官方文档。

一、矩阵代数基础

1.1 矩阵的迹

image.png

1.2 Kronecker积

kron(A,B) 是通过获取 A 元素与矩阵 B 元素之间的所有可能积而形成的一个 mp×nq 矩阵

先来看一个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 矩阵。

image.png

【外积】即两个向量的向量积,即两个向量的组成的平面的法向量。

符号表示:a× b

向量积的大小:|a|·|b|·sin<a,b>.

栗子:(x1,y1,z1)×(x2,y2,z2)=(y1z2-y2z1,z1x2-z2x1,x1y2-x2y1)


image.png

(1)Kronecker的数学定义

image.png

【证明过程】

image.png

image.png

image.png

1.3 向量化算子的性质

(1)矩阵乘积的迹(前两个需要会证明):

第一个(要记住也要会证明):

image.png

image.png

(2)两个向量的Kronecker积可以表示成向量外积的向量化(显然成立,下面的a、

b为2个列向量):


image.png

image.png

二、Jacobian矩阵(雅克比矩阵)

变量符号定义:

image.png

2.1 Jacobian矩阵

梯度向量是雅克比矩阵的特例!


image.png

2)矩阵函数的梯度和Jacobian矩阵

image.png

image.png

.2 梯度矩阵

列向量偏导算子:采用列向量形式定义的偏导算子,又称为梯度算子。

image.png

image.pngimage.png

2.3 一阶实矩阵微分与Jacobian矩阵辨识

矩阵微分是计算标量、向量或者矩阵函数,关于其向量或矩阵变元的偏导,的有效数学工具。

P155

image.png

image.png

image.png

image.png

转置后, 又可得到矩阵函数的梯度矩阵。

image.png

特别注意,上面最后的 K m n \boldsymbol{K}_{m n}K

mn

, 定义如下(和我们上面介绍交换矩阵的写法“相反”):

image.png

三、奇异值分解SVD

image.png

3.0 SVD证明

这部分可参考知乎:https://www.zhihu.com/question/23546309?sort=created,ZH.Li的答案。


(1)证明前的基础理论

(2)证明过程

3.1 SVD定义

Singular Value Decomposition。

SVD是一种基于矩阵分解的,提取信息的强大工具,能够发现数据中的潜在模式。应用领域比如:


隐性语义分析 (Latent Semantic Analysis, LSA) 或隐性语义索引 (Latent Semantic Indexing, LSI);

推荐系统 (Recommender system),可以说是最有价值的应用点(不过现在推荐系统很多都是基于深度学习模型);

矩阵形式数据(主要是图像数据)的压缩。

3.2 SVD基本理论

(1)线性变换

以2×2的线性变换矩阵为例,现在有一个对角矩阵

image.png

(2)SVD推导(略)

从几何角度理解二维SVD:借助SVD可将一个相互垂直的网络(orthogonal grid)变换到另一个互相垂直的网络。

image.png

实际应用中,我们仅需保留着三个比较小的矩阵,就能表示A,不仅节省存储量,在计算的时候更是减少了计算量。SVD在信息检索(隐性语义索引)、图像压缩、推荐系统、金融等领域都有应用。


(3)SVD栗子

其中正交矩阵的特征值和特征向量的求解可以复习线性代数。


image.png


四、QR分解

矩阵的QR分解:可以将矩阵A分解成一个正交阵Q和一个上三角矩阵R的乘积。实际中,QR分解经常被用来解线性最小二乘问题。


image.png

4.1 QR分解步骤

image.png


4.2 一个栗子

image.png


(1)正交化

image.png


(2)单位化


image.png

(3)下一步


image.png

五、SVD图像压缩

(1)下载cv2:pip install opencv-python。


(2)其中np.linalg.svd(a, full_matrices=1, compute_uv=1)函数:


input参数:


a是一个形如(M,N)矩阵

full_matrices的取值是为0或者1,默认值为1,这时u的大小为(M,M),v的大小为(N,N) 。否则u的大小为(M,K),v的大小为(K,N) ,K=min(M,N)。

compute_uv的取值是为0或者1,默认值为1,表示计算u,s,v。为0的时候只计算s。

output参数(三个):


u大小为(M,M),s大小为(M,N),v大小为(N,N)。

A = usv

其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。

(3)numpy.stack函数:将多个数组进行堆叠,按照指定的维度,可参考博客。

# -*- coding: utf-8 -*-
"""
Created on Sat Dec 11 23:14:35 2021
@author: 86493
"""
import cv2
import matplotlib as mpl
import numpy as np
import matplotlib.pyplot as plt
#转为u8类型
def restore1(u, sigma, v, k):
    m = len(u)
    n = len(v)
    a = np.zeros((m, n))
    a = np.dot(u[:, :k], np.diag(sigma[:k])).dot(v[:k, :])
    # s1 =  np.size(u[:, :k])
    # s1+= np.size(np.diag(sigma[:k]))
    # s1+= np.size(np.diag(v[:k, :]))
    # s2 = np.size(a)
    # print("压缩率:",s1/s2)
    a[a < 0] = 0
    a[a > 255] = 255
    return np.rint(a).astype('uint8')
def SVD(frame,K=10):
    a = np.array(frame)
    #由于是彩色图像,所以3通道。a的最内层数组为三个数,分别表示RGB,用来表示一个像素
    u_r, sigma_r, v_r = np.linalg.svd(a[:, :, 0])
    u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1])
    u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2])
    R = restore1(u_r, sigma_r, v_r, K)
    G = restore1(u_g, sigma_g, v_g, K)
    B = restore1(u_b, sigma_b, v_b, K)
    I = np.stack((R, G, B), axis = 2)
    return I
if __name__ == "__main__":
    mpl.rcParams['font.sans-serif'] = [u'simHei']
    mpl.rcParams['axes.unicode_minus'] = False
    # frame = cv2.imread("./liuyifei.bmp",-1)
    frame = cv2.imread("pig.jpg",-1)
    I = SVD(frame,40)
    plt.imshow(I)
    cv2.imwrite("out.bmp",I)
相关文章
|
5月前
|
机器学习/深度学习 搜索推荐 算法
【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解
【阿旭机器学习实战】【37】电影推荐系统---基于矩阵分解
|
6月前
|
机器学习/深度学习 Python
【Python 机器学习专栏】混淆矩阵与 ROC 曲线分析
【4月更文挑战第30天】本文介绍了机器学习中评估模型性能的两种工具——混淆矩阵和ROC曲线。混淆矩阵显示了模型在不同类别上的预测情况,包括真正例、假正例、真反例和假反例,帮助评估模型错误类型和数量。ROC曲线则通过假正率和真正率展示了模型的二分类性能,曲线越接近左上角,性能越好。文章还提供了Python中计算混淆矩阵和ROC曲线的代码示例,强调它们在模型选择、参数调整和理解模型行为中的应用价值。
196 0
|
6月前
|
机器学习/深度学习 搜索推荐 算法
python机器学习:推荐系统实现(以矩阵分解来协同过滤)
python机器学习:推荐系统实现(以矩阵分解来协同过滤)
|
6月前
|
机器学习/深度学习 JavaScript Python
GEE机器学习——混淆矩阵Classifier.confusionMatrix()和errorMatrix()和exlain()的用法(js和python代码)
GEE机器学习——混淆矩阵Classifier.confusionMatrix()和errorMatrix()和exlain()的用法(js和python代码)
175 0
|
6月前
|
机器学习/深度学习 人工智能 算法
【人工智能】<吴恩达-机器学习>批量梯度下降&矩阵和向量运算概述
【1月更文挑战第26天】【人工智能】<吴恩达-机器学习>批量梯度下降&矩阵和向量运算概述
|
机器学习/深度学习 监控 PyTorch
机器学习 - 混淆矩阵:技术与实战全方位解析
机器学习 - 混淆矩阵:技术与实战全方位解析
458 0
|
机器学习/深度学习
【吴恩达机器学习笔记】三、矩阵
【吴恩达机器学习笔记】三、矩阵
81 0
|
机器学习/深度学习 算法
【机器学习】分类模型评价指标(混淆矩阵、ROC)(已修改,放心看)
【机器学习】分类模型评价指标(混淆矩阵、ROC)(已修改,放心看)
191 0
|
机器学习/深度学习 Python
【机器学习】混淆矩阵的原理(理论+图解)
【机器学习】混淆矩阵的原理(理论+图解)
327 0
【机器学习】混淆矩阵的原理(理论+图解)
|
机器学习/深度学习
机器学习中矩阵求导法则
矩阵求导的本质上就是矩阵中元素对元素的求导,只是将其按照矩阵的形式进行一些规范化的写法罢了
121 0