http://antkillerfarm.github.io/

拉格朗日对偶(续)

如果w不满足约束,也就是gi(w)>0g_i(w)>0或hi(w)≠0h_i(w)\ne 0。这时由于L\mathcal{L}函数是无约束函数,αi\alpha_i、βi\beta_i可以任意取值,因此∑ki=1αigi(w)\sum_{i=1}^k\alpha_ig_i(w)或∑li=1βihi(w)\sum_{i=1}^l\beta_ih_i(w)并没有极值,也就是说θP(w)=∞\theta_\mathcal{P}(w)=\infty。

反之,如果w满足约束,则∑ki=1αigi(w)\sum_{i=1}^k\alpha_ig_i(w)和∑li=1βihi(w)\sum_{i=1}^l\beta_ih_i(w)都为0,因此θP(w)=f(w)\theta_\mathcal{P}(w)=f(w)。

综上:

θP(w)={f(w),∞,w满足约束w不满足约束

\theta_\mathcal{P}(w)=\begin{cases} f(w), & w满足约束 \\ \infty, & w不满足约束 \\ \end{cases}

我们定义:

p∗=minwθP(w)=minwmaxα,β:αi≥0L(w,α,β)

p^*=\underset{w}{\operatorname{min}}\theta_\mathcal{P}(w)=\underset{w}{\operatorname{min}}\underset{\alpha,\beta:\alpha_i\ge 0}{\operatorname{max}}\mathcal{L}(w,\alpha,\beta)

下面我们定义对偶函数:

θD(w)=minwL(w,α,β)

\theta_\mathcal{D}(w)=\underset{w}{\operatorname{min}}\mathcal{L}(w,\alpha,\beta)

这里的D\mathcal{D}代表原始优化问题的对偶优化问题。仿照原始优化问题定义如下:

d∗=maxα,β:αi≥0θD(w)=maxα,β:αi≥0minwL(w,α,β)

d^*=\underset{\alpha,\beta:\alpha_i\ge 0}{\operatorname{max}}\theta_\mathcal{D}(w)=\underset{\alpha,\beta:\alpha_i\ge 0}{\operatorname{max}}\underset{w}{\operatorname{min}}\mathcal{L}(w,\alpha,\beta)

这里我们不加证明的给出如下公式:

d∗=maxα,β:αi≥0minwL(w,α,β)≤minwmaxα,β:αi≥0L(w,α,β)=p∗

d^*=\underset{\alpha,\beta:\alpha_i\ge 0}{\operatorname{max}}\underset{w}{\operatorname{min}}\mathcal{L}(w,\alpha,\beta)\le\underset{w}{\operatorname{min}}\underset{\alpha,\beta:\alpha_i\ge 0}{\operatorname{max}}\mathcal{L}(w,\alpha,\beta)=p^*

这样的对偶问题被称作拉格朗日对偶(Lagrange duality)。

KKT条件

拉格朗日对偶公式中使

p∗=d∗

p^*=d^*成立的条件,被称为KKT条件(Karush-Kuhn-Tucker conditions):

∂∂wiL(w∗,α∗,β∗)∂∂βiL(w∗,α∗,β∗)α∗igi(w∗)gi(w∗)α∗i=0,i=1,…,n=0,i=1,…,l=0,i=1,…,k≤0,i=1,…,k≥0,i=1,…,k(1)

\begin{align} \frac{\partial}{\partial w_i}\mathcal{L}(w^*,\alpha^*,\beta^*) & =0,i=1,\dots,n & \\ \frac{\partial}{\partial \beta_i}\mathcal{L}(w^*,\alpha^*,\beta^*) & =0,i=1,\dots,l & \\ \alpha_i^*g_i(w^*)& =0,i=1,\dots,k & \tag{1}\\ g_i(w^*)& \le 0,i=1,\dots,k & \\ \alpha_i^* & \ge 0,i=1,\dots,k & \\ \end{align}

其中的w∗,α∗,β∗w^*,\alpha^*,\beta^*表示满足KKT条件的相应变量的取值。条件1也被称为KKT对偶互补条件(KKT dual complementarity condition)。显然这些w∗,α∗,β∗w^*,\alpha^*,\beta^*既是原始问题的解,也是对偶问题的解。

严格的说,KKT条件是非线性约束优化问题存在最优解的必要条件。这个问题的充分条件比较复杂,这里不做讨论。

注:Harold William Kuhn,1925~2014,美国数学家,普林斯顿大学教授。

Albert William Tucker,1905~1995,加拿大数学家,普林斯顿大学教授。

William Karush,1917~1997,美国数学家,加州州立大学北岭分校教授。(注意,California State University和University of California是不同的学校)

支持向量

针对最优边距分类问题,我们定义:

gi(w)=−y(i)(wTx(i)+b)+1≤0

g_i(w)=-y^{(i)}(w^Tx^{(i)}+b)+1\le 0

由KKT对偶互补条件可知,如果αi>0\alpha_i>0,则gi(w)=0g_i(w)=0。

上图中的实线表示最大边距的分割超平面。由之前对于边距的几何意义的讨论可知,只有离该分界线最近的几个点(即图中的所示的两个x点和一个o点)才会取得约束条件的极值,即gi(w)=0g_i(w)=0。也只有这几个点的αi>0\alpha_i>0,其余点的αi=0\alpha_i=0。这样的点被称作支持向量(support vectors)。显然支持向量的数量是远远小于样本集的数量的。

为我们的问题构建拉格朗日函数如下:

L(w,b,α)=12∥w∥2−∑i=1mαi[y(i)(wTx(i)+b)−1](2)

\mathcal{L}(w,b,\alpha)=\frac{1}{2}\|w\|^2-\sum_{i=1}^m\alpha_i[y^{(i)}(w^Tx^{(i)}+b)-1] \tag{2}

为了求解

θD(α)=minw,bL(w,b,α)

\theta_\mathcal{D}(\alpha)=\underset{w,b}{\operatorname{min}}\mathcal{L}(w,b,\alpha)

可得:

∇wL(w,b,α)=w−∑i=1mαiy(i)x(i)=0

\nabla_w\mathcal{L}(w,b,\alpha)=w-\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}=0

