深度学习 DEEP LEARNING 1-2章

文章目录

  • 深度学习 DEEP LEARNING 1-2章
    • 1.神书简介
    • 2.基本概念
    • 3.矩阵运算
    • 4.特殊矩阵
    • 5.特征分解
    • 6.矩阵的对角化
    • 7.SVD分解(奇异值分解)
    • 8.SVD分解应用
    • 9.逆矩阵,伪逆矩阵,最小二乘解,最小范数解
    • 10.主成分分析 PCA
    • 11.PCA应用
    • 12.数学例题

1.神书简介

《deep Learning》由全球知名的三位专家Ian Goodfellow、Yoshua Bengio 和Aaron Courville撰写,其被奉为AI界圣经。因其封面为AI生成的鲜花图像,故其“花书”之名广为传播。

其大致可以分为三大部分:各种基础(属地基型,学此部分的同时可佐以线性代数、李航统计学方法、吴恩达机器学习、机器学习实战、西瓜书、林轩田机器学习等书籍。。)、深度神经网络核心知识(本书灵魂所在,实践才是硬道理)、前沿发展(金字塔尖儿,可以细琢磨一下以便发论文)

重难点内容

  1. 矩阵对角化与svd分解 2. 最小二乘与pca

2.基本概念

线性代数主要研究的是以下几种对象:

  • 标量(scalar):标量就是单一的数字,比如单一的整数,实数,有理数等都是标量。
  • 向量(vector):可以看做是一组标量形成的一维数组,如由n个实数组成的向量:

​ x=[x1x2⋮xn]\boldsymbol{x}=\left[\begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{n}}\end{array}\right]x=⎣⎢⎢⎢⎡​x1​x2​⋮xn​​⎦⎥⎥⎥⎤​

  • 矩阵(matrix): 矩阵是二维数组,所以每个元素需要行和列的指标来标记

​ [A1,1A1,2A2,1A2,2]\left[\begin{array}{ll}{A_{1,1}} & {A_{1,2}} \\ {A_{2,1}} & {A_{2,2}}\end{array}\right][A1,1​A2,1​​A1,2​A2,2​​]

  • 张量(tensor):张量是多维数组,当它是零维时就是标量,一维时就是矢量,二维时就是矩阵,也可以大于二维。
  • 行列式(determinant):det(A)等于矩阵特征值的乘积,用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。

3.矩阵运算

  • 转置(transpose):矩阵转置可以想成将矩阵按轴线翻转过来,矩阵A的转置常常用ATA^{T}AT表示
  • 矩阵乘法(matrix product):假如有两个形状分别为 m x n 的矩阵A和 n x p 的矩阵B,注意A的列数和B的行数要匹配,矩阵乘积C=AB就是将A的每一行与对应的B的每一列相乘求和,并将所得的数存储在C的对应元素中:

​ Ci,j=∑kAi,kBk,jC_{i, j}=\sum_{k} A_{i, k} B_{k, j}Ci,j​=∑k​Ai,k​Bk,j​

由图形表示即是

矩阵与向量的乘积可以看做是矩阵与矩阵乘积的一种特殊情况。我们常用的n元一次线性方程组也可以表示为矩阵与向量的乘积形式

​ Ax=bA x=bAx=b

  • 逆矩阵(inverse matrix):首先我们需要定义单位矩阵(Identity Matrix)InI_{n}In​,InI_{n}In​是一个n x n的方形矩阵,并且主对角线均为1,其他元素均为零,单位矩阵与任意向量相乘还得到该向量本身。矩阵A的逆矩阵常用A−1A^{-1}A−1表示,其性质是 A−1A=InA^{-1} A=I_{n}A−1A=In​.即矩阵(方阵)的逆满足如下条件:A−1A=AA−1=InA^{-1} A=A A^{-1}=I_{n}A−1A=AA−1=In​

假如一个矩阵存在逆矩阵,那么相应的线性方程组就可以转化为求逆矩阵与向量的矩阵乘积的问题:

​ Ax=bA−1Ax=A−1bInx=A−1b\begin{aligned} A x &=b \\ A^{-1} A x &=A^{-1} b \\ I_{n} x &=A^{-1} b \end{aligned}AxA−1AxIn​x​=b=A−1b=A−1b​

  • (trace):迹定义为求主对角线元素的和 Tr⁡(A)=∑iAi,i\operatorname{Tr}(\boldsymbol{A})=\sum_{i} \boldsymbol{A}_{i, i}Tr(A)=∑i​Ai,i​

  • 范数(norm):范数用来度量向量的大小。比如LpL^{p}Lpnorm定义为 ∥x∥p=(∑i∣xi∣p)1p\|\boldsymbol{x}\|_{p}=\left(\sum_{i}\left|x_{i}\right|^{p}\right)^{\frac{1}{p}}∥x∥p​=(∑i​∣xi​∣p)p1​(其中p是实数且p≥1)

常用的有L2L^{2}L2norm,代表了从原点到向量所表示的点的欧几里得空间距离。为了方便计算, 我们也常常用L2L^{2}L2norm的平方,可计算为向量转置与自身的乘积xTxx^{T} xxTx。机器学习算法中还比较常用的是L1L^{1}L1norm,即

​ ∥x∥1=∑i∣xi∣\|x\|_{1}=\sum_{i}\left|x_{i}\right|∥x∥1​=∑i​∣xi​∣
L1L^{1}L1norm常常用来做机器学习模型的regularization(防止过拟合,以后章节会细讲),因为 机器学习模型中我们常常想减小模型非零变量的数量以防止过拟合,也就是很多变量变为零,而将大部分权重放在某些有意义的变量上,这时候由于L2L^{2}L2在变量较小接近零时跟随的改变较小,会出现很多趋近于零而不为零的变量,而L1L^{1}L1norm由于跟随于每个变量的变动是恒定的,使得零元素和非零但趋近于零的变量仍对该项有显著贡献,在目标是减小这一项的过程中会使很多变量归零(注意是归零而不仅仅是较小接近零),从而更有效的减少过拟合。

  • 实用性质

A(B+C)=AB+AC(分配律)

A(BC)=(AB)C(结合律)

AB≠BA(一般不满足交换律)

(AB)=BA

