基于机器学习支持向量机算法完成经典的图片分类任务

支持向量机简介

支持向量机属于机器学习的监督学习算法,它广泛的应用于统计分类以及回归分析中。在深度学习还未像今天这样火爆的时候,支持向量机被认为是最优秀的算法。其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

支持向量机做了一件什么事

支持向量机是一个二分类的算法,假设现在数据集样本有两个类别,分别为正类y=1和负类y=0,我们对这个数据集样本进行可视化,可以方便我们看到数据集的分布情况。

基于机器学习支持向量机算法完成经典的图片分类任务

数据集分布

现在我们需要通过一种算法来学习得到一条决策边界,这条决策边界能够分开数据集中的正负样本呢,就本例来看,我们可以得到无限条决策边界来分开数据集中的正负样本。

基于机器学习支持向量机算法完成经典的图片分类任务

两条决策边界

虽然可以找到无数条决策边界来帮助我们区分数据集中的正负样本,但是肯定有一条决策边界是最好的,这个最好的决策边界就是泛化能力最强的决策边界,它能够使新样本也能够很好的被分类,那么如上所示的两个决策边界究竟哪一个决策边界更好呢?

基于机器学习支持向量机算法完成经典的图片分类任务

预测一个新样本

现在我们添加一个新样本(箭头所指的),我们来看一下这个新样本是否被分类正确,如图所示我们可以看到左边的决策边界被分类正确,而右边的决策边界分类错误,这就说明分类边界虽然有很多,但是泛化能力是不一样的,所以我们可以认为(b)分类边界泛化能力强,而支持向量机算法就是通过对数据的学习以此来找到泛化能力最强的决策边界,这就是支持向量机所作的事情。

最好的决策边界

我们现在已经知道了支持向量机所作的事情就是寻找到一条泛化能力最好的决策边界,那么什么样的决策边界最好呢?

基于机器学习支持向量机算法完成经典的图片分类任务

决策边界

直观的来看最好的决策边界就是使得间隔2/||W||最大的,也就是说能够使得2/||W||最大化的决策边界就是最好的,而支持向量机算法就是找到这样的决策边界,这就是支持向量机算法的核心。

基于机器学习支持向量机算法完成经典的图片分类任务

基于机器学习支持向量机算法完成经典的图片分类任务

SVM算法完成分类

应用SVM进行分类的步骤如下:首先收集各个类的训练集和测试集,接着选择合适的用来分类的图像特征,从训练集中提取特征,然后用SVM分类器训练从而得到分类模型,最后通过模型对待分类图像进行分类。 支持向量机代码操作如下所示

svc = svm.SVC(C=C, gamma=gamma)
svc.fit(training[['X1', 'X2']], training['y'])
search.append(svc.score(cv[['X1', 'X2']], cv['y']))
best_score = search[np.argmax(search)]
best_param = combination[np.argmax(search)]
best_svc = svm.SVC(C=0.3, gamma=100)
best_svc.fit(training[['X1', 'X2']], training['y'])
ypred = best_svc.predict(cv[['X1', 'X2']])
print(metrics.classification_report(cv['y'], ypred))
if __name__ == "__main__":
 parameters = {'C': candidate, 'gamma': candidate}
 svc = svm.SVC()
 clf = GridSearchCV(svc, parameters, n_jobs=-1)
 clf.fit(training[['X1', 'X2']], training['y'])
 print (clf.best_params_)
 print (clf.best_score_)
 ypred = clf.predict(cv[['X1', 'X2']])
 print(metrics.classification_report(cv['y'], ypred))

可以简单的理解为支持向量机算法其实就是在寻找一个最大间隔的分割超平面,这样的模型具有最强大的预测能力。

相关推荐