简 介: 记 ∇Xf\nabla _X f∇X​f 是矩阵函数的导数,那么可以利用微分-导数方程 dy=Tr(∇XfT⋅dX)dy = Tr\left( {\nabla _X f^T \cdot dX} \right)dy=Tr(∇X​fT⋅dX) 计算 ∇Xf\nabla _X f∇X​f 。

关键词导数微分向量矩阵

#mermaid-svg-WclLLbJq7cChAO6R {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WclLLbJq7cChAO6R .error-icon{fill:#552222;}#mermaid-svg-WclLLbJq7cChAO6R .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WclLLbJq7cChAO6R .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WclLLbJq7cChAO6R .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WclLLbJq7cChAO6R .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WclLLbJq7cChAO6R .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WclLLbJq7cChAO6R .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WclLLbJq7cChAO6R .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WclLLbJq7cChAO6R .marker.cross{stroke:#333333;}#mermaid-svg-WclLLbJq7cChAO6R svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WclLLbJq7cChAO6R .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WclLLbJq7cChAO6R .cluster-label text{fill:#333;}#mermaid-svg-WclLLbJq7cChAO6R .cluster-label span{color:#333;}#mermaid-svg-WclLLbJq7cChAO6R .label text,#mermaid-svg-WclLLbJq7cChAO6R span{fill:#333;color:#333;}#mermaid-svg-WclLLbJq7cChAO6R .node rect,#mermaid-svg-WclLLbJq7cChAO6R .node circle,#mermaid-svg-WclLLbJq7cChAO6R .node ellipse,#mermaid-svg-WclLLbJq7cChAO6R .node polygon,#mermaid-svg-WclLLbJq7cChAO6R .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WclLLbJq7cChAO6R .node .label{text-align:center;}#mermaid-svg-WclLLbJq7cChAO6R .node.clickable{cursor:pointer;}#mermaid-svg-WclLLbJq7cChAO6R .arrowheadPath{fill:#333333;}#mermaid-svg-WclLLbJq7cChAO6R .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WclLLbJq7cChAO6R .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WclLLbJq7cChAO6R .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WclLLbJq7cChAO6R .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WclLLbJq7cChAO6R .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WclLLbJq7cChAO6R .cluster text{fill:#333;}#mermaid-svg-WclLLbJq7cChAO6R .cluster span{color:#333;}#mermaid-svg-WclLLbJq7cChAO6R div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WclLLbJq7cChAO6R :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

标量函数求导
目 录
Contents
准备工作
单个变量函数
的微分和导数
向量函数的
微分和导数
通过微分-导数
方程计算导数
矩阵变量函数
的微分与导数
小 结

  作为机器学习的基础,微积分+线性代数是用于描述网络运行和更新的重要工具。本文整理自网络 Andersen Ang Matrix derivative on scalar function of matrix variable 课件。

§01 标量函数求导


1.1 准备工作

  本文中所有函数 fff 都是指以下形式:f:Ω→Rf:\Omega \to {\bf{R}}f:Ω→R
  也就是:

  • fff 将定义域 Ω\OmegaΩ 中的元素映射到实轴上 R{\bf{R}}R 的元素;
  • 函数 fff 的输出为标量;

  本文中关于函数 fff 的导数是针对矩阵变量。

  • 关于向量变量求导是对矩阵变量求导的特例。

  关于矩阵求导具有很多方面应用,比如给出计算导数的统一系统方法。

  下面首先考虑简单的情况:函数 fff 关于标量和向量求导。

1.2 单个变量函数的微分和导数

  令: y=f(x)y = f\left( x \right)y=f(x) , yyy 关于函数变量 xxx 的导数定义为:dydx=df(x)dx=f′(x){{dy} \over {dx}} = {{df\left( x \right)} \over {dx}} = f'\left( x \right)dxdy​=dxdf(x)​=f′(x)
  关于 yyy 的微分为: dydydy 。

  微分与导数之间的关系:dy=f′(x)dxdy = f'\left( x \right)dxdy=f′(x)dx
  扼要重述:

  • 微分: 变量的无穷小的变化;
  • 导数: 函数 fff 关于变量的变化率;

