一、SVM简介

SVM定义:支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。简言之,SVM就是一种二类分类模型,他的基本模型是定义在特征空间的间隔最大的线性分类器,SVM的学习策略就是间隔最大化。

支持向量机思想:为了把两组数据分开,在空心点的类别找到一个或多个点离实心点最近,在实心点中找到一个或多个点与空心点最近,分类实心和空心点取决于这些边界上的点而与离边界较远的点,即在分割两类别点的时候,只需要考虑支持向量,通过支持向量确定分割直线。假设此直线有宽度,左边贴合一个边界点,右边贴和另一组,实现把点分开并且宽度最大。关键取决于w方向,通过将x1、x2、x3三点代入wx+b=1/-1中求出w和b的值。推导过程如下:

向量内积知识点回顾:

二、SVM数学模型:

s.t.  ,……,n

h(x) = sign()   sign表示求符号

首先强调,在机器学习领域中没有一种算法或模型在所有情况下比其他的好。

在现实数据中分割很难分的很干净,会出现以下几种情况:

这时需要放宽标准,即创建带松弛变量的SVM数学模型:(每个样本都有一个,c如果很大,分割线会尽量满足原始SVM定义;c如果c很小则真正使松弛变量起作用)

   ——>    ——>  合页损失函数

Hinge Loss(合页损失函数)

合页损失函数的性质:

1、合页损失函数是凸函数,容易优化;

2、在自变量小于0的部分梯度比较小,对错误分类的惩罚较轻;

3、在自变量大于等于1的部分,值为0:只要对某个数据分类是正确的,并且正确的可能性足够高,那么就用不着针对这个数据进一步优化了;

4、在自变量等于0时不可导,需要分段求导;

5、使得在求解最优化时,只有支持向量会参与确定分界线,而且支持向量的个数远小于训练数据的个数。

三、求解SVM

求解SVM即求解w、b:

方法一:二次规划,经典运筹学的最优化问题,可以在多项式时间内求得最优解(Python中有工具包)

方法二:转换为对偶问题

四、扩展SVM到支持多个类别

由于SVM是一种二元分类器,即用一条线或一个平面分开两类不同数据,如何让其支持多个类别呢?

方法一:OVR(one wersus rest)对于K个类别的情况,训练K个SVM,第j个SVM用于判断任意条数据是属于类别j还是类别非j。预测的时候,具有最大值的表示给定的数据x属于类别i。

方法二:OVO(one versus one),对于K个类别的情况,训练K*(K-1)/2个SVM,每一个SVM只用于判断任意条数据是属于K中的特定两个类别。预测的时候,使用K*(K-1)/2个SVM做K*(K-1)/2次预测,使用计票的方式决定数据被分类为哪个类别的次数最多,就认为数据x属于此类别。

五、核函数

为什么要使用核函数——处理线性不可分情况。

显然在这种情况下我们需要非线性分类器,线性分类器无法解决这种特殊情况。解决方法是将特征映射到更高的维度,如下图所示:

成为核函数的条件:1、为对称矩阵;2、为半正定矩阵

六、SVM总结

1、SVM专注于找最优分界线,用于减小过拟合;

2、核函数的应用使得SVM可以高效的用于非线性可分的情况;

优点:

  • 模型只需要保存支持向量, 模型占用内存少, 预测快.
  • 分类只取决于支持向量, 适合数据的维度高的情况, 例如DNA数据

缺点:

  • 训练的时间复杂度为  或者至少 , 当数据量巨大时候不合适使用。
  • 需要做调参C当数据量大时非常耗时间。

七、实例

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats# use seaborn plotting defaults
import seaborn as sns; sns.set()

创建模拟数据集

from sklearn.datasets.samples_generator import make_blobs
X, y = make_blobs(n_samples=50, centers=2,random_state=0, cluster_std=0.60)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn');

可以有多种方法分类

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')for m, b in [(1, 0.65), (0.5, 1.6), (-0.2, 2.9)]:plt.plot(xfit, m * xfit + b, '-k')plt.xlim(-1, 3.5);

SVM: 假想每一条分割线是有宽度的

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:yfit = m * xfit + bplt.plot(xfit, yfit, '-k')plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none',color='#AAAAAA', alpha=0.4)plt.xlim(-1, 3.5);

在SVM的框架下, 认为最宽的线为最优的分割线

训练SVM

使用线性SVM和比较大的 C


from sklearn.svm import SVC # "Support vector classifier"
model = SVC(kernel='linear', C=1E10)
model.fit(X, y)
SVC(C=10000000000.0, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape='ovr', degree=3, gamma='auto_deprecated',kernel='linear', max_iter=-1, probability=False, random_state=None,shrinking=True, tol=0.001, verbose=False)

创建一个显示SVM分割线的函数

