【机器学习中的矩阵分解】LU分解、QR分解、SVD分解

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

一、三角分解(LU分解)

1.1 高斯消元

1.2 LU分解原理

1.3 LU分解python代码

1.4 LU分解算法

二、QR分解

2.1 Schmid 正交化

2.2 使用 Schmid 施密特正交化过程求 QR 分解

2.3 QR分解的栗子

三、SVD分解

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

对角矩阵M是将二维平面上的点(x,y)经过线性变换到另一个点的变换矩阵(变换效果:平面沿着x水平方向进行3倍拉伸,垂直方向没变化):


image.png

image.png

(2)SVD推导(略)

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

image.png

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


(3)SVD栗子

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


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)

五、SVD手写体识别


相关文章
|
机器学习/深度学习 存储 vr&ar
线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用
线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用
|
4月前
|
机器学习/深度学习 搜索推荐 数据挖掘
R语言矩阵特征值分解(谱分解)和奇异值分解(SVD)特征向量分析有价证券数据
R语言矩阵特征值分解(谱分解)和奇异值分解(SVD)特征向量分析有价证券数据
|
4月前
|
机器学习/深度学习 算法 数据可视化
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
|
4月前
|
存储 算法 前端开发
R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据
R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据
|
4月前
|
人工智能
R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
R语言中实现广义相加模型GAM和普通最小二乘(OLS)回归
|
机器学习/深度学习 数据采集 资源调度
【推荐系统】推荐场景为什么不可以使用SVD分解共现矩阵
【推荐系统】推荐场景为什么不可以使用SVD分解共现矩阵
151 0
【推荐系统】推荐场景为什么不可以使用SVD分解共现矩阵
|
机器学习/深度学习
学习笔记: 线性代数-矩阵的QR分解
线性代数个人学习笔记
152 0
|
机器学习/深度学习 资源调度 算法
|
数据采集 自然语言处理 算法
广义学习矢量量化(GLVQ)分类算法介绍和代码实现
广义学习矢量量化(Generalized Learning Vector Quantization,GLVQ)是一种基于原型的分类算法,用于将输入数据分配到先前定义的类别中。
151 0
广义学习矢量量化(GLVQ)分类算法介绍和代码实现
|
机器学习/深度学习 算法
深度之眼(六)——矩阵的逆(附:logistic模型一些想法)
深度之眼(六)——矩阵的逆(附:logistic模型一些想法)
深度之眼(六)——矩阵的逆(附:logistic模型一些想法)