1.3 向量函数的微分和导数

1.3.1 三个变量

  令: y=f(x1,x2,x3)y = f\left( {x_1 ,x_2 ,x_3 } \right)y=f(x1​,x2​,x3​) , yyy 的全微分为:dy=∂f∂x1dx1+∂f∂x2dx2+∂f∂x3dx3dy = {{\partial f} \over {\partial x_1 }}dx_1 + {{\partial f} \over {\partial x_2 }}dx_2 + {{\partial f} \over {\partial x_3 }}dx_3dy=∂x1​∂f​dx1​+∂x2​∂f​dx2​+∂x3​∂f​dx3​

  • 含义: 函数 fff 全部变化(这里记作 dydydy )是所有变量引起变化之和;
  • 变化量: 对于输出为标量的函数,它的变化量也是标量;
  • 变化量之和: 是将所有变量的变化量( dxidx_idxi​ )乘以函数 fff 关于改变量的导数( ∂f∂xi{{\partial f} \over {\partial x_i }}∂xi​∂f​ )。

  令: dx=[dx1,dx2,dx3]Tdx = \left[ {dx_1 ,dx_2 ,dx_3 } \right]^Tdx=[dx1​,dx2​,dx3​]T , ∇xf=[∂f∂x1,∂f∂x2,∂f∂x3]T\nabla _x f = \left[ {{{\partial f} \over {\partial x_1 }},{{\partial f} \over {\partial x_2 }},{{\partial f} \over {\partial x_3 }}} \right]^T∇x​f=[∂x1​∂f​,∂x2​∂f​,∂x3​∂f​]T ,那么:dy=⟨∇xf,dx⟩=∇xfT⋅dxdy = \left\langle {\nabla _x f,dx} \right\rangle = \nabla _x f^T \cdot dxdy=⟨∇x​f,dx⟩=∇x​fT⋅dx

  其中 ⟨⋅⟩\left\langle \cdot \right\rangle⟨⋅⟩ 表示内积。上面的方式也告诉我们,如果已知 dydydy 和 dxdxdx 相关信息,是可以计算出 ∇xf\nabla _x f∇x​f 信息的。

1.3.2 任意多个变量

  令 y=f(x1,⋯,xn)=f(x)y = f\left( {x_1 , \cdots ,x_n } \right) = f\left( x \right)y=f(x1​,⋯,xn​)=f(x) 。这个函数带有 nnn 个变量,或者变量为向量: x=[x1,⋯xn]Tx = \left[ {x_1 , \cdots x_n } \right]^Tx=[x1​,⋯xn​]T 。

  函数 yyy 的(全)微分为:dy=∑in∂f∂xidxidy = \sum\limits_i^n {{{\partial f} \over {\partial x_i }}dx_i }dy=i∑n​∂xi​∂f​dxi​
  微分-导数方程为:dy=⟨∇xf,dx⟩=∇xfT⋅dxdy = \left\langle {\nabla _x f,dx} \right\rangle = \nabla _x f^T \cdot dxdy=⟨∇x​f,dx⟩=∇x​fT⋅dx
其中:

  • dx=[dx1,⋯,dxn]Tdx = \left[ {dx_1 , \cdots ,dx_n } \right]^Tdx=[dx1​,⋯,dxn​]T
  • ∇xf=[∂f∂x1,⋯,∂f∂xn]T\nabla _x f = \left[ {{{\partial f} \over {\partial x_1 }}, \cdots ,{{\partial f} \over {\partial x_n }}} \right]^T∇x​f=[∂x1​∂f​,⋯,∂xn​∂f​]T

  微分-导数方程是变量为向量函数导数重要关系。

1.4 通过微分-导数方程计算导数

1.4.1 举例