def plot_svc_decision_function(model, ax=None, plot_support=True):"""Plot the decision function for a 2D SVC"""if ax is None:ax = plt.gca()xlim = ax.get_xlim()ylim = ax.get_ylim()# create grid to evaluate modelx = np.linspace(xlim[0], xlim[1], 30)y = np.linspace(ylim[0], ylim[1], 30)Y, X = np.meshgrid(y, x)xy = np.vstack([X.ravel(), Y.ravel()]).TP = model.decision_function(xy).reshape(X.shape)# plot decision boundary and marginsax.contour(X, Y, P, colors='k',levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])# plot support vectorsif plot_support:ax.scatter(model.support_vectors_[:, 0],model.support_vectors_[:, 1],s=300, linewidth=1, facecolors='none');ax.set_xlim(xlim)ax.set_ylim(ylim)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(model);

model.support_vectors_
array([[0.44359863, 3.11530945],[2.33812285, 3.43116792],[2.06156753, 1.96918596]])

非支持向量的数据, 对分割线没有影响

只有支持向量会影响分割线, 如果我们添加一些非支持向量的数据, 对分割线没有影响

def plot_svm(N=10, ax=None):X, y = make_blobs(n_samples=200, centers=2,random_state=0, cluster_std=0.60)X = X[:N]y = y[:N]model = SVC(kernel='linear', C=1E10)model.fit(X, y)ax = ax or plt.gca()ax.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')ax.set_xlim(-1, 4)ax.set_ylim(-1, 6)plot_svc_decision_function(model, ax)fig, ax = plt.subplots(1, 2, figsize=(16, 6))
fig.subplots_adjust(left=0.0625, right=0.95, wspace=0.1)
for axi, N in zip(ax, [60, 120]):plot_svm(N, axi)axi.set_title('N = {0}'.format(N))

使用SVM进行人脸识别

from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people(min_faces_per_person=60)
print(faces.target_names)
print(faces.images.shape)
['Ariel Sharon' 'Colin Powell' 'Donald Rumsfeld' 'George W Bush''Gerhard Schroeder' 'Hugo Chavez' 'Junichiro Koizumi' 'Tony Blair']
(1348, 62, 47)

人脸实例

fig, ax = plt.subplots(3, 5)
for i, axi in enumerate(ax.flat):axi.imshow(faces.images[i], cmap='bone')axi.set(xticks=[], yticks=[],xlabel=faces.target_names[faces.target[i]])

每一幅图的尺寸为 [62×47] , 大约 3000 个像素值

我们可以将整个图像展平为一个长度为3000左右的一维向量, 然后使用这个向量做为特征. 通常更有效的方法是通过预处理提取图像最重要的特征. 一个重要的特征提取方法是PCA(主成分分析), 可以将一副图像转换为一个长度为更短的(150)向量.

from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
pca = PCA(n_components=150, whiten=True, random_state=42)
svc = SVC(kernel='linear', class_weight='balanced')
model = make_pipeline(pca, svc)

将数据分为训练和测试数据集

from sklearn.model_selection import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(faces.data, faces.target,random_state=42)

调参:通过交叉验证寻找最佳的 C (控制间隔的大小)

from sklearn.model_selection import GridSearchCVparam_grid = {'svc__C': [1, 5, 10, 50]}
grid = GridSearchCV(model, param_grid)%time grid.fit(Xtrain, ytrain)
print(grid.best_params_)

CPU times: user 7.56 s, sys: 157 ms, total: 7.72 s Wall time: 3.98 s {'svc__C': 1}

model = grid.best_estimator_
yfit = model.predict(Xtest)

使用训练好的SVM做预测

fig, ax = plt.subplots(4, 6)
for i, axi in enumerate(ax.flat):axi.imshow(Xtest[i].reshape(62, 47), cmap='bone')axi.set(xticks=[], yticks=[])axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],color='black' if yfit[i] == ytest[i] else 'red')
fig.suptitle('Predicted Names; Incorrect Labels in Red', size=14);

生成性能报告

from sklearn.metrics import classification_report
print(classification_report(ytest, yfit,target_names=faces.target_names))
                   precision    recall  f1-score   supportAriel Sharon       0.62      0.67      0.65        15Colin Powell       0.74      0.84      0.79        68Donald Rumsfeld       0.74      0.81      0.77        31George W Bush       0.85      0.79      0.82       126
Gerhard Schroeder       0.75      0.78      0.77        23Hugo Chavez       0.93      0.70      0.80        20
Junichiro Koizumi       0.92      0.92      0.92        12Tony Blair       0.81      0.83      0.82        42micro avg       0.80      0.80      0.80       337macro avg       0.80      0.79      0.79       337weighted avg       0.80      0.80      0.80       337

混淆矩阵

