文章目录

  • 1 算法思想
  • 2 算法步骤
    • 2.1 线性可分支持向量机
    • 2.2 SVM的二次凸函数和约束条件
    • 2.3 非线性类问题——核技巧(kernel trick)
  • 3 算法实现

1 算法思想

支持向量机(support vector machines) 是找到一个超平面(hyperplane)将数据划分为一类与其他类的一种二类分类模型,分离间隔最大而区别于感知机。

适用于:

  1. 数据可直接分为两类(采用error-correcting output codes 方法区分多类);
  2. 高维不能线性可分的数据;
  3. 简单分类。

支持向量机类别:

  • 线性可分支持向量机(linear support vector machine in linearly separable case)——硬间隔最大化(hard margin maximization)
  • 线性支持向量机(linear support vector machine)——软间隔最大化(soft margin maximization)
  • 非线性支持向量机(non-linear support vector machine)——核技巧(kernel trick)

2 算法步骤

2.1 线性可分支持向量机

线性分类器可知:一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程可以表示为:
wTx+b=0w^Tx+b=0 wTx+b=0


分离超平面:w∗⋅x+b∗=0w^*\cdot x+b^*=0w∗⋅x+b∗=0

分类决策函数:
f(x)=sign(w∗⋅x+b∗)=>{H1:w0+w1x1+w2x2≥1for yi=+1,H2:w0+w1x1+w2x2≤1for yi=−1.=>yi(w0+w1x1+w2x2)≥1f(x)=\mathrm{sign}(w^*\cdot x+b^*) => \left\{ \begin{array}{rl} H_1: w_0+w_1x_1+w_2x_2 \geq 1 & \text{for } y_i=+1,\\ H_2: w_0+w_1x_1+w_2x_2 \leq 1 & \text{for } y_i=-1.\\ \end{array} \right.\\ \qquad =>y_i(w_0+w_1x_1+w_2x_2) \geq 1 f(x)=sign(w∗⋅x+b∗)=>{H1​:w0​+w1​x1​+w2​x2​≥1H2​:w0​+w1​x1​+w2​x2​≤1​for yi​=+1,for yi​=−1.​=>yi​(w0​+w1​x1​+w2​x2​)≥1

函数间隔(functional margin):γ^=min⁡i=1,...,Nγ^i\hat{\gamma}=\min \limits_{i=1,...,N} \hat{\gamma}_iγ^​=i=1,...,Nmin​γ^​i​

对于样本点(xi,yi)(x_i,y_i)(xi​,yi​) ,γ^i=yi(w⋅xi+b)\hat{\gamma}_i=y_i(w \cdot x_i+b )γ^​i​=yi​(w⋅xi​+b)。

几何间隔(geometric margin):γ=min⁡i=1,...,Nγi=γ^∥w∥\gamma=\min \limits_{i=1,...,N}\gamma_i=\frac{\hat{\gamma}}{\parallel w \parallel}γ=i=1,...,Nmin​γi​=∥w∥γ^​​

对于样本点(xi,yi)(x_i,y_i)(xi​,yi​) ,γi=yi(w∥w∥⋅xi+b∥w∥)=γ^i∥w∥\gamma_i=y_i(\frac{w}{\parallel w \parallel} \cdot x_i+ \frac{b}{\parallel w \parallel})=\frac{\hat{\gamma}_i}{\parallel w \parallel}γi​=yi​(∥w∥w​⋅xi​+∥w∥b​)=∥w∥γ^​i​​

支持向量:

欲找到具有最大间隔的划分超平面,也就是是 γ\gammaγ 最大,即:
max⁡w,b2∥w∥s.t.yi(wT⋅xi+b)≥1,i=1,2,...,m.\max \limits_{w,b} \ \ \frac{2}{\parallel w \parallel} \\ s.t. \ \ y_i(w^T \cdot x_i+b) \ge 1, \ i=1,2,...,m. w,bmax​  ∥w∥2​s.t.  yi​(wT⋅xi​+b)≥1, i=1,2,...,m.
最大间隔分类器就是我们求取的分类超平面, 等于max⁡(最大间隔)\max(最大间隔)max(最大间隔), 而函数间隔假设为1,就可得到最大间隔超平面: max⁡1∥w∥\max \frac{1}{\parallel w \parallel}max∥w∥1​, 而约束条件是因为函数间隔是所有样本点的间隔函数中最小值。

2.2 SVM的二次凸函数和约束条件

支持向量机的学习策略是间隔最大化,可形式化为一个求解凸二次规划(convex quadratic programming).

仅需最大化∥w∥−1\parallel w \parallel^{-1}∥w∥−1,这等价于最小化∥w∥2\parallel w \parallel^{2}∥w∥2。于是,上式可重写为:
(1)min⁡w,b12∥w∥2s.t.yi(wT⋅xi+b)≥1,i=1,2,...,m.\min \limits_{w,b} \ \ \frac{1}{2}\parallel w \parallel^2 \qquad s.t. \ \ y_i(w^T \cdot x_i+b) \ge 1, \ i=1,2,...,m. \tag{1} w,bmin​  21​∥w∥2s.t.  yi​(wT⋅xi​+b)≥1, i=1,2,...,m.(1)
这是支持向量机的基本型,其本身为一个凸二次规划问题。

使用拉格朗日乘子法可得到其“对偶问题”(dual problem),其拉格朗日函数可写为:
(2)L(ω,b,α)=12∥ω∥2+∑i=1mαi(1−yi(ωTxi+b))L(\omega ,b, \alpha )=\frac{1}{2}\left \| \omega \right \|^2+\sum \limits_{i=1}^m \alpha _i(1-y_i(\omega ^T x_i+b)) \tag{2} L(ω,b,α)=21​∥ω∥2+i=1∑m​αi​(1−yi​(ωTxi​+b))(2)
其中αi\alpha_iαi​是拉格朗日乘子。

利用对偶性的结论, 对L(ω,b,α)L(\omega,b,\alpha)L(ω,b,α)关于ω\omegaω和bbb求偏导数:
(3)∂L∂ω=0⇒ω=∑i=1nαixiyi∂L∂b=0⇒∑i=1nαiyi=0\frac{\partial L}{\partial \omega}=0 \Rightarrow \omega = \sum \limits_{i=1}^n \alpha _i x_i y_i \\ \frac{\partial L}{\partial b}=0 \Rightarrow \sum \limits_{i=1}^n \alpha _i y_i = 0 \tag{3} ∂ω∂L​=0⇒ω=i=1∑n​αi​xi​yi​∂b∂L​=0⇒i=1∑n​αi​yi​=0(3)
将上式带入式(2)中,可得式(1)的对偶问题:
(4)max⁡α∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjxiTxjs.t.∑i=1mαiyi=0,αi≥0,i=1,2,...,m\max \limits_{\alpha }\sum \limits_{i=1}^m \alpha _i - \frac{1}{2}\sum \limits_{i=1}^m \sum \limits_{j=1}^m \alpha _i\alpha _j y_i y_j x_i^T x_j \\ s.t. \ \sum \limits_{i=1}^m \alpha _i y_i=0, \ \alpha _i \ge 0, i=1,2,...,m \tag{4} αmax​i=1∑m​αi​−21​i=1∑m​j=1∑m​αi​αj​yi​yj​xiT​xj​s.t. i=1∑m​αi​yi​=0, αi​≥0,i=1,2,...,m(4)
实际任务中,求解式(4)会造成很大的开销,**SMO(Sequential Minimal Optimization)**是一种求解的高效算法。

SMO 算法是支持向量机学习的一种快速算法,其特点是不断地将原二次规划问题分解为只有两个变量的二次规划子问题,并对子问题进行解析求解,直到所有变量满足 KKT 条件为止。

SMO的基本思路类似动态规划, 也是一种启发式算法,它将原优化问题分解为多个小优化问题来求解,并且对这些小优化问题进行顺序求解得到的结果作为作为整体的结果。

解出 α\alphaα 后,求出 ω\omegaω 与 bbb 即可得到模型
f(x)=ωTx+b=∑i=1mαiyixiTx+bf(x) = \omega ^T x+b = \sum \limits_{i=1}^m \alpha _i y_i x_i^Tx+b f(x)=ωTx+b=i=1∑m​αi​yi​xiT​x+b
因式(1)中有不等式约束,上述过程需满足KKT(Karush-Kuhn-Tucker)条件,即要求:
{αi≥0;yif(xi)−1≥0;αi(yif(xi)−1)=0.\left\{ \begin{array}{rl} & \alpha _i\ge 0 ; \\ & y_if(x_i)-1 \ge 0; \\ & \alpha _i(y_if(x_i)-1)=0. \end{array} \right. ⎩⎨⎧​​αi​≥0;yi​f(xi​)−1≥0;αi​(yi​f(xi​)−1)=0.​

2.3 非线性类问题——核技巧(kernel trick)

先来看一个视频,直观感受一下:SVM with polynomial 可视化

对于原始样本空间不是线性可分的情况,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分。如果原始空间是有限维,即属性数有限,那么一定存在一个高维特征空间使样本可分。

令 ϕ(x)\phi(x)ϕ(x) 表示将 xxx 映射后的特征向量,于是,在特征空间中划分超平面所对应的模型可表示为:
f(x)=ωTϕ(x)+bf(x) = \omega ^T \phi(x)+b f(x)=ωTϕ(x)+b
类似式(1),有:
min⁡w,b12∥w∥2s.t.yi(wTϕ(xi)+b)≥1,i=1,2,...,m.\min \limits_{w,b} \ \ \frac{1}{2}\parallel w \parallel^2 \qquad s.t. \ \ y_i(w^T \phi(x_i) +b) \ge 1, \ i=1,2,...,m. w,bmin​  21​∥w∥2s.t.  yi​(wTϕ(xi​)+b)≥1, i=1,2,...,m.
其对偶问题是:
max⁡α∑i=1mαi−12∑i=1m∑j=1mαiαjyiyjϕ(xi)Tϕ(xj)s.t.∑i=1mαiyi=0,αi≥0,i=1,2,...,m\max \limits_{\alpha }\sum \limits_{i=1}^m \alpha _i - \frac{1}{2}\sum \limits_{i=1}^m \sum \limits_{j=1}^m \alpha _i\alpha _j y_i y_j \phi(x_i)^T \phi(x_j) \\ s.t. \ \sum \limits_{i=1}^m \alpha _i y_i=0, \ \alpha _i \ge 0, i=1,2,...,m αmax​i=1∑m​αi​−21​i=1∑m​j=1∑m​αi​αj​yi​yj​ϕ(xi​)Tϕ(xj​)s.t. i=1∑m​αi​yi​=0, αi​≥0,i=1,2,...,m
若遇到高维或无穷维问题,求解 ϕ(xi)Tϕ(xj)\phi(x_i)^T \phi(x_j)ϕ(xi​)Tϕ(xj​) 会很困难,而利用核函数 κ(⋅,⋅)\kappa(\cdot,\cdot)κ(⋅,⋅) ,可避免这个问题:
κ(xi,xj)=⟨ϕ(xi),ϕ(xj)⟩=ϕ(xi)Tϕ(xj)\kappa(x_i,x_j)=\left \langle \phi(x_i),\phi(x_j) \right \rangle=\phi(x_i)^T \phi(x_j) κ(xi​,xj​)=⟨ϕ(xi​),ϕ(xj​)⟩=ϕ(xi​)Tϕ(xj​)
求解后即可得到:
f(x)=ωTϕ(x)+b=∑i=1mαiyiϕ(xi)Tϕ(xj)+b=∑i=1mαiyiκ(x,xi)+bf(x) = \omega ^T \phi(x)+b = \sum \limits_{i=1}^m \alpha _i y_i \phi(x_i)^T \phi(x_j)+b = \sum \limits_{i=1}^m \alpha _i y_i \kappa(x,x_i) + b f(x)=ωTϕ(x)+b=i=1∑m​αi​yi​ϕ(xi​)Tϕ(xj​)+b=i=1∑m​αi​yi​κ(x,xi​)+b
常用核函数

名称 表达式 参数
线性核 κ(xi,xj)=xiTxj\kappa(x_i,x_j)=x_i^Tx_jκ(xi​,xj​)=xiT​xj​
多项式核 κ(xi,xj)=(xiTxj)d\kappa(x_i,x_j)=(x_i^Tx_j)^dκ(xi​,xj​)=(xiT​xj​)d d≥1d \ge1d≥1 为多项式的次数
高斯核 κ(xi,xj)=exp⁡(−∥xi−xj∥22σ2)\kappa(x_i,x_j)= \exp (-\frac{\left \| x_i - x_j \right \|^2}{2 \sigma^2})κ(xi​,xj​)=exp(−2σ2∥xi​−xj​∥2​) σ>0\sigma>0σ>0 为高斯核的带宽(width)
拉普拉斯核 κ(xi,xj)=exp⁡(−∥xi−xj∥σ)\kappa(x_i,x_j)=\exp (-\frac{\left \| x_i -x_j\right \|}{\sigma})κ(xi​,xj​)=exp(−σ∥xi​−xj​∥​) σ>0\sigma>0σ>0
Sigmoid 核 κ(xi,xj)=tanh⁡(βxiTxj+θ)\kappa(x_i,x_j)=\tanh(\beta x_i^Tx_j+\theta)κ(xi​,xj​)=tanh(βxiT​xj​+θ) tanh⁡\tanhtanh 为双曲正切函数,β&gt;0,θ&lt;0\beta&gt;0,\theta&lt;0β>0,θ<0

3 算法实现

麦子学院:深度学习基础介绍-机器学习

# SVM算法用于人脸识别步骤
# 1. 加载名人库数据,并获取数据参数
# 2. 将数据划分为训练集与测试集
# 3. 以数据样本做PCA降维
# 4. 建立SVM模型
# 5. 模型评估及可视化from __future__ import print_functionfrom time import time             # 用于每一步的计时
import logging                      # 打印程序进展信息
import matplotlib.pyplot as plt     # 绘图from sklearn.model_selection import train_test_split    # 训练集测试集分开
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import RandomizedPCA
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.svm import SVCprint(__doc__)# Display progress logs on stdout 在标准输出上显示进度日志
logging.basicConfig(level=logging.INFO, format=' %(asctime)s %(message)s')##########################################################################
# Download the data, if not already on disk and load it as numpy arrays
# 如果磁盘上没有的话下载数据,并将其以向量格式加载
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)   # 下载名人数据集,lfw_people类似于字典结构# introspect the images arrays to find the shapes (for plotting)
# 内省图像数组以找到形状(用于绘图)
n_samples, h, w =lfw_people.images.shape   # 返回样本数# for machine learning we use the 2 data directly (as relative pixel)
# positions info is ignored by this model
# 对于机器学习我们直接使用2个数据(作为相对像素)
# 此模型会忽略位置信息
X = lfw_people.data    # 提取特征属性,每一行是一个实例,每一列是一个特征值
n_features = X.shape[1]    # 获取维度,返回列数# the label to predict is the id of the person
y = lfw_people.target                  # 返回对应数据集的标记
target_names = lfw_people.target_names # 返回类别名字
n_classes = target_names.shape[0]      # 获得人脸识别数量print("Total dataset size:")
print("n_samples: %d" % n_samples)        # 打印实例个数
print("n_features: %d" % n_features)  # 打印特征向量个数
print("n_classes: %d" % n_classes)        # 打印人脸识别数量(类)#########################################################################
# Split into a training set and a test set using a stratified k fold# split into a training and testing set 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)###########################数据降维######################################
# Compute a PCA (eigenfaces) on the face dataset (treated as unlabeled
# datadet): unsupervised feature extrction / dimensionality reduction
n_components = 150 # 主成元素数量print("Extrcting the top %d eigenfaces from %d faces"% (n_components, X_train.shape[0]))
t0 = time()
pca = RandomizedPCA(n_components=n_components, whiten=True).fit(X_train) # 调用随机PCA方法,用X_train矩阵进行建模
print("done in %0.3fs" % (time() - t0))eigenfaces = pca.components_.reshape((n_components, h, w))    # 人脸识别中提取特征值print("Projecting the input data on the eigenfaces orthonoemal basis")
t0 = time()
X_train_pca = pca.transform(X_train)   # 通过PCA将X_train转化为一个低维矩阵
X_test_pca = pca.transform(X_test)     # 通过PCA将X_test 转化为一个低维矩阵
print("done in %0.3fs" % (time() - t0))#########################################################################
# Train a SVM classification model 建立SVM模型print("Fitting the classifier to the training set")
t0 = time()
param_grid = {'C':[1e3, 5e3, 1e4, 5e4, 1e5],'gamma':[0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }       # C:penalty 惩罚项,gamma:针对核函数特征点使用比例
clf = GridSearchCV(SVC(kernel='rbf', class_weight=None), param_grid)   # 遍历各种组合,rbf针对图像
clf = clf.fit(X_train_pca, y_train)
print("done in %0.3fs" % (time() - t0))
print("Best estimator found by grid search:")
print(clf.best_estimator_)  # 打印最优组合###########################评估+可视化##########################################
# Quantitative evaluation of the model quality on the test setprint("Predicting people's names on the test set")
t0 = time()
y_pred = clf.predict(X_test_pca)   # 预测新数据
print("done in %0.3fs" % (time() - t0))print(classification_report(y_test, y_pred, target_names=target_names))   # 真实标签与预测标签作比较
print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))       # 建立矩阵,对角线为预测正确###############################################################################
# Qualitative evaluation of the predictions using matplotlibdef plot_gallery(images, titles, h, w, n_row=3, n_col=4): # 绘图"""Helper function to plot a gallery of portraits"""plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))       # 建立一个图plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)for i in range(n_row * n_col):plt.subplot(n_row, n_col, i + 1)plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)plt.title(titles[i], size=12)plt.xticks(())plt.yticks(())# plot the result of the prediction on a portion of the test setdef title(y_pred, y_test, target_names, i): # 将预测与实际标签打印出来pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]return 'predicted: %s\n true:      %s' % (pred_name, true_name)prediction_titles = [title(y_pred, y_test, target_names, i)for i in range(y_pred.shape[0])]plt.figure(1)
plot_gallery(X_test, prediction_titles, h, w)# plot the gallery of the most significative eigenfaces 绘制提取出的特征值的图plt.figure(2)
eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)plt.show()

输出:

输入图像 输出图像
                   precision    recall  f1-score   supportAriel Sharon       0.52      0.61      0.56        18Colin Powell       0.75      0.84      0.80        58Donald Rumsfeld       0.82      0.70      0.75        33George W Bush       0.88      0.87      0.88       133
Gerhard Schroeder       0.76      0.73      0.75        26Hugo Chavez       0.95      0.75      0.84        24Tony Blair       0.78      0.83      0.81        30avg / total       0.82      0.81      0.81       322[[ 11   4   0   2   1   0   0][  1  49   2   4   0   0   2][  3   2  23   5   0   0   0][  4   6   2 116   2   1   2][  0   1   1   2  19   0   3][  1   3   0   1   1  18   0][  1   0   0   2   2   0  25]]

参考资料:

[1] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.

[2] 李航. 统计学习方法[M]. 清华大学出版社, 2012.

[3] 麦子学院:深度学习基础介绍-机器学习:http://www.maiziedu.com/course/373/

[4] 知乎:支持向量机(SVM)是什么意思?

支持向量机算法与实现相关推荐

  1. 支持向量机算法原理简介

    1,支持向量机概念简介 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向量机本身便是一种监督式学习的方法,它广泛的应用于统计分类以及回归分析中 ...

  2. 古老的spc也可以用机器学习(三)-支持向量机算法

    大家都很清楚SPC的中文叫统计过程控制,它的作用是发现过程数据中的异常行为,SPC有8种以上的判异规则,每一中判异规则对应可能的异常原因,非常实用. 现在大数据.机器学习应用越来越广泛,而机器学习算法 ...

  3. Python+sklearn使用支持向量机算法实现数字图片分类

    关于支持向量机的理论知识,大家可以查阅机器学习之类的书籍或网上资源,本文主要介绍如何使用Python扩展库sklearn中的支持向量机实现数字图片分类. 1.首先编写代码生成一定数量的含有数字的图片 ...

  4. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  5. 机器学习之支持向量机算法(二)

    五.SVM求解实例 上面其实已经得出最终的表达式了,下面我们会根据一些具体的点来求解α的值.数据:3个点,其中正例 X1(3,3) ,X2(4,3) ,负例X3(1,1) 如下图所示 我们需要求解下式 ...

  6. SVM支持向量机算法做预测,matlab,预测精度非常高

    SVM支持向量机算法做预测,matlab,预测精度非常高! 预测结果评价指标: RMSE = 179.6986 MSE = 32291.5755 MAE = 108.5571 MAPE = 0.035 ...

  7. 机器学习算法系列(十四)-硬间隔支持向量机算法(Hard-margin Support Vector Machine)

    阅读本文需要的背景知识点:拉格朗日乘子法.KKT条件.一丢丢编程知识 一.引言   前面一节我们介绍了一种分类算法--朴素贝叶斯分类器算法,从概率分布的角度进行分类.下面我们会花几节来介绍另一种在分类 ...

  8. SVM 支持向量机算法(Support Vector Machine )【Python机器学习系列(十四)】

    SVM 支持向量机算法(Support Vector Machine )[Python机器学习系列(十四)] 文章目录 1.SVM简介 2. SVM 逻辑推导 2.1 Part1 化简限制条件 2.2 ...

  9. 支持向量机算法在网络安全中的应用

    本文是研究生课的一次大作业,本文介绍的支持向量机仅仅是支持向量机算法的第一层理解,想要深入理解,请看看支持向量机的三层理解. 1:支持向量机算法介绍 近年来,在网络安全方面AI和机器学习的出现,极大的 ...

  10. 机器学习之支持向量机算法

    支持向量机算法 概述 原理 SVC, NuSVC 和 LinearSVC 能在数据集中实现多元分类. 非均衡问题 案例:对数据进行分类. 优势 缺点 svc NuSVC LinearSVC examp ...

最新文章

  1. JavaScript知识总结
  2. 济南学习 Day2 T2 am
  3. 为什么下一个十年的主战场在Serverless | 云原生Talk
  4. 使用maven构建项目候,jar包错误的解决办法
  5. 在windows下编译FFMPEG-最新2009版本
  6. php如何控制用户数,PHP统计当前在线用户数实例讲解
  7. 图:[营养美食知识竞赛-PPT双屏技术策划]浙江海洋学院营养美食知识竞赛结束.
  8. 基于R语言分析决策树和随机森林(1)
  9. MFC功能扩展控件BCGSuite for MFC入门指南
  10. 关于Navicat连接本地数据库失败,报错2003
  11. 【渝粤题库】陕西师范大学165111 薪酬管理 作业(高起专)
  12. STM32+多片AD7705+双通道采集热电偶
  13. 如何选择深度学习的GPU
  14. office 向程序发送命令时出现问题
  15. 如何解决chrome浏览器地址栏变黑色(chrome搜索栏变黑)(mac电脑)
  16. 加快打造“云上贵州”,靠大数据实现“后发赶超”
  17. 教你如何快速识别好固态硬盘?
  18. 云服务器系统结构图,云服务器系统结构图
  19. SQL判断某列中是否包含中文字符或者英文字符
  20. 【微机原理与接口技术】之一微型计算机系统概述

热门文章

  1. 浅谈js中的var和function变量提升,var声明变量提升,块级作用域中的函数提升
  2. centos卸载软件
  3. perl linux卸载,CentOS下使用perl批量卸载软件
  4. QQ浏览器信息流云原生应用之路
  5. 什么是(菲劳申请)冻结菲劳的申请 是什么意思
  6. 生存分析(survival analysis)
  7. 西班牙电信计划增持中国网通5.74%股权
  8. 【深度解析】Java中的乐观锁、悲观锁
  9. cesium draw点线面
  10. 有趣的图(六)(60)