寻找方程 y=f(x)=∥Ax−b∥22y = f\left( x \right) = \left\| {Ax - b} \right\|_2^2y=f(x)=∥Ax−b∥22​ 关于向量变量 xxx 的梯度。其中, AAA 是常系数矩阵; bbb 是常系数向量。

  我们知道 ∇xf(x)=2AT(Ax−b)\nabla _x f\left( x \right) = 2A^T \left( {Ax - b} \right)∇x​f(x)=2AT(Ax−b) ,下面让我们看看如何通过 dy=⟨∇xf,dx⟩=∇xfT⋅dxdy = \left\langle {\nabla _x f,dx} \right\rangle = \nabla _x f^T \cdot dxdy=⟨∇x​f,dx⟩=∇x​fT⋅dx 推导出这个导数公示。

  下面给出了微分基本公示:dc=0dc = 0dc=0dXY=(dX)⋅Y+X⋅dYdXY = \left( {dX} \right) \cdot Y + X \cdot dYdXY=(dX)⋅Y+X⋅dYdxT=(dx)Tdx^T = \left( {dx} \right)^TdxT=(dx)T
  其中: ccc 是常量; X,YX,YX,Y 是两个数学对象(标量,向量,矩阵等)。

1.4.2 求解步骤

  • 将方程展开: y=xTAT⋅Ax−2bTAx+bTby = x^T A^T \cdot Ax - 2b^T Ax + b^T by=xTAT⋅Ax−2bTAx+bTb
  • 求微分: dy=dxTAT⋅Ax−2dbTAx+dbTbdy = dx^T A^T \cdot Ax - 2db^T Ax + db^T bdy=dxTAT⋅Ax−2dbTAx+dbTb

  根据: dbTb=0db^T b = 0dbTb=0 ,可知:

  根据微分-导数方程: dy=∇xfT⋅dxdy = \nabla _x f^T \cdot dxdy=∇x​fT⋅dx ,我们可知 2(xTAT−bT)A=∇xfT2\left( {x^T A^T - b^T } \right)A = \nabla _x f^T2(xTAT−bT)A=∇x​fT ,所以∇xf=2AT(Ax−b)\nabla _x f = 2A^T \left( {Ax - b} \right)∇x​f=2AT(Ax−b)

1.5 矩阵变量函数的微分与导数

1.5.1 微分-导数方程

  令 y=f(X)y = f\left( X \right)y=f(X) ,其中 XXX 是 m,nm,nm,n 矩阵,关于 yyy 的(全)微分是:dy=∑im∑jn∂f∂XijdXijdy = \sum\limits_i^m {\sum\limits_j^n {{{\partial f} \over {\partial X_{ij} }}dX_{ij} } }dy=i∑m​j∑n​∂Xij​∂f​dXij​

  • dXdXdX 表示所有微分 dXijdX_{ij}dXij​ 组成的矩阵;
      也就是 dX=[dXij]dX = \left[ {dX_{ij} } \right]dX=[dXij​] 是一个 m,nm,nm,n 的矩阵,其中 (i,j)\left( {i,j} \right)(i,j) 元素就是 dXijdX_{ij}dXij​ 。
  • ∇xf\nabla _x f∇x​f 是函数 fff 关于 XXX 的导数(梯度)。
      即 ∇xf\nabla _x f∇x​f 是一个 m×nm \times nm×n 的矩阵,其中 (i,j)\left( {i,j} \right)(i,j) 元素是 ∂f∂Xij{{\partial f} \over {\partial X_{ij} }}∂Xij​∂f​ 。

  利用相同的逻辑, dy=⟨∇xf,dx⟩dy = \left\langle {\nabla _x f,dx} \right\rangledy=⟨∇x​f,dx⟩ 是针对向量的,我们记: dy=⟨∇Xf,dX⟩dy = \left\langle {\nabla _X f,dX} \right\rangledy=⟨∇X​f,dX⟩ 是面向矩阵的,其中 ⟨,⟩\left\langle , \right\rangle⟨,⟩ 是矩阵的内积。