w=∑i=1mαiy(i)x(i)(3)

w=\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)} \tag{3}

对b求导可得:

∂∂bL(w,b,α)=∑i=1mαiy(i)=0(4)

\frac{\partial}{\partial b}\mathcal{L}(w,b,\alpha)=\sum_{i=1}^m\alpha_iy^{(i)}=0 \tag{4}

把公式3代入公式2,可得:

L(w,b,α)=12∥w∥2−∑i=1mαi[y(i)(wTx(i)+b)−1]=12wTw−∑i=1mαiy(i)wTx(i)−∑i=1mαiy(i)b+∑i=1mαi=12wT∑i=1mαiy(i)x(i)−∑i=1mαiy(i)wTx(i)−∑i=1mαiy(i)b+∑i=1mαi=12wT∑i=1mαiy(i)x(i)−wT∑i=1mαiy(i)x(i)−∑i=1mαiy(i)b+∑i=1mαi=−12wT∑i=1mαiy(i)x(i)−b∑i=1mαiy(i)+∑i=1mαi=−12(∑i=1mαiy(i)x(i))T∑i=1mαiy(i)x(i)−b∑i=1mαiy(i)+∑i=1mαi=−12∑i=1mαiy(i)(x(i))T∑i=1mαiy(i)x(i)−b∑i=1mαiy(i)+∑i=1mαi=∑i=1mαi−12∑i,j=1my(i)y(j)αiαj(x(i))Tx(j)−b∑i=1mαiy(i)(5)

