SVD奇异值分解相关技术

news2024/9/20 9:22:23

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。

一、参考资料

Eigen 矩阵的SVD分解

奇异值分解(SVD)

二、相关介绍

1. 单位阵

主对角线全为1的方阵,称为单位阵,用 I \mathrm{I} I E \mathrm{E} E 表示单位阵。

2. 对称矩阵

对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。

如果 X \mathrm{X} X 是对称矩阵,对于任意的矩阵 A X A T \mathrm{AXA}^{\mathrm{T}} AXAT 也是对称矩阵。

3. 奇异值

奇异值是矩阵里的概念,一般通过奇异值分解定理求得。设A为mxn阶矩阵,q=min(m, n),AxA的q个非负特征值算数平方根称为A的奇异值。

矩阵A的秩等于它的非零奇异值的个数。

三、特征值分解(EVD)

特征值分解

1. 特征值分解原理

注意:实对称矩阵才能进行特征值分解。

如果矩阵A是一个 m × m m\times m m×m实对称矩阵(即 A = A T A=A^{T} A=AT),特征值分解是将一个矩阵A分解成:
A = Q Σ Q T = Q [ λ 1 ⋯ ⋯ ⋯ ⋯ λ 2 ⋯ ⋯ ⋯ ⋯ ⋱ ⋯ ⋯ ⋯ ⋯ λ m ] Q T A=Q\Sigma Q^T=Q\begin{bmatrix}\lambda_1&\cdots&\cdots&\cdots\\\cdots&\lambda_2&\cdots&\cdots\\\\\cdots&\cdots&\ddots&\cdots\\\cdots&\cdots&\cdots&\lambda_m\end{bmatrix}Q^T A=QΣQT=Q λ1λ2λm QT
其中, Q \mathrm{Q} Q 称为特征矩阵,是标准正交阵,即有 Q Q T = I {Q}Q^{T}=I QQT=I λ i \lambda_{i} λi 称为特征值 Σ \Sigma Σ 是特征值组成的对角矩阵,里面的特征值由大到小排列,这些特征值所对应的特征向量描述了矩阵变化方向。 q i q_{i} qi 是特征矩阵 Q \mathrm{Q} Q 中的列向量,称为特征向量

2. 特征值与特征向量

2.1 物理含义

特征值与特征向量的几何意义:矩阵和向量做乘法,向量会变成另一个方向或长度的新向量,主要发生旋转、伸缩的变量。如果矩阵乘以某些向量后,向量不发生旋转变换,只产生伸缩变换,那么就说这些向量是矩阵的特征向量,伸缩的比例是特征值。

2.2 特征矩阵与特征向量的关系

A q i = λ i q i , q i T q j = 0 ( i ≠ j ) Aq_i=\lambda_iq_i,\quad q_i^Tq_j=0(i\neq j) Aqi=λiqi,qiTqj=0(i=j)

三、SVD奇异值分解

1. 问题引入

特征值分解对矩阵A的要求较高,要求被分解的矩阵为实对称矩阵,但现实中所遇到的矩阵一般不是实对称矩阵。当遇到一般性的矩阵,如一个mxn的矩阵A,是否能够进行特征值分解,能否用 A = Q Σ Q T A=Q\Sigma Q^T A=QΣQT 表示呢?答案是可以的,通过SVD奇异值分解。

2. SVD定义

SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为实对称矩阵。SVD奇异值分解是将一个非零的实数矩阵 A m × n A_{m \times n} Am×n分解成由三个矩阵乘积形式的运算,即进行矩阵的因子分解:
A = U Σ V T \mathrm{A}=\mathrm{U} \Sigma \mathrm{V}^{\mathrm{T}} A=UΣVT
其中, U \mathrm{U} U 称为左奇异矩阵,为mxm的单位正交阵,即有 U U T = I \mathrm{UU}^{\mathrm{T}}=\mathrm{I} UUT=I V \mathrm{V} V 称为右奇异矩阵,为nxn的单位正交阵,即有 V V T = I \mathrm{V} \mathrm{V}^{\mathrm{T}}=\mathrm{I} VVT=I Σ \Sigma Σ 是 mxn 维的对角矩阵,其对角线上的数值即为奇异值,并按照降序排列,可以表示为:
Σ = d i a g ( σ 1 , σ 2 , . . . , σ p ) = [ σ 1 σ 2 ⋱ ⋱ ] m × n st. σ 1 ≥ σ 2 ≥ . . . ≥ σ p ≥ 0 \Sigma=\mathrm{diag}(\sigma_{1},\sigma_{2},...,\sigma_{\mathrm{p}})=\left[\begin{array}{cccc} \sqrt{\sigma_1} & & & \\ & \sqrt{\sigma_2} & \ddots & \\ & & & \ddots \end{array}\right]_{\mathrm{m} \times \mathrm{n}}\quad\quad\text{st.}\sigma_1\geq\sigma_2\geq...\geq\sigma_\text{p}\geq0 Σ=diag(σ1,σ2,...,σp)= σ1 σ2 m×nst.σ1σ2...σp0
σ i \sqrt{\sigma_i} σi 为矩阵的奇异值。各矩阵的维度分别为 U ∈ R m × m \mathrm{U} \in \mathrm{R}^{\mathrm{m} \times \mathrm{m}} URm×m Σ ∈ R m × n \Sigma\in\mathrm{R}^{\mathrm{m\times n}} ΣRm×n V ∈ R n × n \mathrm{V} \in \mathrm{R}^{\mathrm{n} \times \mathrm{n}} VRn×n

3. 奇异值求解

为求解上述 U \mathrm{U} U,$ \Sigma , , \mathrm{V}$,可以利用如下性质:
A A T = U Σ V T ( U Σ V T ) T = U Σ V T V Σ T U T = U Σ Σ T U T \mathrm{AA^{T}=U\Sigma V^{T}(U\Sigma V^{T})^{T}=U\Sigma V^{T}V\Sigma^{T}U^{T}=U\Sigma\Sigma^{T}U^{T}} AAT=VT(VT)T=VTVΣTUT=ΣTUT

A T A = ( U Σ V   T   )   T   U Σ V   T   = V Σ   T U   T   U Σ V   T   = V Σ   T   Σ V   T   \mathrm{A^{T}\mathrm{A}=(U\Sigma V^{~T~})^{~T~}U\Sigma V^{~T~}=V\Sigma^{~T}U^{~T~}U\Sigma V^{~T~}=V\Sigma^{~T~}\Sigma V^{~T~}} ATA=(V T ) T V T =VΣ TU T V T =VΣ T ΣV T 

其中, Σ Σ T ∈ R m × m \Sigma\Sigma^{\mathrm{T}}\in\mathrm{R}^{\mathrm{m\times m}} ΣΣTRm×m Σ T Σ ∈ R n × n \Sigma^{\mathrm{T}}\Sigma\in\mathrm{R^{n\times n}} ΣTΣRn×n,从矩阵的角度上来讲, Σ Σ T \Sigma\Sigma^\mathrm{T} ΣΣT Σ T Σ \Sigma^\mathrm{T}\Sigma ΣTΣ 是不相等的,但它们在主对角线的奇异值是相等的,即有:
Σ Σ T = [ σ 1 σ 2 ⋱ ⋱ ] m × m \Sigma\Sigma^\mathrm{T}=\begin{bmatrix}\sigma_1\\&\sigma_2\\&&\ddots\\&&&\ddots\end{bmatrix}_{\mathrm{m\times m}} ΣΣT= σ1σ2 m×m

Σ T Σ = [ σ 1 σ 2 ⋱ ⋱ ] n × n \Sigma^\mathrm{T}\Sigma=\begin{bmatrix}\sigma_1\\&\sigma_2\\&&\ddots\\&&&\ddots\end{bmatrix}_{\mathrm{n\times n}} ΣTΣ= σ1σ2 n×n

