支持向量机(SVM)介绍
一、了解支持向量机
支持向量机(support vector machings, SVM) 是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
支持向量机学习方法的构建由简单到复杂:线性可分模型、线性支持向量机、以及非线性支持向量机。简单模型是复杂模型的基础,也是复杂模型的特殊情况。当训练数据线性可分时通过硬间隔最大化,学习一个线性分类器,即为线性可分支持向量机;当训练数据接近线性可分时,通过软间隔最大化,也学习一个线性分类器,即线性支持向量机;当训练数据线性不可分时,通过使用核技巧(kernel trick)及软间隔最大化,学习非线性支持向量机。
二、线性支持向量机之硬间隔最大化
1、什么是线性可分?
在下图的例子中,二维平面的点可以通过一条直线将两类样本完全分开,我们称这种情况下是线性可分的。一般的,两种样本标签分别用\(+1\)和\(-1\)表示,在多维空间中,所谓线性可分其实就是可以找到一个超平面使得两类样本分别在超平面的两侧。
超平面可以用\(w \cdot x + b = 0\)其中\(w\)是一个\(n\)维向量,\(x=[x_1,x_2,..,x_n]^T\)表示样本点向量。\(\cdot\)表示向量内积,超平面也可以等效的表示为\(w^Tx+b=0\).(因为\(w \cdot x = w^Tx\)),我们令\(f(x)=w^Tx+b\),则 $ f(x) > 0 $ 时,\(x\)在超平面上方,\(f(x)=0\) 时,\(x\) 在超平面上,\(f(x)<0\)时,\(x\)在超平面下方。
2. 计算点到超平面的距离
在超平面表达式\(w \cdot x+ b =0\)中,\(w\)就是超平面的法向量,设空间任意一点为\(x\),它在超平面上的投影点是\(x'\),则有
\[f(x)=w \cdot x+b \quad (1)
\]
\[
x = x'+\lambda w \quad (2)
\]
通过\((1)、(2)\)可以得到
\[
f(x)=w \cdot (x'+ \lambda w)+b=w \cdot x' + \lambda w \cdot w + b
\]
\[
= \lambda w \cdot w
\]
也就是
\[
\lambda = \frac{g(x)}{w \cdot w}
\]
点到超平面的距离\(M\)表示为
\[
M = ||x-x'||=||\lambda w||
\]
\[
=\frac{|g(x)| \times ||w||}{w \cdot w}=\frac{|g(x)|}{||w||}
\]
3. 函数间隔和几何间隔
一般而言,一个点距离超平面的远近可以表示分类预测的确信度,在超平面\(w \cdot x + b = 0\)确定的情况下,\(|w \cdot x + b|\)可以相对的表示\(x\)距离超平面的远近,而\(w \cdot x + b\)与\(y\)的符号是否一致能够表示分类是否正确,所以可以使用\(y(w \cdot x + b)\)表示分类正确性以及确信度,这就是函数间隔的概念。
函数间隔 对于给定的训练数据集\(T\)和超平面\((w,b)\),定义超平面\((w,b)\)关于样本\((x_i,y_i)\)的函数间隔为
\[
\hat{\gamma_i} = y_i(w \cdot x_i +b)
\]
注意 :样本\((x_i,y_i)\)中,\(x_i\)是样本的特征向量,\(y_i\)是样本标签,\(y_i\)取值为1或者-1
定义超平面\((w,b)\)关于训练集的函数间隔为超平面\((w,b)\)关于所有训练样本点\((x_i,y_i)\)的函数间隔最小值
\[
\hat{\gamma} = min \; \hat{\gamma_i} \quad where \quad i=1,2...,N
\]
显然只有函数间隔是不够的,如果按照比率的改变\(w\)和\(b\),超平面并没有变,但是函数间隔却变为原来的倍数,所以我们一般约定\(||w||=1\)使得间隔是确定的,这时函数间隔就变为几何间隔,其实就是点到超平面的距离。
几何间隔 对于给定的训练数据集\(T\)和超平面\((w,b)\),定义超平面\((w,b)\)关于样本\((x_i,y_i)\)的几何间隔为
\[
\gamma_i = y_i\frac{g(x)}{||w||}
\]
定义超平面\((w,b)\)关于训练集的函数间隔为超平面\((w,b)\)关于所有训练样本点\((x_i,y_i)\)的几何间隔间隔最小值
\[
\gamma= min \; \gamma_i \quad where \quad i = 1,2...,N
\]
4.间隔最大化
我们需要将几何间隔最大化,即为
\[
max\;\gamma
\]
\[
s.t. \quad y_i(\frac{g(x_i)}{||w||}) \geq \gamma \quad i=1,2,...,N
\]
由于\(\hat{\gamma}=\gamma ||w||\)上面最优化问题等价于
\[
max\;\frac{\hat{\gamma}}{||w||}
\]
\[
s.t. \quad y_ig(x_i) \geq \hat{\gamma} \quad i=1,2,...,N
\]
由于可以对\(w,b\)同时乘以任意倍数,所以实际上\(\hat{\gamma}\)的值对上述最优化问题没有影响,这等价于\(\hat{\gamma}=1\)的情况,上述最优化问题等价于
\[
max\;\frac{1}{||w||}
\]
\[
s.t. \quad y_ig(x_i) \geq 1 \quad i=1,2,...,N
\]
再者最大化\(\frac{1}{||w||}\)等同于小化\(\frac{1}{2}||w||^2=\frac{1}{2}w^Tw\),从而上述最优化问题也等价于
\[
min\;\frac{1}{2} w^Tw
\]
\[
s.t. \quad y_ig(x_i) \geq 1 \quad i=1,2,...,N
\]
所以我们的问题转化为
\[
Minimize \quad \quad \quad \quad \quad \quad \phi(w) = \frac{1}{2}w^Tw
\]
\[
Subject \;\; to \quad \quad y_i(w \cdot x_i + b) \geq 1 \quad i=1,2,...,N
\]
5.利用拉格朗日乘数法求解最优化问题
下面我们通过拉格朗日乘数法求解上述最优化问题
\[
L_p=\frac{1}{2}w^Tw-\sum_{i=1}^N\alpha_iy_i(w_i\cdot x_i +b)+\sum_{i=1}^N \alpha_i \quad (1)
\]
求偏导数得
\[
\frac{ \partial L_p}{\partial w}=w-\sum_{i=1}^N\alpha_iy_ix_i=0 \quad \Longrightarrow \quad w =\sum_{i=1}^N\alpha_iy_ix_i \quad (2)
\]
\[
\frac{\partial L_p}{\partial b}=0 \quad \Longrightarrow \quad \sum_{i=1}^N{\alpha_iy_i}=0 \quad (3)
\]
我们将\((2)、(3)\)代入\((1)\)得到(为了区分,用\(L_D\)替换\(L_p\))
\[
L_D=\sum_{i=1}^N{\alpha_i}-\frac{1}{2}\sum_{i,j}\alpha_i\alpha_jy_iy_jx_i \cdot x_j\quad\quad\quad\quad\quad\quad\quad\quad\quad
\]
\[
=\sum_{i=1}^N\alpha_i-\frac{1}{2}\alpha^TH\alpha \quad where \quad H_{ij}=y_iy_jx_i \cdot x_j
\]
\[
s.t. \quad \sum_{i=1}^N{\alpha_iy_i}=0\;\;,\;\; \alpha_i \geq 0 \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad
\]
这样,上式最优化问题已经很简单了,我们就可以借助软件工具求解了。假设我们求解出了最优化下的\(\alpha\)向量为\(\alpha^*=[\alpha_1^*,\alpha_2^*...,\alpha_{l}^*]^T\),这时候代入\((2)\)就可以得到
\[
w=\sum_{i=1}^N\alpha_i^*y_ix_i \quad (4)
\]
并可以选择一个\(\alpha^*\)的正分量\(\alpha_j^*>0\)来计算\(b\)
\[
b = y_j-\sum_{i=1}^N\alpha_i^*y_i(x_i \cdot x_j) \quad (5)
\]
并且得到函数间隔\(g(x)\)可以表示为
\[
g(x)=w \cdot x +b = (\sum_{i=1}^N \alpha_i y_ix_i)\cdot x+ b=\sum_{i=1}^N{\alpha_iy_i (x_i\cdot x )}+ b
\]
上述表示是内积的形式,我们在后面将会用到
6.什么是支持向量?
下图是两类点蓝色和红色,两条绿色线之间的几何距离就是最大的\(margins\),中间虚线就是是我们所求的超平面\(w \cdot x + b =0\),而在两条绿色线上的点就是我们所说的支持向量,它其实就是那些决定硬间隔的样本点,这些点一定在间隔边界上(图中的绿线)。
支持向量的定义 求解原始最优化问题后,将训练集中对应的\(\alpha_i^*>0\)的样本点\((x_i,y_i)\)的实例\(x_i \in R^n\)称做支持向量。支持向量一定在间隔边界上,它满足
\[
y_ig(x_i)=1 \quad \Longrightarrow \quad y_i(w \cdot x+b)=1 \quad \Longrightarrow \quad w \cdot x + b = \pm 1
\]
7.一个计算例子
正点样列为\(x_1=[3,3]^T,x_2=[4,3]^T\),负点样列为\(x_3=[1,1]^T\),下面来计算\(w\)和\(b\).
根据条件得到
\[
\sum_{i=1}^3\alpha_iy_i=0 \quad \Longrightarrow \quad \alpha_1+\alpha_2-\alpha_3=0
\]
然后计算矩阵\(H\)为
\[
H =
\left [
\begin{matrix}
H_{11} & H_{12} & H_{13} \\
H_{21} & H_{22} & H_{23} \\
H_{31} & H_{32} & H_{33} \\
\end{matrix}
\right ]=\left [
\begin{matrix}
y_1y_1x_1 \cdot x_1 & y_1y_2x_1 \cdot x_2 & y_1y_3x_1 \cdot x_3 \\
y_2y_1x_2 \cdot x_1 & y_2y_2x_2 \cdot x_2 & y_2y_3x_2 \cdot x_3 \\
y_3y_1x_3 \cdot x_1 & y_3y_2x_3 \cdot x_2 & y_3y_3x_3 \cdot x_3 \\
\end{matrix}
\right ] =\left [
\begin{matrix}
18 & 21 & -6 \\
21 & 25 & -7 \\
-6 & -7 & 2 \\
\end{matrix}
\right ]
\]
从而
\[
L_D=\sum_{i=1}^3\alpha_i - \frac{1}{2}[\alpha_1,\alpha_2,\alpha_3]H[\alpha_1,\alpha_2,\alpha_3]^T\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad
\]
\[
=-9\alpha_1^2-\frac{25}{2}\alpha_2^2-\alpha_3^2-21\alpha_1\alpha_2+6\alpha_1\alpha_3+7\alpha_2\alpha_3+\alpha_1+\alpha_2+\alpha_3
\]
即为
\[
max \; L_D \quad\quad\quad\quad\quad\quad\quad
\]
\[
s.t. \quad \alpha_1+\alpha_2-\alpha_3=0,\alpha_1 \geq 0,\alpha_2 \geq 0,\alpha_3 \geq 0
\]
将\(\alpha_3 = \alpha_1+\alpha_2\)代入目标函数得
\[
F(\alpha_1,\alpha_2)=-4\alpha_1^2-\frac{13}{2}\alpha_2^2-10\alpha_1\alpha_2+2\alpha_1+2\alpha_2
\]
可以求得\(F(\alpha_1,\alpha_2)\)在点\([\frac{3}{2},-1]^T\)处取极值,但是不满足\(\alpha_2 \geq 0\),所以在边界处取得最大值,分别令\(\alpha_1=0\)和\(\alpha_2=0\),可以求得极值分别为\(F(0,\frac{2}{13})=\frac{2}{13}\)和\(F(\frac{1}{4},0)=\frac{1}{4}\),故\(F(\alpha_1,\alpha_2)\)在点\([\frac{1}{4},0]\)处取得最大值为\(\frac{1}{4}\)
从而\(\alpha^*=[\frac{1}{4},0,\frac{1}{4}]^T\),则\(x_1,x_3\)对应支持向量。此时可以计算出\(w\)为
\[
w=\sum_{i=1}^3\alpha_i^*y_ix_i=[\frac{1}{2},\frac{1}{2}]
\]
同理可以计算处\(b=-2\),所以分离超平面为
\[
\frac{1}{2}x_1+\frac{1}{2}x_2-2=0
\]
三、线性支持向量机之软间隔最大化
1. 线性支持向量机
线性可分问题的支持向量机学习方法,对线性不可分训练数据是不适用的,因为这时候上述方法的不等式约束并不都成立,怎么将它扩展到线性不可分问题呢?这就要修改硬间隔最大化,使它成为软间隔最大化。
设训练数据集合为\(T=\{(x_i,y_i)|i=1,2...,N\}\),我们假设数据集是线性不可分的,通常情况下,训练数据中有一些\(outlier\),将这些点去除后,剩下的样本点构成的集合是线性可分的。线性不可分意味这存在某些点\((x_i,y_i)\)不满足\(w \cdot x + b \geq 1\),这个时候我们可以给每个样本点引进一个松弛变量\(\xi_i \geq 0\) 使得约束条件
\[
y_i(w \cdot x_i +b) + \xi_i \geq 1
\]
同时目标函数需要最小化
\[
\frac{1}{2}w^Tw+C\sum_{i=1}^N\xi_i
\]
这里的\(C>0\)是惩罚因子,\(C\)越大表示对误差的分类增大,\(C\)越小表示对误差的分类乘法越小。最小化目标函数包含两次含义:使\(\frac{1}{2}w^Tw\)尽量小(即间隔尽量大),同时使误差分类的个数尽量小,\(C\)是调和二者的系数。新的最优化问题可以表示为
\[
min\quad \frac{1}{2}w^Tw+C\sum_{i=1}^N\xi_i \quad \quad \quad
\]
\[
s.t. \quad y_i(w \cdot x_i + b) \geq 1 - \xi_i
\]
2. 求解优化问题
和前面做法一样,用拉格朗日乘数法构造函数
\[
L_p=\frac{1}{2}w^Tw+C\sum_{i=1}^N\xi_i-\sum_{i=1}^N\alpha_i[y_i(w \cdot x_i + b) -1+\xi_i)] -\sum_{i=1}^n\mu_i\xi_i
\]
接下里做法和前面一样
\[
\frac{\partial L_p}{\partial w} =w - \sum_{i=1}^N\alpha_iy_ix_i = 0 \quad \Longrightarrow \quad w =\sum_{i=1}^N\alpha_iy_ix_i
\]
\[
\frac{\partial L_p}{\partial b} =0\quad \Longrightarrow \quad \sum_{i=1}^N\alpha_iy_i=0 \quad\quad\quad\quad\quad\quad\quad\quad
\]
\[
\frac{\partial L_p}{\partial \xi_i}=C-\alpha_i-\xi_i=0 \quad \Longrightarrow \quad C=\alpha_i+\xi_i\quad \quad
\]
代入目标函数,我们可以得到(为了区分,用\(L_D\)代替\(L_p\))
\[
max \quad L_D=\sum_{i=1}^N\alpha_i-\frac{1}{2}\alpha^TH\alpha \quad \quad \quad \quad
\]
\[
s.t. \quad 0 \leq \alpha_i \leq C \quad and \quad \sum_{i=1}^N\alpha_iy_i=0
\]
与前面硬间隔最优化比较,这里就多啦一项约束条件\(\alpha_i \leq C\),到这里就可以用软件求解了。
四、非线性支持向量机
对于解决线性问题,线性支持向量机是一种非常有效的方法,但是,有时候分类问题的非线性的,这时候可以使用非线性支持向量机,其主要特点是利用核技巧(kernel tirck).核技巧不仅应用于支持向量机,而且应用于其他统计学问题。
1.非线性可分问题的处理策略
非线性分类问题是指利用非线性模型才可以很好的进行分类,通常是一个曲面,如下面的右图,在二维平面上,可以用一个圆将原始数据分开。
解决非线性问题一般策略是将其转化为线性问题来求解,将原始样本点做一个非线性变换,将非线性问题转化为线性问题,通过求解变换后的线性问题的方法求解原来的非线性问题。如上图的例子,我们对样本点做非线性变换
\[
\phi \quad: \quad [x_1,x_2]^T \longmapsto [x_1^2,x_2^2]^T
\]
通过这样的变换后,我们就可以利用线性支持向量机来求解原理问题了。归纳起来就是,用线性分类方法处理非线性分类问题分为2步:首先使用一个非线性变换将原始空间数据映射到新空间;然后从新空间里用线性分类方法从训练数据中学习分类模型。核技巧就属于这样的方法。
2. 核函数
核技巧应用到支持向量机中,其基本想法就是通过一个非线性变换将输入空间对应于一个特征空间,使得在输入空间里面的超曲面模型对应特征空间中的超平面模型,这样分类问题的学习任务在特征空间求解线性支持向量机就可以完成。
核函数的定义 设 输入空间是\(\Omega\),特征空间为\(\Upsilon\),如果存在一个从\(\Omega\)到\(\Upsilon\)的映射
\[
\phi(x) \quad: \quad \Omega \quad \longrightarrow \quad \Upsilon
\]
使得对任意的\(x,z \in \Omega\)都有
\[
K(x,z)=\phi(x)\cdot \phi(z)
\]
则称\(K(x,z)\)为核函数,\(\phi(x)\)为映射函数。
通常情况下计算\(\phi(x)\cdot \phi(z)\)是不容易的,核函数的做法是,它不显示的定义映射函数\(\phi\),这是由于\(\phi(x)\cdot \phi(z)\)的计算直接可以归结于\(K(x,z)\)的计算,通常特征空间是高维甚至是无穷维的,核技巧只需要完成在低维空间的计算,但可以实现高维度的功能。显然,对于给定的核函数\(K(x,z)\),特征空间和映射\(\phi\)都不是唯一的。
例如 输入空间是\(R^2\),核函数是\(K(x,z)=(x \cdot z)^2\),试找出相关特征空间\(\Upsilon\)和映射\(\phi(x): R^2 \longrightarrow R^3\)
记\(x=[x_1,x_2]^T\;,\;z=[z_1,z_2]^T\),则
\[
K(x,z)=(x\cdot z)^2=(x_1z_1+x_2z_2)^2=(x_1z_1)^2+2x_1z_1x_2z_2+(x_2z_2)^2
\]
于是可以取映射
\[
\phi(x)=[x_1^2,\sqrt{2}\;x_1x_2,x_2^2]^T
\]
这样就满足\(K(x,z)=\phi(x)\cdot \phi(z)\),当然\(\phi(x)\)还可以取其它的。
3.核函数在支持向量机的应用
记得之前在线性支持向量机中的目标函数和决策函数吗?他们都只需要输入实例的内积计算,如下
\[
L_D=\sum_{i=1}^N\alpha_i-\frac{1}{2}\sum_{i,j}\alpha_i\alpha_jy_iy_jx_i\cdot x_j
\]
分类决策函数为
\[
g(x)=\sum_{i=1}^N\alpha_iy_ix_i\cdot x+b
\]
通过非线性映射\(x \longmapsto \phi(x)\),得到特征空间函数形式为
\[
L_D=\sum_{i=1}^N\alpha_i-\frac{1}{2}\sum_{i,j}\alpha_i\alpha_jy_iy_j\phi(x_i)\cdot \phi(x_j)=\sum_{i=1}^N\alpha_i-\frac{1}{2}\sum_{i,j}\alpha_i\alpha_jy_iy_jK(x_i,x_j)
\]
\[
g(x)=\sum_{i=1}^N\alpha_iy_i \phi(x_i)\cdot \phi(x)+b=\sum_{i=1}^N\alpha_iy_iK(x_i,x)+b \quad \quad \quad \quad \quad \quad \quad \quad\quad\quad
\]
这样我们完全隐含了映射\(\phi\),无序考虑特征空间究竟是怎样的。叶就是说在\(K(x,z)\)给定的条件下,可以利用解线性分类的方法来求解非线性分类问题的支持向量机,学习是隐式的在特征空间进行的,不需要显式的定义特征空间和映射函数,这就是所谓的核技巧。
3. 常用核函数
多项式核函数
\[
K(x,z)=(x \cdot z+1)^p
\]
对应的向量机是一个\(p\)次多项式分类器,在此情况下分类函数为
\[
g(x)=\sum_{i=1}^N\alpha_iy_i(x_i \cdot x +1)^p+b
\]
高斯核函数
\[
K(x,z)=\exp \left ( -\frac{||x-z||^2}{2\sigma^2} \right )
\]
对应的向量机是一个\(p\)次多项式分类器,在此情况下分类函数为
\[
g(x)=\sum_{i=1}^N\alpha_iy_i\exp \left ( -\frac{||x-x_i||^2}{2\sigma^2} \right )+b
\]
字符串核函数
暂略......
支持向量机(SVM)介绍的更多相关文章
- OpenCV支持向量机(SVM)介绍
支持向量机(SVM)介绍 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 CvSVM::train 训练一个SVM分类器, 以及用 CvSVM::predict 测试训练结果. 什么是支持向 ...
- 支持向量机SVM介绍
SVM为了达到更好的泛化效果,会构建具有"max-margin"的分类器(如下图所示),即最大化所有类里面距离超平面最近的点到超平面的距离,数学公式表示为$$\max\limits ...
- OpenCV支持向量机SVM对线性不可分数据的处理
支持向量机对线性不可分数据的处理 目标 本文档尝试解答如下问题: 在训练数据线性不可分时,如何定义此情形下支持向量机的最优化问题. 如何设置 CvSVMParams 中的参数来解决此类问题. 动机 为 ...
- 机器学习:Python中如何使用支持向量机(SVM)算法
(简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...
- 以图像分割为例浅谈支持向量机(SVM)
1. 什么是支持向量机? 在机器学习中,分类问题是一种非常常见也非常重要的问题.常见的分类方法有决策树.聚类方法.贝叶斯分类等等.举一个常见的分类的例子.如下图1所示,在平面直角坐标系中,有一些点 ...
- 一步步教你轻松学支持向量机SVM算法之案例篇2
一步步教你轻松学支持向量机SVM算法之案例篇2 (白宁超 2018年10月22日10:09:07) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...
- 支持向量机SVM 参数选择
http://ju.outofmemory.cn/entry/119152 http://www.cnblogs.com/zhizhan/p/4412343.html 支持向量机SVM是从线性可分情况 ...
- 大数据-10-Spark入门之支持向量机SVM分类器
简介 支持向量机SVM是一种二分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器.支持向量机学习方法包含3种模型:线性可分支持向量机.线性支持向量机及非线性支持向量机.当训练数据线性可分时 ...
- [转] 从零推导支持向量机 (SVM)
原文连接 - https://zhuanlan.zhihu.com/p/31652569 摘要 支持向量机 (SVM) 是一个非常经典且高效的分类模型.但是,支持向量机中涉及许多复杂的数学推导,并需要 ...
- 线性可分支持向量机--SVM(1)
线性可分支持向量机--SVM (1) 给定线性可分的数据集 假设输入空间(特征向量)为,输出空间为. 输入 表示实例的特征向量,对应于输入空间的点: 输出 表示示例的类别. 线性可分支持向量机的定义: ...
随机推荐
- docker数据管理--数据卷的备份
/* 先在宿主机创建一个备份的文 件夹, 然后将其以另外一个名字的目录挂载到容器里, 此时不管容器里,或宿主机里做什么操作, 数据都会及时更新,并得到备份. */ [root@localhost ~] ...
- 字符串aaaa......bbbb....ccc...dddddd用正则替换为abcd
public static void main(String[] args) { String s = "aaaa......bbbb....ccc...dddddd"; Stri ...
- WebDriver自动化测试工具(1)---环境搭建
Webdriver是一个前端自动化测试工具,可以模拟用户点击链接,填写表单,点击按钮等操作,下面介绍其使用 一.下载WebdriverC#类库以及对应浏览器驱动 http://www.selenium ...
- JavaScript性能优化【转载】
你愿意为打开一个网页等待多长时间?我一秒也不愿意等.但是事实上大多数网站在响应速度方面都让人失望.现在越来越多的人开始建立自己的网站,博客,你的网页响应速度如何呢?在这篇文章中我们来介绍一下提高网页性 ...
- 前端读者 | 百度前端编码规范(JS)
本文来自:百度FEX 1 前言 JavaScript在百度一直有着广泛的应用,特别是在浏览器端的行为管理.本文档的目标是使JavaScript代码风格保持一致,容易被理解和被维护. 虽然本文档是针对J ...
- CentOS7单机部署lamp环境和apache虚拟主机
(1)apache介绍 apache : httpd.apache.org 软件包:httpd 端口服务:80/tcp(http) 443/tcp(https,http+ssl) 配置文件: /etc ...
- Intellij IDEA 去掉Mapper文件中的背景
1.在setting中输入:inspection --> SQL 2.去掉背景颜色,Apply即可
- python多线程编程(6): 队列同步
原文请看:http://www.cnblogs.com/holbrook/archive/2012/03/15/2398060.html 前面介绍了互斥锁和条件变量解决线程间的同步问题,并使用条件变量 ...
- python 多网站采集,解决编码问题
import chardet def get_charset(str): return chardet.detect(str)['encoding'] html = '' # bytes 字节串 ch ...
- 异步加载 Echarts图的数据
<script src="~/Scripts/NewEcharts/echarts.js"></script> <script type=" ...