\begin{align}\mathcal{L}(w,b,\alpha)&=\frac{1}{2}\|w\|^2-\sum_{i=1}^m\alpha_i[y^{(i)}(w^Tx^{(i)}+b)-1] \\&=\frac{1}{2}w^Tw-\sum_{i=1}^m\alpha_iy^{(i)}w^Tx^{(i)}-\sum_{i=1}^m\alpha_iy^{(i)}b+\sum_{i=1}^m\alpha_i \\&=\frac{1}{2}w^T\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}-\sum_{i=1}^m\alpha_iy^{(i)}w^Tx^{(i)}-\sum_{i=1}^m\alpha_iy^{(i)}b+\sum_{i=1}^m\alpha_i \\&=\frac{1}{2}w^T\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}-w^T\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}-\sum_{i=1}^m\alpha_iy^{(i)}b+\sum_{i=1}^m\alpha_i \\&=-\frac{1}{2}w^T\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}-b\sum_{i=1}^m\alpha_iy^{(i)}+\sum_{i=1}^m\alpha_i \\&=-\frac{1}{2}\left(\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}\right)^T\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}-b\sum_{i=1}^m\alpha_iy^{(i)}+\sum_{i=1}^m\alpha_i \\&=-\frac{1}{2}\sum_{i=1}^m\alpha_iy^{(i)}(x^{(i)})^T\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}-b\sum_{i=1}^m\alpha_iy^{(i)}+\sum_{i=1}^m\alpha_i \\&=\sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i,j=1}^my^{(i)}y^{(j)}\alpha_i\alpha_j(x^{(i)})^Tx^{(j)}-b\sum_{i=1}^m\alpha_iy^{(i)} \tag{5} \end{align}

我们定义如下内积符号⟨x,y⟩=xTy\langle x,y\rangle=x^Ty,并将公式4代入公式5可得:

L(w,b,α)=∑i=1mαi−12∑i,j=1my(i)y(j)αiαj⟨x(i),x(j)⟩

\mathcal{L}(w,b,\alpha)=\sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i,j=1}^my^{(i)}y^{(j)}\alpha_i\alpha_j\langle x^{(i)},x^{(j)}\rangle

最终我们得到如下对偶优化问题:

maxαs.t.W(α)=∑i=1mαi−12∑i,j=1my(i)y(j)αiαj⟨x(i),x(j)⟩αi≥0,i=1,…,m∑i=1mαiy(i)=0

\begin{align} &\operatorname{max}_\alpha & & W(\alpha)=\sum_{i=1}^m\alpha_i-\frac{1}{2}\sum_{i,j=1}^my^{(i)}y^{(j)}\alpha_i\alpha_j\langle x^{(i)},x^{(j)}\rangle\\ &\operatorname{s.t.}& & \alpha_i\ge 0,i=1,\dots,m\\ & & & \sum_{i=1}^m\alpha_iy^{(i)}=0 \end{align}

这个对偶问题的求解,留在后面的章节。这里只讨论求解出α∗\alpha^*之后的情况。

首先,根据公式3可求解w∗w^*。然后

b∗=−maxi:y(i)=−1w∗Tx(i)+mini:y(i)=1w∗Tx(i)2

b^*=-\frac{\max_{i:y^{(i)}=-1}w^{*T}x^{(i)}+\min_{i:y^{(i)}=1}w^{*T}x^{(i)}}{2}

除此之外,我们还有:

wTx+b=(∑i=1mαiy(i)x(i))Tx+b=∑i=1mαiy(i)⟨x(i),x⟩+b

w^Tx+b=\left(\sum_{i=1}^m\alpha_iy^{(i)}x^{(i)}\right)^Tx+b=\sum_{i=1}^m\alpha_iy^{(i)}\langle x^{(i)},x\rangle+b

在之前的讨论中,我们已经指出只有支持向量对应的αi\alpha_i才为非零值,因此:

wTx+b=∑i∈SVαiy(i)⟨x(i),x⟩+b

w^Tx+b=\sum_{i\in SV}\alpha_iy^{(i)}\langle x^{(i)},x\rangle+b

从上式可以看出,在空间维数比较高的情况下,SVM(support vector machines)可以有效降低计算量。

核函数

假设我们从样本点的分布中看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。那么首先需要将特征x扩展到三维(x,x2,x3)(x,x^2,x^3) ,然后寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。

映射函数记作ϕ(x)\phi(x),在这个例子中

ϕ(x)=⎡⎣⎢xx2x3⎤⎦⎥

\phi(x)=\begin{bmatrix} x \\ x^2 \\ x^3 \end{bmatrix}

有的时候,我们希望将特征映射后的特征,而不是最初的特征,应用于SVM分类。这样做的情况,除了上面提到的拟合问题之外,还在于样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。如下图所示:

为此,我们给出核函数(Kernel)的形式化定义:

K(x,z)=ϕ(x)Tϕ(z)

K(x,z)=\phi(x)^T\phi(z)