(AB)⊤=B⊤A⊤(A B)^{\top}=B^{\top} A^{\top}(AB)⊤=B⊤A⊤(转置)

x⊤y=(x⊤y)⊤=y⊤xx^{\top} y=\left(x^{\top} y\right)^{\top}=y^{\top} xx⊤y=(x⊤y)⊤=y⊤x(转置) 其中:x,y都是列向量,x⊤x^{\top}x⊤是行向量,xTyx^{T} yxTy的结果是一个标量

4.特殊矩阵

  • 对称矩阵(symmetric matrix):对称矩阵的转置等于它自身。A=A⊤A=A^{\top}A=A⊤

  • 对角矩阵(diagonal matrix):除主对角线的元素均为零。

  • 单位向量(unit vector): 单位向量的L2L^{2}L2norm等于1。

  • 正交矩阵(orthogonal matrix): 正交矩阵的转置与它自身的矩阵乘积是单位矩阵:A⊤A=AA⊤=IA^{\top} A=A A^{\top}=IA⊤A=AA⊤=I

  • 单位矩阵(identity matrix):任意向量或矩阵和单位矩阵相乘,都不会改变,记为I。

    ​ 所有沿主对角线的元素都是1,而所有其他位置的元素都是0。

5.特征分解

正如我们可以把正整数表示为更基本的质数的乘积的形式,特征分解(eigendecomposition)也是将矩阵分解为组成它的特征向量(eigenvector)和特征值(eigenvalue)的形式。

特征向量定义如下:如果正方形矩阵A和向量v的乘积可以表示为一个标量λ\lambdaλ 与向量v的乘积,那么v就是A的一个特征向量,λ\lambdaλ就是A的一个特征值:Av=λvA v=\lambda vAv=λv

可以看出,如果v就是A的一个特征向量,那么任意一个标量与v的乘积仍是A的一个特征向量,而且他们的特征值相同,所以通常我们只关心范数为1的特征向量。假设矩阵A是一个m×m的实对称矩阵(即A=ATA=A^{T}A=AT),那么它可以被分解成如下的形式

A=QΣQT=Q[λ1⋯⋯⋯⋯λ2⋯⋯⋯⋯⋱⋯⋯⋯⋯λm]QTA=Q \Sigma Q^{T}=Q\left[\begin{array}{cccc}{\lambda_{1}} & {\cdots} & {\cdots} & {\cdots} \\ {\cdots} & {\lambda_{2}} & {\cdots} & {\cdots} \\ {\cdots} & {\cdots} & {\ddots} & {\cdots} \\ {\cdots} & {\cdots} & {\cdots} & {\lambda_{m}}\end{array}\right] Q^{T}A=QΣQT=Q⎣⎢⎢⎡​λ1​⋯⋯⋯​⋯λ2​⋯⋯​⋯⋯⋱⋯​⋯⋯⋯λm​​⎦⎥⎥⎤​QT

其中Q为标准正交阵,即有QQT=IQ Q^{T}=IQQT=I,Σ\SigmaΣ为对角矩阵,且上面的矩阵的维度均为mxm。λi\lambda_{i}λi​称为特征值,qiq_{i}qi​是Q(特征矩阵)中的列向量,称为特征向量。Aqi=λiqi,qiTqj=1(i≠j)A q_{i}=\lambda_{i} q_{i}, \quad q_{i}^{T} q_{j}=1(i \neq j)Aqi​=λi​qi​,qiT​qj​=1(i​=j)

我们可以想象矩阵A实际上是将空间在其特征向量的方向上各自拉伸了对应的特征值的尺度。

将矩阵分解为特征值 λ 和特征向量的表示形式。(一般只有方阵才有)

可以看作在二维平面上画出特征向量后,乘上矩阵A表示这个向量被拉伸了 λ 倍,如下图:

当然,不是所有矩阵都可以做特征分解,比较幸运的是,通常我们可能要解决的只是某类特定形式的矩阵问题,例如实对称矩阵总可以表示成特征分解的形式。

λ > 0:正定矩阵(positive definite)

λ ≥ 0:半正定矩阵(positive semidefinite)

λ < 0:负定矩阵(negative definite)

6.矩阵的对角化

矩阵B(方阵)的对角化P−1AP=BP^{-1} A P=BP−1AP=B,其中A为对角矩阵,P为单位正交矩阵(即PTP=PPT=IP^{T} P=P P^{T}=IPTP=PPT=I =>PT=P−1P^{T}=P^{-1}PT=P−1 所以:B=PTAPB=P^{T} A PB=PTAP)。B首先要是方阵,其次它可对角化

一般的矩阵不一定能对角化,但是对称矩阵一定可以对角化(特别是对称正定矩阵(任何一个向量x $x^{T}Ax>0 ),得到的),得到的),得到的\lambda_{1}$都是正数)。

设PT=(u1,u2,⋯,un),ui∈RnP^{T}=\left(u_{1}, u_{2}, \cdots, u_{n}\right), u_{i} \in \mathbb{R}^{n}PT=(u1​,u2​,⋯,un​),ui​∈Rn(其为一个n*n的矩阵,每个ui都为n乘以 1的列向量)

A=(λ1λ2⋱λn)A=\left(\begin{array}{cccc}{\lambda_{1}} & {} & {} & {} \\ {} & {\lambda_{2}} & {} & {} \\ {} & {} & {\ddots} & {} \\ {} & {} & {} & {\lambda_{n}}\end{array}\right)A=⎝⎜⎜⎛​λ1​​λ2​​⋱​λn​​⎠⎟⎟⎞​

则B=(u1,u2,⋯,un)(λ1⋱λn)(u1T⋮unT)B=\left(u_{1}, u_{2}, \cdots, u_{n}\right)\left(\begin{array}{ccc}{\lambda_{1}} & {} & {} \\ {} & {\ddots} & {} \\ {} & {} & {\lambda_{n}}\end{array}\right)\left(\begin{array}{c}{u_{1}^{T}} \\ {\vdots} \\ {u_{n}^{T}}\end{array}\right)B=(u1​,u2​,⋯,un​)⎝⎛​λ1​​⋱​λn​​⎠⎞​⎝⎜⎛​u1T​⋮unT​​⎠⎟⎞​