1.5.2 矩阵的内积

  在微分-导数方程 dy=⟨∇Xf,dX⟩dy = \left\langle {\nabla _X f,dX} \right\rangledy=⟨∇X​f,dX⟩ 中,表示矩阵内积的关键是矩阵操作:dy=Tr(∇Xf⋅dX)dy = Tr\left( {\nabla _X f \cdot dX} \right)dy=Tr(∇X​f⋅dX)

  上面公示可以通过矩阵的定义得以证明: TrATB=∑ijAijBijTrA^T B = \sum\limits_{ij}^{} {A_{ij} B_{ij} }TrATB=ij∑​Aij​Bij​

  因此dy=∑im∑jn∂f∂XijdXij=Tr(∇XfT⋅dX)dy = \sum\limits_i^m {\sum\limits_j^n {{{\partial f} \over {\partial X_{ij} }}dX_{ij} } } = Tr\left( {\nabla _X f^T \cdot dX} \right)dy=i∑m​j∑n​∂Xij​∂f​dXij​=Tr(∇X​fT⋅dX)

1.5.3 利用微分-导数方程求解导数

  仿照前面变量是向量的情况,我们有:
d(XY)=(dX)Y+X(dY)d\left( {XY} \right) = \left( {dX} \right)Y + X\left( {dY} \right)d(XY)=(dX)Y+X(dY)d(XT)=(dX)Td\left( {X^T } \right) = \left( {dX} \right)^Td(XT)=(dX)TdTrX=Tr(dX)dTrX = Tr\left( {dX} \right)dTrX=Tr(dX)dX−1=−X−1(dX)X−1dX^{ - 1} = - X^{ - 1} \left( {dX} \right)X^{ - 1}dX−1=−X−1(dX)X−1

  关于上面最后一个恒等式进行证明。考虑 XX−1=IXX^{ - 1} = IXX−1=I 。两边同时求微分:dXX−1=dI=0dXX^{ - 1} = dI = 0dXX−1=dI=0
  根据 dXX−1=(dX)X−1+X(dX−1)dXX^{ - 1} = \left( {dX} \right)X^{ - 1} + X\left( {dX^{ - 1} } \right)dXX−1=(dX)X−1+X(dX−1) ,所以:(dX)X−1+X(dX−1)=0\left( {dX} \right)X^{ - 1} + X\left( {dX^{ - 1} } \right) = 0(dX)X−1+X(dX−1)=0很快就可以得到上面最后一个公示的结论。

  在 Matrix Cookbook 中可以找到关于微分的更多的公示。

1.5.4 举例1

Matrix Cookbook eq.101

  假设 A,BA,BA,B 是常系数局转, y=Tr(AXB)y = Tr\left( {AXB} \right)y=Tr(AXB) ,求 ∇Xf(X)\nabla _X f\left( X \right)∇X​f(X) 。

  求解步骤:

  • 求微分, dy=dTr(AXB)=Tr(dAXB)dy = dTr\left( {AXB} \right) = Tr\left( {dAXB} \right)dy=dTr(AXB)=Tr(dAXB)
  • dAXB=(dA)XB+A(dX)B+AX(dB)dAXB = \left( {dA} \right)XB + A\left( {dX} \right)B + AX\left( {dB} \right)dAXB=(dA)XB+A(dX)B+AX(dB)
      因为 A,BA,BA,B 是常量,所以 dA,dBdA,dBdA,dB 是0.因此 dy=Tr[A(dX)B]dy = Tr\left[ {A\left( {dX} \right)B} \right]dy=Tr[A(dX)B] 。
  • 利用特性: Tr(PQ)=Tr(QP)Tr\left( {PQ} \right) = Tr\left( {QP} \right)Tr(PQ)=Tr(QP) ,令 P=AdX,Q=BP = AdX,Q = BP=AdX,Q=B ,所以 dy=Tr(BAdX)dy = Tr\left( {BAdX} \right)dy=Tr(BAdX) 。
  • 利用微分-导数方程, dy=Tr(∇XfT⋅dX)dy = Tr\left( {\nabla _X f^T \cdot dX} \right)dy=Tr(∇X​fT⋅dX) ,所以 ∇Xf=(BA)T=ATBT\nabla _X f = \left( {BA} \right)^T = A^T B^T∇X​f=(BA)T=ATBT

  特例: ∇XTr(AX)=AT\nabla _X Tr\left( {AX} \right) = A^T∇X​Tr(AX)=AT 以及 ∇XTr(XB)=BT\nabla _X Tr\left( {XB} \right) = B^T∇X​Tr(XB)=BT 。