之所以是形式化定义,这主要在于我们并不利用ϕ(x)\phi(x)来计算K(x,z)K(x,z),而是给定K(x,z),来倒推ϕ(x)\phi(x),从而建立ϕ(x)\phi(x)和K(x,z)K(x,z)之间的对应关系。

例如:

K(x,z)=(xTz)2=(∑i=1nxizi)(∑i=1nxizi)=∑i=1n∑j=1nxixjzizj=∑i,j=1n(xixj)(zizj)

\begin{align}K(x,z)&=(x^Tz)^2=\left(\sum_{i=1}^nx_iz_i\right)\left(\sum_{i=1}^nx_iz_i\right) \\&=\sum_{i=1}^n\sum_{j=1}^nx_ix_jz_iz_j=\sum_{i,j=1}^n(x_ix_j)(z_iz_j) \end{align}

根据上式可得:(这里假设n=3n=3)

ϕ(x)=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x1x1x1x2x1x3x2x1x2x2x2x3x3x1x3x2x3x3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

\phi(x)=\begin{bmatrix} x_1x_1 \\ x_1x_2 \\ x_1x_3 \\ x_2x_1 \\ x_2x_2 \\ x_2x_3 \\ x_3x_1 \\ x_3x_2 \\ x_3x_3 \\ \end{bmatrix}

可以看出ϕ(x)\phi(x)的计算复杂度是O(n2)O(n^2),而(xTz)2(x^Tz)^2的计算复杂度是O(n)O(n)。

下面我们讨论其他几种常用核函数和它对应的ϕ(x)\phi(x)。

K(x,z)=(xTz+c)2=∑i,j=1n(xixj)(zizj)+∑i=1n(2c−−√xi)(2c−−√zi)+c2

\begin{align}K(x,z)&=(x^Tz+c)^2 \\&=\sum_{i,j=1}^n(x_ix_j)(z_iz_j)+\sum_{i=1}^n(\sqrt{2c}x_i)(\sqrt{2c}z_i)+c^2 \end{align}

同样的:(n=3n=3)

ϕ(x)=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢x1x1x1x2x1x3x2x1x2x2x2x3x3x1x3x2x3x32c−−√x12c−−√x22c−−√x3c⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥

\phi(x)=\begin{bmatrix} x_1x_1 \\ x_1x_2 \\ x_1x_3 \\ x_2x_1 \\ x_2x_2 \\ x_2x_3 \\ x_3x_1 \\ x_3x_2 \\ x_3x_3 \\ \sqrt{2c}x_1 \\ \sqrt{2c}x_2 \\ \sqrt{2c}x_3 \\ c \end{bmatrix}

更一般的,对于K(x,z)=(xTz+c)dK(x,z)=(x^Tz+c)^d,其对应的ϕ(x)\phi(x)是(n+dd)\begin{pmatrix} n+d \\ d \\ \end{pmatrix}维向量。

我们也可以从另外的角度观察K(x,z)=ϕ(x)Tϕ(z)K(x,z)=\phi(x)^T\phi(z)。从内积的几何意义来看,如果ϕ(x)\phi(x)和ϕ(z)\phi(z)夹角越小,则K(x,z)K(x,z)的值越大;反之,如果ϕ(x)\phi(x)和ϕ(z)\phi(z)的夹角越接近正交,则K(x,z)K(x,z)的值越小。因此,K(x,z)K(x,z)也叫做ϕ(x)\phi(x)和ϕ(z)\phi(z)的余弦相似度。

讨论另一个核函数:

K(x,z)=exp(−∥x−z∥22σ2)

K(x,z)=\exp\left(-\frac{\|x-z\|^2}{2\sigma^2}\right)

这个核函数被称为高斯核函数(Gaussian kernel),对应的ϕ(x)\phi(x)是个无限维的向量。

注:(a+b)n(a+b)^n是个p为0.5的二项分布,由棣莫佛-拉普拉斯定理(de Moivre–Laplace theorem)可知,当n→∞n\to\infty时,它的极限是正态分布。

核函数的有效性

如果对于给定的核函数K,存在一个特征映射ϕ\phi,使得K(x,z)=ϕ(x)Tϕ(z)K(x,z)=\phi(x)^T\phi(z),则称K为有效核函数。