from sklearn.metrics import confusion_matrix
mat = confusion_matrix(ytest, yfit)
sns.heatmap(mat.T, square=True, annot=True, fmt='d', cbar=False,xticklabels=faces.target_names,yticklabels=faces.target_names)
plt.xlabel('true label')
plt.ylabel('predicted label');

——以上为笔者在贪心学院《机器学习特训营》第五章课程中的学习笔记

SVM支持向量机+实例展示相关推荐

  1. OpenCV支持向量机SVM的实例(附完整代码)

    OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 #include <opencv2/core.hpp> #include < ...

  2. OpenCV SVM支持向量机和KNearest数字识别的实例(附完整代码)

    OpenCV SVM支持向量机和KNearest数字识别的实例 OpenCV SVM支持向量机和KNearest数字识别的实例 OpenCV SVM支持向量机和KNearest数字识别的实例 #inc ...

  3. 支持向量机SVM详细原理,Libsvm工具箱详解,svm参数说明,svm应用实例,神经网络1000案例之15

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的股票价格预测 支持向量机SVM的详细原理 SVM的定义 ...

  4. 网格向量必须包含特征点。_【专题研究】基于SVM支持向量机模型的选股策略

    研究过集成学习中的随机森林和XGBoost后,本文将介绍一种更传统的机器学习方法:SVM支持向量机.SVM由于其较高的准确度,并且能够解决非线性分类问题,曾一度成为非常流行的机器学习算法.本文分别介绍 ...

  5. SVM支持向量机详解

    支持向量机 支持向量机 优化目标 大边界 大边界分类背后的数学 核函数 使用SVM 什么时候使用SVM 支持向量机(Support Vector Machine)是一个广泛应用于工业界和学术界的算法. ...

  6. SVM支持向量机通俗导论(理解SVM的三层境界)

    神文 转自july:http://blog.csdn.net/v_july_v/article/details/7624837 支持向量机通俗导论(理解SVM的三层境界) 作者:July .致谢:pl ...

  7. 机器学习(MATLAB实现)——SVM支持向量机(一)

    SVM支持向量机 支持向量机理论概述 二分类支持向量机 多分类支持向量机 libsvm工具箱使用简介 训练函数 预测函数 libsvm参数实例 一点拓展 参考文献 支持向量机理论概述 核函数用于将支持 ...

  8. Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Support Vector Machines)

    Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Support Vector Machines) 文章目录 Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Su ...

  9. 惊呼——SVM支持向量机三重境界!

    转载自:原文 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个 ...

最新文章

  1. Linux下php5.3编译oracle客户端
  2. robots.txt网站爬虫文件设置
  3. 动手---sbt(2)
  4. 如何在 20 分钟内给你的 K8s PaaS 上线一个新功能?
  5. FLEX+Delphi,FLEX+Java,FLEX+C# 的聊天室
  6. pandas数据可视化_5利用Pandas进行强大的可视化以进行数据预处理
  7. asp命令执行语句】_2分钟教你使用ASP.NET CORE创建并发布网页应用
  8. .NET Core 如何调试 CPU 爆高?
  9. leetcode718 最长重复子数组
  10. NAS、DAS和SAN三种存储究竟是什么?
  11. vsftp tomcat jdk
  12. MySql常用SQL语句
  13. 用计算机软件绘制思维导图,电脑软件绘制思维导图操作教程分享
  14. 图片转svg并动态修改其颜色
  15. 计算机毕业设计django基于python学生考试成绩数据分析与可视化系统(源码+系统+mysql数据库+Lw文档)
  16. Gym - 101982E Cops And Robbers 网络流最小割
  17. TypeScript实现归并排序
  18. 无需训练,自动扩展的视觉Transformer来了
  19. 【GDKOI2014】JZOJ2020年8月13日提高组T3 壕壕的寒假作业
  20. Oracle (1) :服务端和客户端的安装与配置

热门文章

  1. Osbypass苹果手机激活锁停用Hello密码锁绕ID屏幕锁密码支持三网(移动、联通、电信)国行版手机解锁打电话4G等支持打电话、短信、4G上网、重启、通知、iCloud登录
  2. 解决迅雷敏感资源无法下载问题
  3. Kanzi基础---Kanzi基本概念
  4. Android进程保活(如何尽可能避免APP被杀死)
  5. mysql如何限制数据修改密码_MySQL_MySQL数据库中修改密码及访问限制设置详解,MySQL是一个真正的多用户、多 - phpStudy...
  6. 使用STM32 CUBE IDE配置STM32F7 用DMA传输多通道ADC数据
  7. 论文总结——Cluster Canonical Correlation Analysis
  8. (10.2.3.5)用windows体验sketch--为设计师准备的MAC OS安装指南
  9. Composer 基本使用方法
  10. 蒙泰 TPF 文件恢复