1.5.5 举例2

Matrix Cookbook eq. 55

  求函数 y=log⁡det⁡(XTX)y = \log \det \left( {X^T X} \right)y=logdet(XTX) 的微分 ∇Xf(x)\nabla _X f\left( x \right)∇X​f(x) 。

  求解过程:

  • 令 Y=XTXY = X^T XY=XTX ,所以 y=log⁡det⁡Yy = \log \det Yy=logdetY ,取微分 dy=dlog⁡det⁡Ydy = d\log \det Ydy=dlogdetY
  • 根据(Matri Cookbook eq.43)微分公式: dlog⁡det⁡Y=Tr(Y−1dY)d\log \det Y = Tr\left( {Y^{ - 1} dY} \right)dlogdetY=Tr(Y−1dY)
  • 将 Y=XTXY = X^T XY=XTX 代回,可以得到 dy=Tr[(XTX)−1dX−1X]dy = Tr\left[ {\left( {X^T X} \right)^{ - 1} dX^{ - 1} X} \right]dy=Tr[(XTX)−1dX−1X] ;
  • 根据 dXTX=(dXT)X+XT(dX)=(dX)TX+XTdXdX^T X = \left( {dX^T } \right)X + X^T \left( {dX} \right) = \left( {dX} \right)^T X + X^T dXdXTX=(dXT)X+XT(dX)=(dX)TX+XTdX ,可以得到:
    dy=Tr[(XTX)−1((dX)TX+XTdX)]dy = Tr\left[ {\left( {X^T X} \right)^{ - 1} \left( {\left( {dX} \right)^T X + X^T dX} \right)} \right]dy=Tr[(XTX)−1((dX)TX+XTdX)]=Tr[(XTX)−1(dX)TX]+Tr[(XTX)−1XTdX]= Tr\left[ {\left( {X^T X} \right)^{ - 1} \left( {dX} \right)^T X} \right] + Tr\left[ {\left( {X^T X} \right)^{ - 1} X^T dX} \right]=Tr[(XTX)−1(dX)TX]+Tr[(XTX)−1XTdX]
  • 利用 TrSQTP=TrSPTQTrSQ^T P = TrSP^T QTrSQTP=TrSPTQ , SSS 是对称。所以 dy=2Tr[(XTX)_1XTdX]dy = 2Tr\left[ {\left( {X^T X} \right)^{\_1} X^T dX} \right]dy=2Tr[(XTX)_1XTdX]
  • 根据微分-导数方程 dy=Tr(∇XfT⋅dX)dy = Tr\left( {\nabla _X f^T \cdot dX} \right)dy=Tr(∇X​fT⋅dX) ,所以∇Xf=2[(XTX)−1X]T=2X(XTX)−1\nabla _X f = 2\left[ {\left( {X^T X} \right)^{ - 1} X} \right]^T = 2X\left( {X^T X} \right)^{ - 1}∇X​f=2[(XTX)−1X]T=2X(XTX)−1

※ 小  结 ※


  记 ∇Xf\nabla _X f∇X​f 是矩阵函数的导数,那么可以利用微分-导数方程 dy=Tr(∇XfT⋅dX)dy = Tr\left( {\nabla _X f^T \cdot dX} \right)dy=Tr(∇X​fT⋅dX) 计算 ∇Xf\nabla _X f∇X​f 。


■ 相关文献链接:

  • Matrix derivative on scalar function of matrix variable
  • Matrix Cookbook