​ =λ1u1u1T+λ2u2u2T+λ3u3u3T+⋯+λnununT=\lambda_{1} u_{1} u_{1}^{T}+\lambda_{2} u_{2} u_{2}^{T}+\lambda_{3} u_{3} u_{3}^{T}+\cdots+\lambda_{n} u_{n} u_{n}^{T}=λ1​u1​u1T​+λ2​u2​u2T​+λ3​u3​u3T​+⋯+λn​un​unT​

其中λ1u1u1T\lambda_{1} u_{1} u_{1}^{T}λ1​u1​u1T​为()n×1()1×n()_{n \times 1}(\quad)_{1 \times n}()n×1​()1×n​=>n*n的方阵

矩阵的对角化本质意义是把矩阵做分解,分解后可减少参数,可用在矩阵压缩(B可分为很多简单矩阵)

曾经一道面试题:矩阵的压缩表示(有一个n*n的方阵,怎样用n+1的参数最好的表示它:即保留对角矩阵的第一项)

如果B为对称正定矩阵,λ1\lambda_{1}λ1​>0;如果B为对称半正定矩阵,λ1\lambda_{1}λ1​≥0.

7.SVD分解(奇异值分解)

SVD全称是Single Value Decomposition奇异值分解。和特征分解类似,它也是将矩阵分解为更基本的组合乘积,而且SVD更具有普适性,对于矩阵本身的要求很少,基本上所有实数矩阵都可以做SVD分解,而特征分解对于非对称矩阵是无能为力的。

SVD将矩阵表示为三个矩阵的乘积形式:A=UDV⊤A=U D V^{\top}A=UDV⊤

其中A是m x n的矩阵,U是m x m的矩阵,D是m x n的矩阵, V是nxn的矩阵。U和V均是正交矩阵,而D是对角矩阵,其对角元素成为奇异值。

SVD在很多方面有重要的作用,比如在推荐系统里,我们有矩阵A来表示用户对影片的评分,那么SVD可以看做是将其映射到某个隐性特征(例如影片风格)的过程,其中U即为(用户,隐性特征)矩阵,V即为(影片,隐性特征)矩阵,而D就代表了每个隐性特征的重要性,我们如果想压缩存储空间的话可以只选择D的一些较大的对角元素,而相应的选取出U和V的对应行列形成新矩阵,通过压缩后的U’,D’,V’再重构的矩阵A’可以较好的还原矩阵A而没有较大的失真。

svd分解的推导过程:ATAA^{T} AATA为对称正定矩阵,则

​ (ATA)T=AT(AT)T=ATA⇒\left(A^{T} A\right)^{T}=A^{T}\left(A^{T}\right)^{T}=A^{T} A \Rightarrow(ATA)T=AT(AT)T=ATA⇒对称性

​ xT(ATA)x=(xTAT)(Ax)=(Ax)T(Ax)≥0⇒x^{T}\left(A^{T} A\right) x=\left(x^{T} A^{T}\right)(A x)=(A x)^{T}(A x) \geq 0 \RightarrowxT(ATA)x=(xTAT)(Ax)=(Ax)T(Ax)≥0⇒半正定性

假设A为m*n的矩阵,构造一个对称方阵

Am×n因为A=UDV⊤所以(ATA)n×n=VDVT(AAT)m×m=UDUT⇒Am×n=Um×m(λ112λ212⋱)m×nV(n×n)T\begin{array}{l}{A_{m \times n}} \\因为A=U D V^{\top}\\ 所以{\left(A^{T} A\right)_{n \times n}=V D V^{T}} \\ {\left(A A^{T}\right)_{m \times m}=U D U^{T}} \\ {\Rightarrow A_{m \times n}=U_{m \times m}\left(\begin{array}{cc}{\lambda_{1}^{\frac{1}{2}}} & {} &{} \\ {} & {\lambda_{2}^{\frac{1}{2}}} & {} \\ {} & {} &{\ddots}\end{array}\right)_{m \times n} V^{T}_{(n \times n)}}\end{array}Am×n​因为A=UDV⊤所以(ATA)n×n​=VDVT(AAT)m×m​=UDUT⇒Am×n​=Um×m​⎝⎜⎛​λ121​​​λ221​​​⋱​⎠⎟⎞​m×n​V(n×n)T​​

其中λ1\lambda_{1}λ1​为D的对角元素(两个D是不相同的D1为nxn的矩阵,D2为mxm的矩阵,但其非零特征值相同。证明在下边儿) ;λ1\lambda_{1}λ1​为什么可以开根号,因为λ1\lambda_{1}λ1​不可能为负;λ1\lambda_{1}λ1​为什么要开根号,因为ATAA^{T} AATA时,D为两个对角矩阵的乘积

令Vm×mT=(v1,v2,⋯,vm)V^{T} _{m \times m}=\left(v_{1}, v_{2}, \cdots, v_{m}\right)Vm×mT​=(v1​,v2​,⋯,vm​)

Un×nT=(u1,u2,⋯,un)⇒Am×n=λ112u1Tv1+λ212u2Tv2+λ312u3Tv3+⋯\begin{array}{l}{U^{T}_{n \times n}=\left(u_{1}, u_{2}, \cdots, u_{n}\right)} \\ {\Rightarrow A_{m \times n}=\lambda_{1}^{\frac{1}{2}} u_{1}^{T}v_{1}+\lambda_{2}^{\frac{1}{2}} u_{2}^{T} v_{2}+\lambda_{3}^{\frac{1}{2}} u_{3}^{T}v_{3}+\cdots}\end{array}Un×nT​=(u1​,u2​,⋯,un​)⇒Am×n​=λ121​​u1T​v1​+λ221​​u2T​v2​+λ321​​u3T​v3​+⋯​

图像的压缩存储最小需要m+n+1,当压缩存储量为(m+n+1)*K时,误差为

error=1−∑i=1kλi∑i=1min⁡(m,n)λi=1-\frac{\sum_{i=1}^{k} \lambda_{i}}{\sum_{i=1}^{\min (m, n)} \lambda_{i}}=1−∑i=1min(m,n)​λi​∑i=1k​λi​​(K越大,误差越小)

设A,B是n阶矩阵,证明:AB与BA具有相同的特征值。

