支持向量机(Support Vector Machine,SVM)是Corinna Cortes和Vapnik等于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。

在机器学习中,支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。

在机器学习中,支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。给定一组训练样本,每个标记为属于两类,一个SVM训练算法建立了一个模型,分配新的实例为一类或其他类,使其成为非概率二元线性分类。一个SVM模型的例子,如在空间中的点,映射,使得所述不同的类别的例子是由一个明显的差距是尽可能宽划分的表示。新的实施例则映射到相同的空间中,并预测基于它们落在所述间隙侧上属于一个类别。

除了进行线性分类,支持向量机可以使用所谓的核技巧,它们的输入隐含映射成高维特征空间中有效地进行非线性分类。

图C的容忍度比较大,效果较好

越胖越好

我们要求一个点到一个超平面的距离
wTx’=-b,wTx”=-b
法向量w垂直于超平面就一定垂直于超平面上的线,于是w垂直于x”-x’
有wT(x”-x’)=0
向量x-x’映射到w单位方向上即x到平面距离
distance(x,b,w)=|wT/||w| * |(x-x’)|=1/||w||*|wTx+b|

数据集(x1,y1)(x2,y2)到(xn,yn)
Y为样本的类别,
当x为正例的时候Y=+1
当x为负例的时候Y=-1
y(x)=wT*φ(x)+b

y={1 如果w.z+b>0 -1如果w.z+b<0
保证预测值和真实值的乘积是正数

接下来我们要找所有样本中离切平面最近的点使它离切平面的距离最远

通过放缩乘1化简式子
下一步需要把求极大值转换成求极小值

很简单,只要把求它的极大值转换成求它倒数的极小值就好了
在这里需要变换一下,因为求w的模不方便,所以变成求w的平方,而为了之后计算方便在前面再加个1/2,对式子是没有影响的
约束条件是:yi(wT·φ(xi)+b)>=1
表示必须在把点分的开的情况下才能求
约束条件变成拉格朗日乘子法的标准约束
1-yi(wT·φ(xi)+b)<=0
变换之后:
g(x)=1-yi(wT·φ(xi)+b)
要求解的问题就变成了f(x)+αg(x)的min

转换成对偶问题求解
最大值中最小的肯定比最小值中最大的要大
先求最小值,也就是求偏导

例子:

求最小值,直接求导

问题延伸:

当有个别不合群点的时候就放弃掉,因为绝大多数还是很听话的

同上,步骤省略了……

支持向量机中核函数的应用:

应用SMO算法求解支持向量机


其中(xi,yi)表示训练样本数据,xi为样本特征,yi∈{-1,1}为样本标签,C为惩罚系数由自己设定。上述问题是要求解N个参数(α1,α2,α3,……,αN),其他参数均为已知,有多种算法可以对上述问题求解,但是算法复杂度均很大。但1988年,由Platt提出的序列最小最优化算法(SMO)可以高效的求解上述SVM问题,它把原始求解N个参数二次规划问题分解成很多个
子二次规划问题分别求解,每个子问题只需要求解2个参数,方法类似于坐标上升,节省时间成本和降低了内存需求。每次启发式选择两个变量进行优化,不断循环,直到达到函数最优值。

Python实现:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormapdef plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):# setup marker generator and color mapmarkers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])# plot the decision surfacex1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)Z = Z.reshape(xx1.shape)plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())# plot class samplesfor idx, cl in enumerate(np.unique(y)):plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],alpha=0.8, c=cmap(idx),marker=markers[idx], label=cl)# highlight test samplesif test_idx:X_test, y_test = X[test_idx, :], y[test_idx]plt.scatter(X_test[:, 0], X_test[:, 1], c='', alpha=1.0, linewidth=1, marker='o', s=55, label='test set')
from sklearn import datasets
import numpy as np
from sklearn.cross_validation import train_test_splitiris = datasets.load_iris() # 由于Iris是很有名的数据集,scikit-learn已经原生自带了。
X = iris.data[:, [1, 2]]
y = iris.target # 标签已经转换成0,1,2了
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # 为了看模型在没有见过数据集上的表现,随机拿出数据集中30%的部分做测试# 为了追求机器学习和最优化算法的最佳性能,我们将特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit(X_train) # 估算每个特征的平均值和标准差
sc.mean_ # 查看特征的平均值,由于Iris我们只用了两个特征,所以结果是array([ 3.82857143,  1.22666667])
sc.scale_ # 查看特征的标准差,这个结果是array([ 1.79595918,  0.77769705])
X_train_std = sc.transform(X_train)
# 注意:这里我们要用同样的参数来标准化测试集,使得测试集和训练集之间有可比性
X_test_std = sc.transform(X_test)
X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))# 导入SVC
from sklearn.svm import SVC
svm1 = SVC(kernel='linear', C=0.1, random_state=0) # 用线性核
svm1.fit(X_train_std, y_train)svm2 = SVC(kernel='linear', C=10, random_state=0) # 用线性核
svm2.fit(X_train_std, y_train)fig = plt.figure(figsize=(10,6))
ax1 = fig.add_subplot(1,2,1)
#ax2 = fig.add_subplot(1,2,2)plot_decision_regions(X_combined_std, y_combined, classifier=svm1)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.title('C = 0.1')ax2 = fig.add_subplot(1,2,2)
plot_decision_regions(X_combined_std, y_combined, classifier=svm2)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.title('C = 10')plt.show()