可以看到 Σ Σ T \Sigma\Sigma^\mathrm{T} ΣΣT Σ T Σ \Sigma^\mathrm{T}\Sigma ΣTΣ 的形式非常接近,进一步分析,可以发现 A A T \mathrm{AA}^{\mathrm{T}} AAT A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 是对称矩阵,可以做特征值分解(EVD)。对 A A T \mathrm{AA}^{\mathrm{T}} AAT 特征值分解,得到特征矩阵为 U \mathrm{U} U。对 A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 特征值分解,得到特征矩阵为 V \mathrm{V} V。对 A A T \mathrm{AA}^{\mathrm{T}} AAT A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 中的特征值求算数平方根,得到所有的奇异值

由此可求得特征值为 σ 1 ⋅ σ 2 , ⋯ σ k \sqrt{\sigma_{1}}\cdot\sqrt{\sigma_{2}},\cdots\sqrt{\sigma_{\mathrm{k}}} σ1 σ2 ,σk 。所以,矩阵A:
A = U Σ V   T = [ u 1 u 2 ⋯ u m ] [ σ 1 σ 2 ⋱ ⋱ ] m × n [ v 1 v 2 ⋮ v n ] \mathrm{A}=\mathrm{U}\Sigma\mathrm{V}^\mathrm{~T}=\begin{bmatrix}\mathrm{u}_1&\mathrm{u}_2&\cdots&\mathrm{u}_\mathrm{m}\end{bmatrix}\begin{bmatrix}\sqrt{\sigma_1}\\&\sqrt{\sigma_2}\\&&\ddots\\&&&\ddots\end{bmatrix}_{\mathrm{m}\times\mathrm{n}}\begin{bmatrix}\mathrm{v}_1\\\mathrm{v}_2\\\vdots\\\mathrm{v}_\mathrm{n}\end{bmatrix} A=UΣV T=[u1u2um] σ1 σ2 m×n v1v2vn
在奇异值矩阵中奇异值按照从大到小排列,而且奇异值的减少特别的快。在很多情况下,前 10% 甚至 1%的奇异值的和就占了全部的奇异值之和的 99% 以上的比例。也就是说,我们也可以用最大的 k 个的奇异值和对应的左右奇异向量来近似描述矩阵。因此,进一步化简得到:
A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ k u k v k T \mathrm A=\sqrt{\sigma_1}\mathrm u_1\mathrm v_1^\mathrm{T}+\sqrt{\sigma_2}\mathrm u_2\mathrm v_2^\mathrm{T}+\cdots+\sqrt{\sigma_\mathrm{k}}\mathrm u_\mathrm{k}\mathrm v_\mathrm{k}^\mathrm{T} A=σ1 u1v1T+σ2 u2v2T++σk ukvkT
即:
A = λ 1 u 1 v 1 T + λ 2 u 2 v 2 T + ⋯ + λ k u k v k T \mathrm A=\lambda_1\mathrm u_1\mathrm v_1^\mathrm{T}+\lambda_2\mathrm u_2\mathrm v_2^\mathrm{T}+\cdots+\lambda_\mathrm{k}\mathrm u_\mathrm{k}\mathrm v_\mathrm{k}^\mathrm{T} A=λ1u1v1T+λ2u2v2T++λkukvkT
矩阵A被分解为k个小矩阵,每个矩阵都是 λ \mathrm{\lambda} λ 乘以 u i v i T \mathrm{u_{i}v_{i}^{\mathrm{T}}} uiviT。此时可以看到,若入取值较大,其对应的矩阵在矩阵A的占比也大,所以取前面主要的 λ \mathrm{\lambda} λ 来近似表示矩阵A,矩阵A可以表示为:
A m × n = U m × m Σ m × n V n × n T ≈   U m × k   Σ k × k   V k × n   T \mathrm{A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V_{n\times n}^{\mathrm{T}}}\approx\mathrm{~U_{m\times k}~\Sigma_{k\times k}~V_{k\times n}^{~\mathrm{T}}} Am×n=Um×mΣm×nVn×nT Um×k Σk×k Vk×n T
其中,k要比n小很多,也就是一个大的矩阵 A 可以用三个小的矩阵 U m × k \mathrm{U}_{\mathrm{m\times k}} Um×k , Σ k × k \Sigma_{\mathrm{k\times k}} Σk×k V k × n T \mathrm{V}_{\mathrm{k\times n}}^{\mathrm{T}} Vk×nT 近似表示。
在这里插入图片描述
计算量对比