只需证明:若λ是AB的特征值,则λ也是BA的特征值。分两种情况:
(1)λ≠0。由λ是AB的特征值,存在非零向量x使得ABx=λx。所以BA(Bx)=B(ABx)=B(λx)=λBx,且Bx≠0(否则λx=ABx=0,得λ=0,矛盾)。这说明Bx是BA的对应于特征值λ的特征向量,特别地λ也是BA的特征值。
(2)λ=0。此时存在非零向量x使得ABx=λx=0,所以AB不满秩,知det(AB)=0。从而det(BA)=det(AB)=0,BA不满秩,所以存在非零向量x使得BAx=0=λx。这说明λ=0也是BA的特征值。
证毕。

SVD可用在矩阵压缩(传统网络图片传输是逐行输出,有时候网比较卡,只能看着上半部分图片,慢慢输出整张图片;现代传输比如微信图,刚开始模糊,逐渐变得清晰,即提前对图像进行了SVD分解,可快速知道图片的大概,再慢慢的传图片精细部分) (1)SVD可以用来做图像压缩,或矩阵压缩(2)能够极大的减小算法复杂度,在深度神经网络中有着广泛的应用,提升运算速度

提高运算速度的例子:比如说用矩阵乘以列向量,未压缩前需要进行20000次乘法,压缩后只需进行3000次 (取前十个)

8.SVD分解应用

奇异值分解在数据降维中有较多应用,现举一个图片压缩的例子(代码运行环境:python3+jupyter,使用numpy自带的svd做压缩) 导入的图片可随便选~

#读取图片
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as npimg_eg = mpimg.imread("timg.jpg")
print(img_eg.shape)

#图片大小为(1243, 700, 3)

#奇异值分解
img_temp = img_eg.reshape(1243, 700 * 3)
U,Sigma,VT = np.linalg.svd(img_temp)#我们先将图片变成600×1200,再做奇异值分解。从svd函数中得到的奇异值sigma它是从大到小排列的。
# 取前60个奇异值
sval_nums = 60
img_restruct1 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct1 = img_restruct1.reshape(1243,700,3)# 取前120个奇异值
sval_nums = 120
img_restruct2 = (U[:,0:sval_nums]).dot(np.diag(Sigma[0:sval_nums])).dot(VT[0:sval_nums,:])
img_restruct2 = img_restruct2.reshape(1243,700,3)#打印图片
fig, ax = plt.subplots(1,3,figsize = (24,32))ax[0].imshow(img_eg)
ax[0].set(title = "src")
ax[1].imshow(img_restruct1.astype(np.uint8))
ax[1].set(title = "nums of sigma = 60")
ax[2].imshow(img_restruct2.astype(np.uint8))
ax[2].set(title = "nums of sigma = 120")


左一原图;中间为取前60个奇异值;右一为取前12个奇异值

9.逆矩阵,伪逆矩阵,最小二乘解,最小范数解


x1,x2,⋯,xN,xi∈Rny1,y2,⋯,yN,yi∈R1y1=x11a1+x12a2+⋯+x1nany2=x21a1+x22a2+⋯+x2nan⋮yN=xN1a1+xN2a2+⋯+xNnan\begin{array}{l}{x_{1}, x_{2}, \cdots, x_{N}, x_{i} \in \mathbb{R}^{n}} \\ {y_{1}, y_{2}, \cdots, y_{N}, y_{i} \in \mathbb{R}^{1}} \\ {y_{1}=x_{11} a_{1}+x_{12} a_{2}+\cdots+x_{1 n} a_{n}} \\ {y_{2}=x_{21} a_{1}+x_{22} a_{2}+\cdots+x_{2 n} a_{n}} \\ {\vdots} \\ {y_{N}=x_{N 1} a_{1}+x_{N 2} a_{2}+\cdots+x_{N n} a_{n}}\end{array}x1​,x2​,⋯,xN​,xi​∈Rny1​,y2​,⋯,yN​,yi​∈R1y1​=x11​a1​+x12​a2​+⋯+x1n​an​y2​=x21​a1​+x22​a2​+⋯+x2n​an​⋮yN​=xN1​a1​+xN2​a2​+⋯+xNn​an​​

上式为多元线性回归的表示,a1…an为要计算的参数