svm1 = SVC(kernel='rbf', random_state=0, gamma=0.1, C=1.0) # 令gamma参数中的x分别等于0.1和10
svm1.fit(X_train_std, y_train) svm2 = SVC(kernel='rbf', random_state=0, gamma=10, C=1.0)
svm2.fit(X_train_std, y_train) fig = plt.figure(figsize=(10,6))
ax1 = fig.add_subplot(1,2,1)plot_decision_regions(X_combined_std, y_combined, classifier=svm1)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.title('gamma = 0.1')ax2 = fig.add_subplot(1,2,2)
plot_decision_regions(X_combined_std, y_combined, classifier=svm2)
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.title('gamma = 10')plt.show()

分类算法-支持向量机(SVM)相关推荐

  1. 支持向量机分类示例python_分类算法-支持向量机 SVM

    SVM(Support Vector Machine) 指的是支持向量机,是常见的一种判别方法.在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别.分类及回归分析.与其他算法相比,支持向量机 ...

  2. 机器学习中的算法-支持向量机(SVM)基础

    机器学习中的算法-支持向量机(SVM)基础 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处 ...

  3. 文本分类之支持向量机SVM详解(6)机器学习

    1 支持向量机介绍   对两类样本点进行分类,如下图,有a线.b线.c线三条线都可以将两类样本点很好的分开类,我们可以观察到b线将两类样本点分类最好,原因是我们训练出来的分类模型主要应用到未知样本中, ...

  4. 分类算法支持向量机(SVM) 简介与入门

    在二维平面上,把两类数据分开需要一条直线.到了3微空间,要把两类数据分开,就需要一个平面.把上述分类机制扩展到基本情形,在高维空间里,把两类数据分开,则需要一个超平面.直线和平面是超平面在2维和3维空 ...

  5. 模型算法-支持向量机SVM

    支持向量机(Support Vector Machine),一般简称SVM,它是个二分类的分类模型,即给定一个包含正例和反例的样本集合(有监督的机器学习算法),支持向量机的目的是寻找一个超平面来将样本 ...

  6. 机器学习-分类之支持向量机(SVM)原理及实战

    支持向量机(SVM) 简介 支持向量机(Support Vector Machine,SVM),是常见的一种判别方法.在机器学习领域,是一个监督学习模型,通常用来进行模式识别.分类及回归分析.与其他算 ...

  7. [机器学习算法]支持向量机SVM原理简介

    一.问题和超平面描述 给定训练集 分类学习最基本的想法就是基于训练集在样本空间中找到一个划分超平面,将不同类别的样本分开,但能将训练样本分开的划分超平面可能有很多,如下图所示: 直观来看,应该去找位于 ...

  8. 【机器学习】监督学习--(分类)支持向量机SVM②

    注:数据集在文章末尾 (1)SVM–线性分类 import numpy as np import matplotlib.pyplot as plt from sklearn import svm# 创 ...

  9. 【机器学习】监督学习--(分类)支持向量机SVM①

    SVM简单例子 from sklearn import svmx = [[3, 3], [4, 3], [1, 1]] y = [1, 1, -1]model = svm.SVC(kernel='li ...

最新文章

  1. matlab中的single是什么类型_MATLAB 中cell数据类型的使用方法
  2. 为什么德国人工作这么慢,但效率却很高?
  3. Html页面上输出不了PHP,在页面上直接输出未经解析的HTML源码
  4. 表分析oracle的作用,Oracle中分析表的作用
  5. 【笔试/面试】—— 计算一个数二进制形式中 0 的个数
  6. 关于java反射里的.class、.getClass()、Class.Forname()
  7. 【每日算法Day 70】图解算法:小学生都会的数块数问题,你会吗?
  8. 【NLP新闻-2013.06.16】Representative Reviewing
  9. android版本大于26,装包的API等级(targetSdkVersion)必须等于或高于26,请从新打包上传...
  10. [原]SyntaxError: invalid syntax 小问题
  11. Citrix XenApp工作原理
  12. phpdesigner8 php7.0,让getter和setter在phpDesigner8中运行
  13. 苹果开发者账号开启双重认证步骤
  14. 阿里云镜像下载docker
  15. node.js(二 --- events 、buffer、)
  16. CE扫雷20211031
  17. WEB前端项目实战/酒仙网开发-李强强-专题视频课程
  18. (一)移动端前端开发-移动端基础
  19. 张国荣 - 当爱已成往事
  20. 软件测试基础知识:按照测试实施组织,可将测试划分为开发方测试、用户测试、第三方测试。下面关于开发方测试的描述正确的是______。

热门文章

  1. python version 2.7 required,which was not found
  2. 深入浅出CMake(一):基础篇
  3. RDKit2018.03.3+Win10(64位):ImportError: DLL load failed: 找不到指定的模块。
  4. Ubuntu14.04下安装wechat(微信)
  5. 一个基于长数据转化为宽数据的小软件---data_tran.exe
  6. linux安装R包的安装
  7. 如何提取fasta文件的部分信息
  8. 基因结构图绘制-单个基因
  9. Fungal Diversity:70位作者共同修订真菌界担子菌门分类系统
  10. 中国首次纳米孔测序大会:不可错过的教学专场和技术诊断