原矩阵计算量: M × N M\times N M×N
SVD分解之后的计算量: M × k + k × k × N = k ( M + N + k ) M\times k+k\times k\times N=k(M+N+k) M×k+k×k×N=k(M+N+k)
一般情况下, M × N ≫ k ( M + N + k ) M\times N\gg k(M+N+k) M×Nk(M+N+k),这使得数据的存储量计算量都远小于原始矩阵。

4. SVD分解举例

A = [ 0 1 1 1 1 0 ] \mathrm A=\begin{bmatrix}0&&1\\1&&1\\1&&0\end{bmatrix} A= 011110

求解 A A T \mathrm{AA}^{\mathrm{T}} AAT A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA
A T A = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 2 1 1 2 ] \text{A}^{\text{T}}\text{A}=\begin{bmatrix}0&1&1\\1&1&0\end{bmatrix}\begin{bmatrix}0&1\\1&1\\1&0\end{bmatrix}=\begin{bmatrix}2&1\\1&2\end{bmatrix} ATA=[011110] 011110 =[2112]

A A T = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 1 1 0 1 2 1 0 1 1 ] \mathrm{AA}^{\mathrm{T}}=\begin{bmatrix}0&1\\1&1\\1&0\end{bmatrix}\begin{bmatrix}0&1&1\\1&1&0\end{bmatrix}=\begin{bmatrix}1&1&0\\1&2&1\\0&1&1\end{bmatrix} AAT= 011110 [011110]= 110121011

进而求 A A T \mathrm{AA}^{\mathrm{T}} AAT 的特征值和特征向量:
λ 1 = 3 ; v 1 = [ 1 / 2 1 / 2 ] \lambda_1=3;\mathrm{v}_1=\begin{bmatrix}1/\sqrt2\\1/\sqrt2\end{bmatrix} λ1=3;v1=[1/2 1/2 ]

λ 2 = 1 ; v 2 = [ 1 / 2 − 1 / 2 ] \lambda_2=1;\mathrm{v}_2=\begin{bmatrix}1/\sqrt{2}\\-1/\sqrt{2}\end{bmatrix} λ2=1;v2=[1/2 1/2 ]

A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 的特征值和特征向量:
λ 1 = 3 ; v 1 = [ 1 / 6 2 / 6 1 / 6 ] \lambda_1=3;\mathrm{v}_1=\begin{bmatrix}1/\sqrt6\\2/\sqrt6\\1/\sqrt6\end{bmatrix} λ1=3;v1= 1/6 2/6 1/6

λ 2 = 1 ; v 2 = [ − 1 / 2 0 1 / 2 ] \lambda_2=1;\mathrm{v}_2=\begin{bmatrix}-1/\sqrt{2}\\0\\1/\sqrt{2}\end{bmatrix} λ2=1;v2= 1/2 01/2

λ 3 = 0 ; v 3 = [ 1 / 3 − 1 / 3 1 / 3 ] \lambda_3=0;\mathrm{v}_3=\left[\begin{array}{c}1/\sqrt{3}\\-1/\sqrt{3}\\1/\sqrt{3}\end{array}\right] λ3=0;v3= 1/3 1/3 1/3