什么是微分?什么是导数?如何利用微分-导数方程求导数?相关推荐

  1. 高等数学期末总复习 DAY4. 利用莱布尼茨定理求高阶导 隐函数求导 对数求导法 参数函数求导 用导数求切线、法线 函数的微分

    DAY 4. 这世上总要有个明白人,懂得克制. 文章目录 DAY 4. 1. 利用莱布尼茨定理求高阶导 2.隐函数求导 3.对数求导 4.参数函数求导 5.用导数求切线.法线 6.函数的微分 1. 利 ...

  2. 利用微分和导数求近似值

    例题 计算cos29°的近似值. 解答过程 分析 解法1:利用微分求解.△f=f(x)`△x+o(△x)=df+o(△x).因为o(△x)趋于无穷小所以忽略不计.于是有△f≈df.所以f(x+△x)≈ ...

  3. 【高数】高数第二章节——导数求导法则高阶导数微分

    高数第二章节--导数&求导法则&高阶导数&微分 0.博主高数相关章节目录 1.数列 1.导数 1.1 例题-导数定义求导(important) 1.2 单侧导数 1.3 例题- ...

  4. Matlab:Matlab编程语言应用之数学计算(求极限/渐近线求导数常微分方程求解求微分方程组的解求临界阻尼系数的解)的简介、案例实现之详细攻略

    Matlab:Matlab编程语言应用之数学计算(求极限/渐近线&求导数&常微分方程求解&求微分方程组的解&求临界阻尼系数的解)的简介.案例实现之详细攻略 目录 三.极 ...

  5. 二元函数对xy同时求导_高等数学期末总复习 DAY4. 利用莱布尼茨定理求高阶导 隐函数求导 对数求导法 参数函数求导等...

    DAY 4. 这世上总要有个明白人,懂得克制. DAY 4. 1. 利用莱布尼茨定理求高阶导 2.隐函数求导 3.对数求导 4.参数函数求导 5.用导数求切线.法线 6.函数的微分 1. 利用莱布尼茨 ...

  6. [数值计算-9]:一元非线性函数求导数(数值微分)- 解析法与迭代法Python法代码示例

    作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article ...

  7. MATLAB求二阶隐函数导数,如何用matlab对隐函数求导? 值得收藏

    隐函数求导一般都比较繁琐,下面介绍一下 如何用matlab对隐函数求导,这样一来我们就可以解放双手,轻松求解隐函数的导数. 工具/材料 matlab软件 正常运行电脑 操作方法 01 matlab求导 ...

  8. python编程求导数_Python求导数的方法

    本文实例讲述了Python求导数的方法.分享给大家供大家参考.具体实现方法如下: def func(coeff): sum='' for key in coeff: sum=sum+'+'+str(k ...

  9. python如何求导数(derivative)、求偏导(partial derivative)?(sympy库symbols()函数、diff()函数、subs()函数)

    可以使用Sympy库 SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁.易于理解和扩展.它完全由Python写成,不依赖于外部库. SymPy支持符 ...

最新文章

  1. JustForex开始提供比特币和比特币现金支付方式
  2. html的分类与特点
  3. c#编译器对byte类型的一些规则 (转)
  4. [转]如何编写 INF 文件
  5. No transaction aspect-managed TransactionStatus in scope
  6. Linux Mutex机制与死锁分析
  7. 各项兼容坑的记录-持续更新
  8. TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
  9. [Java] 蓝桥杯ALGO-100 算法训练 整除问题
  10. 聚类性能度量指标及距离计算
  11. numpy—np.logspace
  12. php滑动门效果,JavaScript实现滑动门效果
  13. 在MATLAB下安装Matpower模块
  14. 使用Java快速开发一个新闻爬虫项目
  15. postman下载地址
  16. To https://gitee.com/xxxx/gittest.git解决方案
  17. html5中的td tr,html5 表格标签 table tr td
  18. 输入框内只能输入数字,输入其他内容不显示
  19. ModelState.IsValid忽略型别的检查错误
  20. 我见过的郭弃疾先生(兰亭集势CEO)

热门文章

  1. 语音识别:市场前景可观,但核心技术仍需突破
  2. 转- prototype
  3. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
  4. 入门指引 - PHP手册笔记
  5. Unable to instantiate Action, MenuAction, defined for 'QueryMenuAll' in namespace '/'MenuAction
  6. windows下python脚本程序的运行
  7. hibernate的中文问题的解决方案
  8. Flutter持久化存储之文件存储
  9. loj6070【山东集训第一轮Day4】基因
  10. Windows cmd(DOS)命令窗口中echo命令ANSI转义显示彩色字或背景