我们首先假设K为有效核函数,来看看它有什么性质。假设有m个样本{x(1),…,x(m)}\{x^{(1)},\dots,x^{(m)}\},我们定义m×mm\times m维的矩阵k:Kij=K(xi,xj)K_{ij}=K(x_i,x_j)。这个矩阵被称为核矩阵(Kernel matrix)。

Kij=K(xi,xj)=ϕ(x(i))Tϕ(x(j))=ϕ(x(j))Tϕ(x(i))=K(xj,xi)=Kji

K_{ij}=K(x_i,x_j)=\phi(x^{(i)})^T\phi(x^{(j)})=\phi(x^{(j)})^T\phi(x^{(i)})=K(x_j,x_i)=K_{ji}

如果我们用ϕk(x)\phi_k(x)表示ϕ(x)\phi(x)第k个元素的话,则对于任意向量z:

zTKz=∑i∑jziKijzj=∑i∑jziϕ(x(i))Tϕ(x(j))zj=∑i∑jzi∑kϕk(x(i))ϕk(x(j))zj=∑k∑i∑jziϕk(x(i))ϕk(x(j))zj=∑k(∑iziϕk(x(i)))2≥0

\begin{align}z^TKz&=\sum_i\sum_jz_iK_{ij}z_j=\sum_i\sum_jz_i\phi(x^{(i)})^T\phi(x^{(j)})z_j \\&=\sum_i\sum_jz_i\sum_k\phi_k(x^{(i)})\phi_k(x^{(j)})z_j=\sum_k\sum_i\sum_jz_i\phi_k(x^{(i)})\phi_k(x^{(j)})z_j \\&=\sum_k\left(\sum_iz_i\phi_k(x^{(i)})\right)^2\ge 0 \end{align}

即K矩阵是半正定矩阵。事实上,K矩阵是对称半正定矩阵,不仅是K函数有效的必要条件,也是它的充分条件。相关的证明是由James Mercer给出的,被称为Mercer定理(Mercer Theorem)。

注:James Mercer,1883-1932,英国数学家,英国皇家学会会员,毕业于剑桥大学。曾服役于英国皇家海军,参加了日德兰海战。

Mercer定理给出了不用找到ϕ(x)\phi(x),而判定K(x,z)K(x,z)是否有效的方法。因此寻找ϕ(x)\phi(x)的步骤就可以跳过了,直接使用K(x,z)K(x,z)替换上面公式中的⟨x,z⟩\langle x,z\rangle即可。例如:

wTx+b=∑i∈SVαiy(i)⟨x(i),x⟩+b=∑i∈SVαiy(i)K(x(i),x)+b(6)

w^Tx+b=\sum_{i\in SV}\alpha_iy^{(i)}\langle x^{(i)},x\rangle+b=\sum_{i\in SV}\alpha_iy^{(i)}K(x^{(i)},x)+b \tag{6}

核函数不仅仅用在SVM上,但凡在一个算法中出现了⟨x,z⟩\langle x,z\rangle,我们都可以使用K(x,z)K(x,z)去替换,这可以很好地改善我们算法的效率。因此,核函数更多的被看作是一种技巧而非理论(kernel trick)。

规则化和不可分情况处理

我们之前讨论的情况都是建立在样例线性可分的假设上,当样例线性不可分时,我们可以尝试使用核函数来将特征映射到高维,这样很可能就可分了。然而,映射后我们也不能100%保证可分。那怎么办呢,我们需要将模型进行调整,以保证在不可分的情况下,也能够尽可能地找出分隔超平面。

上面的右图中可以看到一个离群点(可能是噪声),它会造成超平面的移动,从而导致边距缩小,可见以前的模型对噪声非常敏感。再有甚者,如果离群点在另外一个类中,那么这时候就是线性不可分的了。