利用 σ i = λ i \sigma_{\mathrm{i}}=\sqrt{\lambda_{\mathrm{i}}} σi=λi ,可得奇异值为 3 \sqrt{3} 3 和 1。最终得矩阵A的奇异值分解为:
A = U Σ V T = [ 1 / 6 − 1 / 2 1 / 3 2 / 6 0 − 1 / 3 1 / 6 1 / 2 1 / 3 ] [ 3 0 0 1 0 0 ] [ 1 / 2 1 / 2 1 / 2 − 1 / 2 ] \mathrm A=\mathrm U\Sigma\mathrm V^\text{T}=\begin{bmatrix}1/\sqrt{6}&&-1/\sqrt{2}&&1/\sqrt{3}\\2/\sqrt{6}&&0&&-1/\sqrt{3}\\1/\sqrt{6}&&1/\sqrt{2}&&1/\sqrt{3}\end{bmatrix}\begin{bmatrix}\sqrt{3}&&0\\0&&1\\0&&0\end{bmatrix}\begin{bmatrix}1/\sqrt{2}&&1/\sqrt{2}\\1/\sqrt{2}&&-1/\sqrt{2}\end{bmatrix} A=UΣVT= 1/6 2/6 1/6 1/2 01/2 1/3 1/3 1/3 3 00010 [1/2 1/2 1/2 1/2 ]

5. 用Eigen库实现SVD分解

#include <iostream>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

int main()
{
	MatrixXf m = MatrixXf::Zero(3, 2);
	m << 0,1,1,1,1,0;
	cout << "Here is the matrix m:" << endl << m << endl;
	JacobiSVD<MatrixXf> svd(m, ComputeFullU | ComputeFullV);
	cout << "Its singular values are:" << endl << svd.singularValues() << endl;
	cout << "Its left singular vectors are the columns of the thin U matrix:" << endl << endl << svd.matrixU() << endl;
	cout << "Its right singular vectors are the columns of the thin V matrix:" << endl << endl << svd.matrixV() << endl;
	system("pause");
	return 0;
}

输出结果

Here is the matrix m:
0 1
1 1
1 0
Its singular values are:
1.73205
      1
Its left singular vectors are the columns of the thin U matrix:

   0.408248   -0.707107     0.57735
   0.816496 5.96046e-08    -0.57735
   0.408248    0.707107     0.57735
Its right singular vectors are the columns of the thin V matrix:

 0.707107  0.707107
 0.707107 -0.707107

6. 对图像进行SVD分解

对图片进行奇异值分解(SVD)

SVD(奇异值分解)小结

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像(路径不能有中文)
img = cv2.imread('img.jpg')
# 原图大小为 h * w * c
h, w, c = img.shape

def decompose(img):
    # 将图片转换成 h * wc
    img_temp = img.reshape(h, w * c)
    # 奇异值分解
    u, sigma, vt = np.linalg.svd(img_temp)
    return u, sigma, vt

def rebuild(u, sigma, vt, sval_num):
    # 每个矩阵取前 500 个奇异值,近似得到原图
    img_temp = (u[:, 0:sval_num]).dot(np.diag(sigma[0:sval_num])).dot(vt[0:sval_num, :])
    # 转换为原图像的大小
    svd_img = img_temp.reshape(h, w, c)
    # 注意需要转换成uint8
    return np.array(svd_img, dtype=np.uint8)

u, sigma, vt = decompose(img)
svd_img = rebuild(u, sigma, vt, 500)

原图
在这里插入图片描述

SVD得到的
在这里插入图片描述

7. 总结

奇异值可以看作是一个矩阵代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,基本上可以还原出数据本身。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/897930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

unity 之 GetComponent 获取游戏对象上组件实例方法