(x11x12⋯x1nx21x22⋯x2n⋮⋮⋱⋮xN1xN2⋯xNn)(a1a2⋮an)=(y1y2⋮yN)\left(\begin{array}{cccc}{x_{11}} & {x_{12}} & {\cdots} & {x_{1 n}} \\ {x_{21}} & {x_{22}} & {\cdots} & {x_{2 n}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {x_{N 1}} & {x_{N 2}} & {\cdots} & {x_{N n}}\end{array}\right)\left(\begin{array}{c}{a_{1}} \\ {a_{2}} \\ {\vdots} \\ {a_{n}}\end{array}\right)=\left(\begin{array}{c}{y_{1}} \\ {y_{2}} \\ {\vdots} \\ {y_{N}}\end{array}\right)⎝⎜⎜⎜⎛​x11​x21​⋮xN1​​x12​x22​⋮xN2​​⋯⋯⋱⋯​x1n​x2n​⋮xNn​​⎠⎟⎟⎟⎞​⎝⎜⎜⎜⎛​a1​a2​⋮an​​⎠⎟⎟⎟⎞​=⎝⎜⎜⎜⎛​y1​y2​⋮yN​​⎠⎟⎟⎟⎞​

XN×nan×1=YN×1X_{N \times n} a_{n \times 1}=Y_{N \times 1}XN×n​an×1​=YN×1​

(假设其为方阵)当N=n且XN×nX_{N \times n}XN×n​可逆时(可逆矩阵必须为方阵,并且特征值不为零):a=X−1Ya=X^{-1} Ya=X−1Y

(假设其为一般矩阵)一般情况:N≠n,不一定能求出解,则求其最小范数

min⁡∥Xa−Y∥2=J∂J∂a=XT(Xa−Y)=0\min \|X a-Y\|^{2}=J \quad \frac{\partial J}{\partial a}=X^{T}(X a-Y)=0min∥Xa−Y∥2=J∂a∂J​=XT(Xa−Y)=0

XTXa=XTYX^{T} X a=X^{T} YXTXa=XTY XTXX^{T} XXTX是否可逆?分情况讨论

​ ①N>n时(N为样本个数,n为每一个样本维数)

​ 如N=5,n=3 (XTX)3×3\left(X^{T} X\right)_{3 \times 3}(XTX)3×3​一般是可逆的

a=(XTX)−1XTYa=\left(X^{T} X\right)^{-1} X^{T}Ya=(XTX)−1XTY (XTX)−1XT\left(X^{T} X\right)^{-1} X^{T}(XTX)−1XT(伪逆)

​ ②N<n时

​ 如N=5,n=3 (xTx)5×5\left(x^{T} x\right)_{5 \times 5}(xTx)5×5​

​ 因为样本的秩R(xTx)≤R(x)≤3R\left(x^{T} x\right) \leq R(x) \leq 3R(xTx)≤R(x)≤3

​ 故 xTxx^{T} xxTx不可逆

​ 补充:R(AB)≪R(A)orR(B)\begin{aligned} R(A B) & \ll R(A) \\ & \text {orR}(B) \end{aligned}R(AB)​≪R(A)orR(B)​两个矩阵相乘的秩肯定小于其中任意一个

​ 即当维数比样本个数大时,此矩阵肯定不可逆

​ 此刻为使其可逆,加上一个正则项J=∥xa−Y∥2+λ∥a∥2J=\|x a-Y\|^{2}+\lambda\|a\|^{2}J=∥xa−Y∥2+λ∥a∥2

​ ∂J∂a=xTxa−xTY+λa=0\frac{\partial J}{\partial a}=x^{T} x a-x^{T} Y+\lambda a=0∂a∂J​=xTxa−xTY+λa=0

​ (xTx+λI)a=xTY\left(x^{T} x+\lambda I\right) a=x^{T} Y(xTx+λI)a=xTY(xTx+λIx^{T} x+\lambda IxTx+λI 必为可逆)

​ 为什么可逆?(试探向量a一定非零)

​ 1.aT(xTx)a=(xa)T(xa)≥0→λi≥0a^{T}\left(x^{T} x\right) a=(x a)^{T}(x a) \geq 0 \rightarrow \lambda_{i} \geq 0aT(xTx)a=(xa)T(xa)≥0→λi​≥0

​ ∣xTx∣\left|x^{T} x\right|∣∣​xTx∣∣​仍可能为0,不一定可逆

​ 2.aT(xTx+λI)a=(xa)T(xa)+λaTa>0→λi>0a^{T}\left(x^{T} x+\lambda I\right) a=(x a)^{T}(x a)+\lambda a^{T} a>0 \rightarrow \lambda_{i}>0aT(xTx+λI)a=(xa)T(xa)+λaTa>0→λi​>0

​ ∣xTx+λI∣>0\left|x^{T} x+\lambda I\right|>0∣∣​xTx+λI∣∣​>0恒成立,一定可逆

所以a=(xTx+λI)−1xTYa=\left(x^{T} x+\lambda I\right)^{-1} x^{T} Ya=(xTx+λI)−1xTY

xTxx^{T} xxTx为对称矩阵

此种回归方式称为岭回归

xTx=p−1(λ1⋱λn)p∣xTx∣=λ1λ2⋯λn\begin{array}{l}{x^{T} x=p^{-1}\left(\begin{array}{ccc}{\lambda_{1}} & {} & {} \\ {} & {\ddots} & {} \\ {} & {} & {\lambda_{n}}\end{array}\right) p} \\ {\left|x^{T} x\right|=\lambda_{1} \lambda_{2} \cdots \lambda_{n}}\end{array}xTx=p−1⎝⎛​λ1​​⋱​λn​​⎠⎞​p∣∣​xTx∣∣​=λ1​λ2​⋯λn​​

10.主成分分析 PCA

关键词:单位范数、L2范数、最优化问题、向量微积分、Frobenius范数……

  • **何为降维:**降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。

  • 降维具有如下一些优点:

    1. 使得数据集更易使用。
    2. 降低算法的计算开销。
    3. 去除噪声。
    4. 使得结果容易理解。
      降维的算法有很多,比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。
  • 何为PCA:

    PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法。大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题,在一个几万或者几百万甚至更大的数据库中查询一幅相近的图像。这时,我们通常的方法是对图像库中的图片提取响应的特征,如颜色,纹理,sift,surf,vlad等等特征,然后将其保存,建立相应的数据索引,然后对要查询的图像提取相应的特征,与数据库中的图像特征对比,找出与之最近的图片。这里,如果我们为了提高查询的准确率,通常会提取一些较为复杂的特征,如sift,surf等,一幅图像有很多个这种特征点,每个特征点又有一个相应的描述该特征点的128维的向量,设想如果一幅图像有300个这种特征点,那么该幅图像就有300*vector(128维)个,如果我们数据库中有一百万张图片,这个存储量是相当大的,建立索引也很耗时,如果我们对每个向量进行PCA处理,将其降维为64维,将节省很大一部分存储空间。

  • 用图表来解释一下:

    每个点用十字表示。A点需要x,y两个坐标来表示,假设A在向量u上面的投影点为A‘,则A’仅仅需要一个参数就能表示,就是OA‘的长度(即A’在u上的坐标),我们就想着用A‘来替换A,这样N个点(原来要2*N个参数),现在只需要(N+2)个参数(u也需要两个参数)

但是此时就带来了误差,如AA’和BB’,所以我们要能够找到这样一个方向u,使得所有原始点与投影点之间的误差最小。即最小重构误差。

  • 样本点中心化

    在做PCA时首先要做样本点中心化,相比来说,上图左边的误差更小。也就是说需要提前计算样本点x,y的均值,再将每个样本点减去其均值,得到其中心化后的坐标

    假设x是一个样本点,u为一个单位方向向量,将样本点投影向u使误差e最小(两个向量做点积,即一个向量的转置乘以另一个向量)损失J求e向量的模长(xTux^{T} uxTu为实数)

e⃗=x⃗−prjx⃗=x⃗−⟨x⃗,u⃗⟩u⃗\begin{aligned} \vec{e} &=\vec{x}-p_{r j} \vec{x} \\ &=\vec{x}-\langle\vec{x}, \vec{u}\rangle \vec{u} \end{aligned}e​=x−prj​x=x−⟨x,u⟩u​

​ =x−(xTu)u;x,u∈Rn=x-\left(x^{T} u\right) u ; x, u \in \mathbb{R}^{n}=x−(xTu)u;x,u∈Rn 且∥u∥=1,uTu=1\|u\|=1, u^{T} u=1∥u∥=1,uTu=1

J=∥e⃗∥2=eTe=[x−(xTu)u]T[x−(xTu)u]=[xT−(xTu)uT][x−(xTu)u]=xTx−(xTu)(xTu)−(xTu)(uTx)+(xTu)2uTu=∥x∥2−(xTu)2−(xTu)2+(xTu)2=∥x∥2−(xTu)2\begin{array}{l}{J=\|\vec{e}\|^{2}=e^{T} e=\left[x-\left(x^{T} u\right) u\right]^{T}\left[x-\left(x^{T} u\right) u\right]} \\ {=\left[x^{T}-\left(x^{T} u\right) u^{T}\right]\left[x-\left(x^{T} u\right) u\right]} \\ {=x^{T} x-\left(x^{T} u\right)\left(x^{T} u\right)-\left(x^{T} u\right)\left(u^{T} x\right)+\left(x^{T} u\right)^{2} u^{T} u} \\ {=\|x\|^{2}-\left(x^{T} u\right)^{2}-\left(x^{T} u\right)^{2}+\left(x^{T} u\right)^{2}} \\ {=\|x\|^{2}-\left(x^{T} u\right)^{2}}\end{array}J=∥e∥2=eTe=[x−(xTu)u]T[x−(xTu)u]=[xT−(xTu)uT][x−(xTu)u]=xTx−(xTu)(xTu)−(xTu)(uTx)+(xTu)2uTu=∥x∥2−(xTu)2−(xTu)2+(xTu)2=∥x∥2−(xTu)2​

为使J最小,则(xTu)2(x^{T} u)^{2}(xTu)2必须大

max⁡(xTu)2⇔max⁡(xTu)(xTu)⇔max⁡(uTx)(xTu)⇔max⁡uT(xxT)u\begin{array}{l}{\max \left(x^{T} u\right)^{2}} \\ {\Leftrightarrow \max \left(x^{T} u\right)\left(x^{T} u\right) \Leftrightarrow \max \left(u^{T} x\right)\left(x^{T} u\right)} \\ {\Leftrightarrow \max u^{T}\left(x x^{T}\right) u}\end{array}max(xTu)2⇔max(xTu)(xTu)⇔max(uTx)(xTu)⇔maxuT(xxT)u​

上式为一个样本,若共有N个样本

max⁡∑i=1NuT(xixiT)u=uT(∑i=1NxixiT)u,且∥u∥=1\max \sum_{i=1}^{N} u^{T}\left(x_{i} x_{i}^{T}\right) u=u^{T}\left(\sum_{i=1}^{N} x_{i} x_{i}^{T}\right) u, 且\|u\|=1max∑i=1N​uT(xi​xiT​)u=uT(∑i=1N​xi​xiT​)u,且∥u∥=1

令∑i=1NxixiT\sum_{i=1}^{N} x_{i} x_{i}^{T}∑i=1N​xi​xiT​为X,则原式为max⁡uT(X)u,st:∥u∥=1\max u^{T}(X) u, s t:\|u\|=1maxuT(X)u,st:∥u∥=1

构造拉格朗日乘子L(u,λ)=uTXu+λ(1−uTu)L(u, \lambda)=u^{T} X u+\lambda\left(1-u^{T} u\right)L(u,λ)=uTXu+λ(1−uTu) (uTu=1u^{T} u=1uTu=1)

∂L∂u=0⇒Xu−λu=0Xu=λu\begin{array}{c}{\frac{\partial L}{\partial u}=0 \Rightarrow X u-\lambda u=0} \\ {X u=\lambda u}\end{array}∂u∂L​=0⇒Xu−λu=0Xu=λu​

∂L∂λ=0⇒uTu=1\frac{\partial L}{\partial \lambda}=0 \Rightarrow u^{T} u=1∂λ∂L​=0⇒uTu=1

X为对称正定矩阵————————此处只涉及PCA的压缩思想及损失函数,其他PCA问题将在后面讲解。

11.PCA应用

1.使用PCA降维

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat#2D-->1D
mat = loadmat('/Users/apple/Downloads/ex7data1.mat')
X = mat['X']
print(X.shape)   #(50, 2)
plt.scatter(X[:,0], X[:,1], facecolors='none', edgecolors='b')#X 均值归一化
def featureNormal(X):means = X.mean(axis=0)stds = X.std(axis=0, ddof=1)X_norm = (X - means)/stdsreturn X_norm, means, stds#PCA
def pca(X):sigma = (X.T@X)/len(X)U, S, V = np.linalg.svd(sigma)return U, S, VX_norm, means, stds = featureNormal(X)
U, S, V = pca(X_norm)print(U[:,0])plt.figure(figsize=(7, 5))
plt.scatter(X[:,0], X[:,1], facecolors='none', edgecolors='b')
plt.plot([means[0], means[0]+1.5*S[0]*U[0,0]],[means[1], means[1]+1.5*S[0]*U[0,1]],c='r', linewidth=3, label='First Principal Component')plt.plot([means[0], means[0]+1.5*S[1]*U[1,0]],[means[1], means[1]+1.5*S[1]*U[1,1]],c='g', linewidth=3, label='Second Principal Component')
plt.grid()
plt.axis("equal")
plt.legend()      #Dimensionality Reduction with PCAdef projectData(X, U, K):Z = X @ U[:,:K]return ZZ = projectData(X_norm, U, 1)
Z[0]
#print(Z[0]) #[ 1.48127391]#Reconstructing an approximation of the data 重建数据
def recoverData(Z, U, K):X_rec = Z @ U[:,:K].Treturn X_recX_rec = recoverData(Z, U, 1)
X_rec[0]
#print(X_rec[0])     #[-1.04741883 -1.04741883]        #Visualizing the projections
plt.figure(figsize=(7,5))
plt.axis("equal")
plot = plt.scatter(X_norm[:,0], X_norm[:,1], s=30, facecolors='none',edgecolors='b',label='Original Data Points')plot = plt.scatter(X_rec[:,0], X_rec[:,1], s=30, facecolors='none',edgecolors='r',label='PCA Reduced Data Points')plt.title("Example Dataset: Reduced Dimension Points Shown", fontsize=14)
plt.xlabel('x1 [Feature Normalized]',fontsize=14)
plt.ylabel('x2 [Feature Normalized]', fontsize=14)
plt.grid(True)for x in range(X_norm.shape[0]):plt.plot([X_norm[x,0], X_rec[x,0]],[X_norm[x,1], X_rec[x,1]], 'k--')#输入第一项全是X坐标 第二项全是y坐标
plt.legend()

(ex7data1.mat下载地址:https://github.com/loserChen/Coursera-MachineLearning/blob/master/machine-learning-ex7/ex7/ex7data1.mat)


2.PCA应用 Face Image Dataset 人脸识别图像上运行PCA 实践中使用PCA减少维度

import numpy as np
import pandas as pd
from scipy.io import loadmat
import matplotlib.pyplot as pltmat = loadmat('/Users/apple/Downloads/ex7faces.mat')
X = mat['X']
print(X.shape)  #(5000, 1024)def displayData(X, row, col):fig, axs = plt.subplots(row, col, figsize=(8,8))for r in range(row):for c in range(col):axs[r][c].imshow(X[r*col + c].reshape(32,32).T, cmap = 'Greys_r')axs[r][c].set_xticks([])axs[r][c].set_yticks([])displayData(X, 10, 10)def featureNormalize(X):means = X.mean(axis=0)stds = X.std(axis=0, ddof=1)X_norm = (X - means) / stdsreturn X_norm, means, stdsdef pca(X):sigma = (X.T @ X) / len(X)U, S, V = np.linalg.svd(sigma)return U, S, V    X_norm, means, stds = featureNormalize(X)
U, S, V = pca(X_norm)
#print(U.shape, S.shape)  #(1024, 1024) (1024,)displayData(U[:,:36].T, 6, 6)#Dimensionality Reductiondef projectData(X, U, K):Z = X @ U[:,:K]return Zz = projectData(X_norm, U, K=36)
def recoverData(Z, U, K):X_rec = Z @ U[:,:K].Treturn X_rec
X_rec = recoverData(z, U, K=36)
displayData(X_rec, 10, 10)

(faces.mat下载地址:https://github.com/loserChen/Coursera-MachineLearning/blob/master/machine-learning-ex7/ex7/ex7faces.mat)


12.数学例题

1.掌握对称矩阵的对角化分解的计算过程(例题:同济大学线性代数第五版p125的例12)


2.SVD分解计算过程。假设矩阵A定义为:

​ A=(011110)\mathbf{A}=\left(\begin{array}{ll}{0} & {1} \\ {1} & {1} \\ {1} & {0}\end{array}\right)A=⎝⎛​011​110​⎠⎞​

​ 我们首先求出ATAA^{T} AATA和AATAA^{T}AAT ATA=(011110)(011110)=(2112)AAT=(011110)(011110)=(110121011)\begin{aligned} \mathbf{A}^{\mathrm{T}} \mathbf{A}=\left(\begin{array}{lll}{0} & {1} & {1} \\ {1} & {1} & {0}\end{array}\right)\left(\begin{array}{ll}{0} & {1} \\ {1} & {1} \\ {1} & {0}\end{array}\right)=\left(\begin{array}{ll}{2} & {1} \\ {1} & {2}\end{array}\right) \\ \mathbf{A A}^{\mathrm{T}}=\left(\begin{array}{ll}{0} & {1} \\ {1} & {1} \\ {1} & {0}\end{array}\right)\left(\begin{array}{lll}{0} & {1} & {1} \\ {1} & {1} & {0}\end{array}\right)=\left(\begin{array}{lll}{1} & {1} & {0} \\ {1} & {2} & {1} \\ {0} & {1} & {1}\end{array}\right) \end{aligned}ATA=(01​11​10​)⎝⎛​011​110​⎠⎞​=(21​12​)AAT=⎝⎛​011​110​⎠⎞​(01​11​10​)=⎝⎛​110​121​011​⎠⎞​​

​  进而求出ATAA^{T} AATA的特征值和特征向量:

​ λ1=3;v1=(1/21/2);λ2=1;v2=(−1/21/2)\lambda_{1}=3 ; v_{1}=\left(\begin{array}{c}{1 / \sqrt{2}} \\ {1 / \sqrt{2}}\end{array}\right) ; \lambda_{2}=1 ; v_{2}=\left(\begin{array}{c}{-1 / \sqrt{2}} \\ {1 / \sqrt{2}}\end{array}\right)λ1​=3;v1​=(1/2​1/2​​);λ2​=1;v2​=(−1/2​1/2​​)

​ 接着求$AA^{T} $ 的特征值和特征向量:

​ λ1=3;u1=(1/62/61/6);λ2=1;u2=(1/20−1/2);λ3=0;u3=(1/3−1/31/3)\lambda_{1}=3 ; u_{1}=\left(\begin{array}{c}{1 / \sqrt{6}} \\ {2 / \sqrt{6}} \\ {1 / \sqrt{6}}\end{array}\right) ; \lambda_{2}=1 ; u_{2}=\left(\begin{array}{c}{1 / \sqrt{2}} \\ {0} \\ {-1 / \sqrt{2}}\end{array}\right) ; \lambda_{3}=0 ; u_{3}=\left(\begin{array}{c}{1 / \sqrt{3}} \\ {-1 / \sqrt{3}} \\ {1 / \sqrt{3}}\end{array}\right)λ1​=3;u1​=⎝⎛​1/6​2/6​1/6​​⎠⎞​;λ2​=1;u2​=⎝⎛​1/2​0−1/2​​⎠⎞​;λ3​=0;u3​=⎝⎛​1/3​−1/3​1/3​​⎠⎞​

​ 利用Avi=σiui,i=1,2A v_{i}=\sigma_{i} u_{i}, i=1,2Avi​=σi​ui​,i=1,2求奇异值:

​ (011110)(1/21/2)=σ1(1/62/61/6)⇒σ1=3(011110)(−1/21/2)=σ2(1/20−1/2)⇒σ2=1\begin{array}{l}{\left(\begin{array}{ll}{0} & {1} \\ {1} & {1} \\ {1} & {0}\end{array}\right)\left(\begin{array}{c}{1 / \sqrt{2}} \\ {1 / \sqrt{2}}\end{array}\right)=\sigma_{1}\left(\begin{array}{c}{1 / \sqrt{6}} \\ {2 / \sqrt{6}} \\ {1 / \sqrt{6}}\end{array}\right) \Rightarrow \sigma_{1}=\sqrt{3}} \\ {\left(\begin{array}{ll}{0} & {1} \\ {1} & {1} \\ {1} & {0}\end{array}\right)\left(\begin{array}{c}{-1 / \sqrt{2}} \\ {1 / \sqrt{2}}\end{array}\right)=\sigma_{2}\left(\begin{array}{c}{1 / \sqrt{2}} \\ {0} \\ {-1 / \sqrt{2}}\end{array}\right) \Rightarrow \sigma_{2}=1}\end{array}⎝⎛​011​110​⎠⎞​(1/2​1/2​​)=σ1​⎝⎛​1/6​2/6​1/6​​⎠⎞​⇒σ1​=3​⎝⎛​011​110​⎠⎞​(−1/2​1/2​​)=σ2​⎝⎛​1/2​0−1/2​​⎠⎞​⇒σ2​=1​

​ 当然,我们也可以用σi=λi\sigma_{i}=\sqrt{\lambda_{i}}σi​=λi​​直接求出奇异值为3\sqrt{3}3​和1.

​ 最终得到A的奇异值分解为:

​ A=UΣVT=(1/61/21/32/60−1/31/6−1/21/3)(300100)(1/21/2−1/21/2)A=U \Sigma V^{T}=\left(\begin{array}{ccc}{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{array}\right)\left(\begin{array}{cc}{\sqrt{3}} & {0} \\ {0} & {1} \\ {0} & {0}\end{array}\right)\left(\begin{array}{cc}{1 / \sqrt{2}} & {1 / \sqrt{2}} \\ {-1 / \sqrt{2}} & {1 / \sqrt{2}}\end{array}\right)A=UΣVT=⎝⎛​1/6​2/6​1/6​​1/2​0−1/2​​1/3​−1/3​1/3​​⎠⎞​⎝⎛​3​00​010​⎠⎞​(1/2​−1/2​​1/2​1/2​​)

3.PCA计算过程

部分内容来源于网络,在这儿仅做整理,方便自己之后回顾

深度学习 DEEP LEARNING 1-2章相关推荐

  1. 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,近期研究了机器学习中一些深度学习的相关知识,本文给出一些非常实用的资料和心得. Key W ...

  2. 机器学习——深度学习(Deep Learning)经典资料

    Deep Learning是机器学习中一个非常接近AI的领域,其动机在于建立.模拟人脑进行分析学习的神经网络,最近研究了机器学习中一些深度学习的相关知识,本文给出一些很有用的资料和心得. Key Wo ...

  3. 机器学习(Machine Learning)、深度学习(Deep Learning)、NLP面试中常考到的知识点和代码实现

    网址:https://github.com/NLP-LOVE/ML-NLP 此项目是机器学习(Machine Learning).深度学习(Deep Learning).NLP面试中常考到的知识点和代 ...

  4. 机器学习(Machine Learning)深度学习(Deep Learning)资料(Chapter 2)

    机器学习(Machine Learning)&深度学习(Deep Learning)资料(Chapter 2) - tony的专栏 - 博客频道 - CSDN.NET 注:机器学习资料篇目一共 ...

  5. 【深度学习Deep Learning】资料大全

    感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习, ...

  6. 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总

    本文来源:https://github.com/ty4z2008/Qix/blob/master/dl.md 机器学习(Machine Learning)&深度学习(Deep Learning ...

  7. 深度学习Deep Learning 资料大全

    转自:http://www.cnblogs.com/charlotte77/ [深度学习Deep Learning]资料大全 最近在学深度学习相关的东西,在网上搜集到了一些不错的资料,现在汇总一下: ...

  8. 机器学习(Machine Learning)深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

  9. 机器学习(Machine Learning)深度学习(Deep Learning)资料集合

    机器学习(Machine Learning)&深度学习(Deep Learning)资料 原文链接:https://github.com/ty4z2008/Qix/blob/master/dl ...

  10. 机器学习(Machine Learning)——深度学习(Deep Learning)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/abcjennifer/article/ ...

最新文章

  1. 基于Bootstrap里面的Button dropdown打造自定义select
  2. 《系统集成项目管理工程师》必背100个知识点-78配置项的版本控制
  3. log4net 记录日志到sqlserver
  4. android文件管理器,ES文件浏览器(com.estrongs.android.pop) - 4.2.4.6.1 - 应用 - 酷安
  5. SQL Server 获取所有表和数据的批量操作
  6. 查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)
  7. 【奇淫巧技】打狗棒法---过安全狗注入手法
  8. 动画|经典的归并排序究竟怎么玩儿?
  9. ASP.NET配置文件Web.config 详细解释
  10. Tomcat发布自己的一个web网站
  11. ASC19 T4 CESM
  12. plot画图颜色设置
  13. 拆长虹iho3000_(CA版)四川长虹iho-3000t晶晨s905l-b刷全网通系统教程可救砖头
  14. 移动端购物车数据重新编译后数据消失
  15. GitHub使用(IDEA)
  16. mysql数据库备份与导入
  17. ubuntu16.04 安装VScode
  18. 图灵机模拟程序功能设计
  19. 用于解决listview嵌套GridView时显示不全的问题。
  20. 网瘾少年转行软件测试,月薪20k? 叛逆少年终归成长...

热门文章

  1. 重置linux红帽登录密码,红帽(RHEL)Linux 忘记root密码后重置密码
  2. mysql 登录 无密码_重置mysql的密码/无密码登录mysql
  3. 转录组测序分析项目及方法汇总(更新中)
  4. JavaScript的API文档自动生成工具jsdoc
  5. 树的专项练习(补充)
  6. 响应式布局基础知识详解
  7. PyTorch-1.10(十三)--torch.optim基本用法
  8. 【网络教程】苹果MACCMS10怎样设置伪静态
  9. 计算机系统时间无法更改,Win7电脑无法修改系统时间如何解决?
  10. EBS之JTF_Grid 开发总结