机器学习(四)——SVM(2)相关推荐

  1. 【机器学习】SVM支持向量机模型

     本站原创文章,转载请说明来自<老饼讲解-机器学习>ml.bbbdata.com 目录 一. SVM的目标和思想 1.1 SVM硬间隔模型的原始目的 1.2 SVM的直接目标 1.3 什么 ...

  2. 百面机器学习—4.SVM模型基础知识

    文章目录 引言 一.间隔与支持向量 1.什么是线性可分? 2.什么是超平面?什么是最大间隔超平面? 3.什么是支撑向量? 4.SVM最优化问题 二.对偶问题 1.约束条件下的目标函数如何求解最优化问题 ...

  3. 机器学习四剑客1——Numpy

    求业之精,别无他法,日专而已矣! 一.概论 1.机器学习是什么 2.机器学习做什么 3.机器学习基本概念 二.机器学习第一步:数据分析 1.Python被大量应用在数据挖掘和深度学习领域: 2.其中使 ...

  4. 【机器学习】SVM学习(三):线性分类器的求解

    [机器学习]SVM学习(三):线性分类器的求解 2016-10-10 19:56 239人阅读 评论(0) 收藏 举报 本文章已收录于:  机器学习知识库  分类: 机器学习(37)  目录(?)[+ ...

  5. Scikit-Learn 机器学习笔记 -- SVM

    Scikit-Learn 机器学习笔记 – SVM 参考文档: handson-ml import numpy as np# 加载鸢尾花数据集 def load_dataset():from skle ...

  6. 【机器学习】SVM理论与python实践系列

    理论部分: <机器学习--支持向量机SVM之线性模型> <机器学习--支持向量机SVM之非线性模型低维到高维映射> <机器学习--支持向量机SVM之非线性模型原问题与对偶 ...

  7. 系统学习机器学习之SVM(三)--Liblinear,LibSVM使用整理,总结

    1.Libsvm与Liblinear区别,简单源码剖析. http://blog.csdn.net/zhzhl202/article/details/7438160 http://blog.csdn. ...

  8. python机器交易_[原创]Python 机器学习之 SVM 预测买卖 -- 基于 BotVS 量化平台

    Python 机器学习之 SVM 预测买卖 Python入门简单策略 sklearn 机器学习库的使用 回测系统自带的库有 numpy pandas TA-Lib scipy statsmodels  ...

  9. 机器学习四种调参方法总结

    介绍 维基百科上说,"Hyperparameter optimization或tuning是为学习算法选择一组最优的hyperparameters的问题". 本文转载于收藏 | 机 ...

  10. 系统学习机器学习之SVM(四)--SVM算法总结

     这边文章介绍的相当浅显易懂,写的很好.算是SVM总结吧. 转自:http://www.blogjava.net/zhenandaci/category/31868.html (一)SVM的简介 ...

最新文章

  1. php 批量导出excel文件,PHPEXCEL批量导出
  2. Oracle 12.2安装示例schema
  3. 电脑键盘数字键失灵_C4D/3dmax/MaYa三维设计——高档机械键盘推荐·红轴(200元左右预算)...
  4. Altium Designer旋转PCB、PCB中绕某点旋转
  5. Document类型知识大全
  6. NSObject协议中方法:description 和 debugDescription
  7. dwr 写的小程序,配置
  8. linux 目录定义,linux根目录定义
  9. C++:连接MySQL
  10. System.Web.HttpException: 无法验证数据解决办法
  11. mysql 列 随机数_MySQL的指定范围随机数函数rand()的使用技巧
  12. 2.04 对字母数字的混合排序
  13. C#winform可视化(当主窗体不能拖动时)
  14. WindowManager添加一个悬浮的Window
  15. Silverlight学习笔记1:浏览器外运行(Out Of Browser)及更新检查
  16. 配置 Ubuntu 字符界面启动
  17. JAVA环境变量配置方法(Windows)
  18. 编程猫fiddler插件
  19. selenium 确实是好东西,使用selenium-server 加快执行速度,对速度有很大提升,同时可以拆分服务,进行集群部署。
  20. Falsy Bouncer 过滤数组假值 Array.filter()方法

热门文章

  1. My favorite books
  2. 系统要不要更新_手机经常弹出“系统更新”,到底要不要更新?用户:后悔已来不及...
  3. element table 表格设置max-height 没有出现滚动条,多渲染了一列。
  4. mysql中的类型与java_mysql与java数据类型对应关系
  5. matlab神经网络每次相差大,GA-BP网络为什么每次训练的结果相差很大呢?
  6. html5添加渐变边框效果,《CSS3揭秘》上(边框,投影,渐变,条纹效果,蚂蚁行军)...
  7. 根据按钮的状态显示hover
  8. linux设置登录次多过多锁定时间
  9. Pokémon Go火遍全球,开启全民捕捉小精灵的时代
  10. MMJ-Spring Boot(Java)获取小程序Openid