GetComponent 简单介绍 GetComponent 是Unity引擎中用于获取游戏对象上组件实例的方法。它允许您从游戏对象中获取特定类型的组件&#xff0c;以便在脚本中进行操作和交互。 GetComponent< ComponentType >(): 这是一个泛型方法&#xff0c;用于从当前游戏对象上获取指定…

解锁数据中心高效监测精密空调,现学现用!

精密空调监控在当今科技发展中扮演着至关重要的角色。无论是数据中心、实验室还是医疗设施&#xff0c;都需要维持恒定的温度、湿度和空气质量&#xff0c;以确保设备的正常运行和数据的准确性。 精密空调监控不仅是现代高科技环境中的必备工具&#xff0c;也是保障设备稳定性、…

idea 本地版本控制 local history

idea 本地版本控制 local history 如何打开 1 自定义快捷键 settings->keymap->搜索框输入 show history -》Add Keyboard Shortcut -》设置为 CtrlAltL 2 右键文件-》local history -》show history 新建文件 版本1&#xff0c;creating class com.geekmice…这个是初…

同一个局域网主机中的一台主机连接另一台主机的虚拟机

星光下的赶路人star的个人主页 理想的路总是为有信心的人预备着 文章目录 1、描述问题2、解决前提3、解决办法4、实操4.1 虚拟机配置4.2 主机防火墙配置&#xff08;是你要连接虚拟机的所在的主机&#xff09;4.3 连接测试 1、描述问题 想要连接朋友主机的虚拟机&#xff0c;利…

光电效应波粒二象性

光电效应&#xff1a;光照射在金属表面时&#xff0c;瞬间&#xff08;t &#xff1c;10^-9s&#xff09;释放出电子的现象。 光电效应规律&#xff1a; 1、任何一种金属都有一个截止频率&#xff0c;低于该截止频率不能发生光电效应&#xff1b; 2、光电子最大初动能与入射光的…

“我30岁了,转行IT行业!还有没有出路?”

人到30&#xff0c;就容易产生中年危机。俗话说30而立&#xff0c;但其实很不容易&#xff0c;成家不易、立业也不易&#xff0c;尤其是现如今房价这么贵&#xff0c;物价那么高&#xff0c;各种压力随之而来。在职场中工作了几年&#xff0c;到近30岁时如果还是没有太大进展&a…

vue2+vue3封装使用svg图标

需求&#xff1a;1.在vue2中封装使用svg 2.在vue3中封装使用svg 3.在vue3中使用自定义插件封装多个组件 1.获取svg图标操作 在阿里巴巴矢量图标库找自己需要的svg图标 地址&#xff1a;阿里巴巴矢量图标库 随便找个图标点击下载 选择好尺寸后就可以点击复制svg代码了 在ass…

基于互斥锁的生产者消费者模型

文章目录 生产者消费者 定义代码实现 / 思路完整代码执行逻辑 / 思路 局部具体分析model.ccfunc&#xff08;消费者线程&#xff09; 执行结果 生产者消费者 定义 生产者消费者模型 是一种常用的 并发编程模型 &#xff0c;用于解决多线程或多进程环境下的协作问题。该模型包含…

Windows如何部署Jenkins

一、简介 Jenkins 是国际上流行的免费开源软件项目&#xff0c;基于Java 开发持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;提供一个开放的易用的软件平台&#xff0c;使软件的持续集成自动化&#xff0c;大大节约人力和时效。 二、Java JDK 访问 OpenLogic…

入行嵌入式的几个必备技能

嵌入式作为时下最热的行业之一&#xff0c;有不少朋友想入行却不得其法&#xff0c;这里为大家提供几个嵌入式行业必备的技能。 精通C语言 嵌入式系统中&#xff0c;精通C语言至关重要。 对于嵌入式软件开发者而言&#xff0c;掌握C语言是必要条件。在大学期间&#xff0c;你…

【8月19日】红帽openstack管理课程(CL210) 新一轮开课

课程介绍 通过实验室操作练习&#xff0c;学员将能够深入学习红帽企业 Linux OpenStack 平台各服务的手动安装方法&#xff0c;还将了解 OpenStack 开发社区的未来发展计划。 培训地点&#xff1a; 线下面授&#xff1a;苏州市姑苏区干将东路666号和基广场401室&#xff1b;…

原生微信小程序自定义picker多列选择器:picker写法用法

前言: 最近用原生微信小程序写法写医疗相关项目微信小程序&#xff0c;在编辑个人资料的时候&#xff0c;需要很多选择器&#xff0c;比如城市地区选择器&#xff0c;职业职称选择器&#xff0c;科室选择器&#xff0c;学校选择器&#xff0c;学历选择器&#xff0c;年份日期选…

无涯教程-TensorFlow - TensorBoard可视化

TensorFlow包含一个可视化工具&#xff0c;称为TensorBoard&#xff0c;它用于分析数据流图&#xff0c;还用于了解机器学习模型。 TensorBoard的重要功能包括查看有关垂直对齐的任何图形的参数和详细信息的不同类型统计的视图。 深度神经网络包括多达36&#xff0c;000个节点…

大数据Flink(六十四):Flink运行时架构介绍

文章目录 Flink运行时架构介绍 一、系统架构 二、​​​​​​​​​​​​​​整体构成 三、作业管理器&#xff08;JobManager&#xff09; 四、任务管理器&#xff08;TaskManager&#xff09; Flink运行时架构介绍 我们已经对 Flink 的主要特性和部署提交有了基本的了…

机器视觉工程们,我们值多少钱

&#xff08;QQ群有答疑&#xff09;零基础小白快速上手海康VisionMaster开发系列课程 UP主你的主题太吸引人&#xff0c;也太不近人情世故了&#xff0c;实施上&#xff0c;别人总是这样子去想。 人们会根据自己的观点去评价别人&#xff0c;去评估别人的价值&#xff0c;其实…

第1天----验证一个字符串是否是另一个字符串的子串

本文我们将学习如何去验证一个字符串是否是另一个字符串的子串。 一、小试牛刀&#xff1a; 题目描述 输入两个字符串&#xff0c;验证其中一个串是否为另一个串的子串。 输入格式 两行&#xff0c;每行一个字符串。 输出格式 若第一个串 s 1 是第二个串 s 2 的子串&#xff0c…

前端:VUE2中的父子传值

文章目录 一、背景什么是父子传值二、业务场景子传父1、在父页面中引入子页面2、子传父&#xff1a;父组件标识3、子传父&#xff1a;子组件标识 父传子父组件调用子组件中的方法 总结&#xff1a; 一、背景 最近做项目中需要使用到流工作&#xff0c;在这里流工作需要用到父子…

GM65二维码识别模块+命令控制

简介 MG65 条码识读模块&#xff0c;一款性能优良的扫描引擎&#xff0c;不仅能够轻松读取各类一维条码&#xff0c;而且可以高速读取二维条码&#xff0c;对线性条形码具有非常高的扫描速率&#xff0c;针对纸质条码及显示屏上的条码&#xff0c;也都能轻松扫描。 一、模块参…

【云原生】kubernetes应用程序包管理工具Helm

Helm 什么是 Helm 安装 Helm 重要概念 使用 Helm 1 简介 官网地址: Helm Helm是一个Kubernetes应用程序包管理工具&#xff0c;它允许你轻松管理和部署Kubernetes应用程序。Helm通过使用称为Charts的预定义模板来简化Kubernetes应用程序的部署和管理。Chart包含了一组Ku…

YOLOv5算法改进(2)— 添加SE注意力机制

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。注意力机制是近年来深度学习领域内的研究热点&#xff0c;可以帮助模型更好地关注重要的特征&#xff0c;从而提高模型的性能。注意力机制可被应用于模型的不同层级&#xff0c;以便更好地捕捉图像中的细节和特征&#xff…