支持向量机算法

  • 概述
  • 原理
    • SVC, NuSVC 和 LinearSVC 能在数据集中实现多元分类.
    • 非均衡问题
    • 案例:对数据进行分类。
  • 优势
  • 缺点
  • svc
  • NuSVC
  • LinearSVC
  • example
  • 使用诀窍

概述

  • 支持向量机(Support Vector Machines, SVM):是一种机器学习算法。 支持向量(Support Vector)就是离分隔超平面最近的那些点。 机(Machine)就是表示一种算法,而不是表示机器。

  • 当一个分类问题,数据是线性可分的,也就是用一根棍就可以将两种小球分开的时候,我们只要将棍的位置放在让小球距离棍的距离最大化的位置即可,寻找这个最大间隔的过程,就叫做最优化。但是,现实往往是很残酷的,一般的数据是线性不可分的,也就是找不到一个棍将两种小球很好的分类。这个时候,我们就需要像大侠一样,将小球拍起,用一张纸代替小棍将小球进行分类。想要让数据飞起,我们需要的东西就是核函数(kernel),用于切分小球的纸,就是超平面。

原理

1.寻求最优分类边界

正确:对大部分样本可以正确地划分类别。
泛化:最大化支持向量间距。
公平:与支持向量等距。
简单:线性,直线或平面,分割超平面。

2.基于核函数的升维变换
通过名为核函数的特征变换,增加新的特征,使得低维度空间中的线性不可分问题变为高维度空间中的线性可分问题。
线性核函数:linear,不通过核函数进行维度提升,仅在原始维度空间中寻求线性分类边界。
基于线性核函数的SVM分类相关API:

model = svm.SVC(kernel='linear')
model.fit(train_x, train_y)

SVC, NuSVC 和 LinearSVC 能在数据集中实现多元分类.

非均衡问题

这个问题期望给予某一类或某个别样例能使用的关键词 class_weight 和 sample_weight 提高权重(importance).

SVC (而不是 NuSVC) 在 fit 方法中生成了一个关键词 class_weight. 它是形如 {class_label : value} 的字典, value 是浮点数大于 0 的值, 把类 class_label 的参数 C 设置为 C * value.

SVC, NuSVC, SVR, NuSVR 和 OneClassSVM 在 fit 方法中通过关键词 sample_weight 为单一样例实现权重weights.与 class_weight 相似, 这些把第i个样例的参数 C 换成 C * sample_weight[i].

案例:对数据进行分类。

import numpy as np
import sklearn.model_selection as ms
import sklearn.svm as svm
import sklearn.metrics as sm
import matplotlib.pyplot as mp
x, y = [], []
data = np.loadtxt('../data/multiple2.txt', delimiter=',', dtype='f8')
x = data[:, :-1]
y = data[:, -1]
train_x, test_x, train_y, test_y = \ms.train_test_split(x, y, test_size=0.25, random_state=5)
# 基于线性核函数的支持向量机分类器
model = svm.SVC(kernel='linear')
model.fit(train_x, train_y)
n = 500
l, r = x[:, 0].min() - 1, x[:, 0].max() + 1
b, t = x[:, 1].min() - 1, x[:, 1].max() + 1
grid_x = np.meshgrid(np.linspace(l, r, n),np.linspace(b, t, n))
flat_x = np.column_stack((grid_x[0].ravel(), grid_x[1].ravel()))
flat_y = model.predict(flat_x)
grid_y = flat_y.reshape(grid_x[0].shape)
pred_test_y = model.predict(test_x)
cr = sm.classification_report(test_y, pred_test_y)
print(cr)
mp.figure('SVM Linear Classification', facecolor='lightgray')
mp.title('SVM Linear Classification', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray')
mp.scatter(test_x[:, 0], test_x[:, 1], c=test_y, cmap='brg', s=80)
mp.show()

优势

  • 在高维空间中非常高效.即使在数据维度比样本数量大的情况下仍然有效.
  • 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.
  • 通用性: 不同的核函数与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.

缺点

  • 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合,而且正则化项是非常重要的.
  • 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的.

在 scikit-learn 中,支持向量机提供 dense(numpy.ndarray ,可以通过 numpy.asarray 进行转换) 和 sparse (任何 scipy.sparse) 样例向量作为输出.然而,要使用支持向量机来对 sparse 数据作预测,它必须已经拟合这样的数据.使用 C 代码的 numpy.ndarray (dense) 或者带有 dtype=float64 的 scipy.sparse.csr_matrix (sparse) 来优化性能.

svc

  • SVC用于分类:支持向量分类,基于libsvm实现的,数据拟合的时间复杂度是数据样本的二次方,这使得他很难扩展到10000个数据集,当输入是多类别时(SVM最初是处理二分类问题的),通过一对一的方案解决,当然也有别的解决办法。

SVC参数说明如下:

C:惩罚项,float类型,可选参数,默认为1.0,C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。

kernel:核函数类型,str类型,默认为’rbf’。可选参数为:

  • ‘linear’:线性核函数
  • ‘poly’:多项式核函数
  • ‘rbf’:径像核函数/高斯核
  • ‘sigmod’:sigmod核函数
  • ‘precomputed’:核矩阵。precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,核矩阵需要为n*n的。

degree:多项式核函数的阶数,int类型,可选参数,默认为3。这个参数只对多项式核函数有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。

gamma:核函数系数,float类型,可选参数,默认为auto。只对’rbf’ ,’poly’ ,’sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features。
coef0:核函数中的独立项,float类型,可选参数,默认为0.0。只有对’poly’ 和,’sigmod’核函数有用,是指其中的参数c。

probability:是否启用概率估计,bool类型,可选参数,默认为False,这必须在调用fit()之前启用,并且会fit()方法速度变慢。

shrinking:是否采用启发式收缩方式,bool类型,可选参数,默认为True。

tol:svm停止训练的误差精度,float类型,可选参数,默认为1e^-3。

cache_size:内存大小,float类型,可选参数,默认为200。指定训练所需要的内存,以MB为单位,默认为200MB。

class_weight:类别权重,dict类型或str类型,可选参数,默认为None。给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数’balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。

verbose:是否启用详细输出,bool类型,默认为False,此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。

max_iter:最大迭代次数,int类型,默认为-1,表示不限制。

decision_function_shape:决策函数类型,可选参数’ovo’和’ovr’,默认为’ovr’。’ovo’表示one vs one,’ovr’表示one vs rest。

random_state:数据洗牌时的种子值,int类型,可选参数,默认为None。伪随机数发生器的种子,在混洗数据时用于概率估计。

NuSVC

NuSVC(Nu-Support Vector Classification.):核支持向量分类,和SVC类似,也是基于libsvm实现的,但不同的是通过一个参数空值支持向量的个数。

LinearSVC

LinearSVC(Linear Support Vector Classification):线性支持向量分类,类似于SVC,但是其使用的核函数是”linear“上边介绍的两种是按照brf(径向基函数计算的,其实现也不是基于LIBSVM,所以它具有更大的灵活性在选择处罚和损失函数时,而且可以适应更大的数据集,他支持密集和稀疏的输入是通过一对一的方式解决的。

example


# ===============================样本不平衡、多分类的情况========================
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm# 创建不均衡样本
rng = np.random.RandomState(0)
n_samples_1 = 1000
n_samples_2 = 100
n_samples_3 = 100
X = np.r_[1.5 * rng.randn(n_samples_1, 2), 0.5 * rng.randn(n_samples_2, 2) + [2, 2],0.5 * rng.randn(n_samples_3, 2) + [-3, 3]]  # 三类样本点中心为(1.5,1.5)、(2,2)、(-3,3)
y = [0] * (n_samples_1) + [1] * (n_samples_2)+ [2] * (n_samples_3)  # 前面的1000个为类别0,后面的100个为类别1,最后100个类别为2# 创建模型获取分离超平面
clf = svm.SVC(decision_function_shape='ovo',kernel='linear', C=1.0)  # decision_function_shape='ovo'为使用1对1多分类处理。会创建n(n-1)/2个二分类。ovr为一对所有的处理方式
clf.fit(X, y)# 多分类的情况下,获取其中二分类器的个数。
dec = clf.decision_function([[1.5,1.5]])  # decision_function()的功能:计算样本点到分割超平面的函数距离。 包含几个2分类器,就有几个函数距离。
print('二分类器个数:',dec.shape[1])# 绘制,第一个二分类器的分割超平面
w = clf.coef_[0]
a = -w[0] / w[1]  # a可以理解为斜率
xx = np.linspace(-5, 5)
yy = a * xx - clf.intercept_[0] / w[1]  # 二维坐标下的直线方程# 使用类权重,获取分割超平面
wclf = svm.SVC(kernel='linear', class_weight={1: 10})
wclf.fit(X, y)# 绘制 分割分割超平面
ww = wclf.coef_[0]
wa = -ww[0] / ww[1]
wyy = wa * xx - wclf.intercept_[0] / ww[1]  # 带权重的直线# 绘制第一个二分类器的分割超平面和样本点
h0 = plt.plot(xx, yy, 'k-', label='no weights')
h1 = plt.plot(xx, wyy, 'k--', label='with weights')
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.legend()plt.show()

使用诀窍

  • 避免数据复制: 对于 SVC, SVR, NuSVC 和 NuSVR, 如果数据是通过某些方法而不是用 C 有序的连续双精度,那它先会调用底层的 C 命令再复制。 您可以通过检查它的 flags 属性,来确定给定的 numpy 数组是不是 C 连续的。

  • 对于 LinearSVC (和 LogisticRegression) 的任何输入,都会以 numpy 数组形式,被复制和转换为 用 liblinear 内部稀疏数据去表达(双精度浮点型 float 和非零部分的 int32 索引)。 如果您想要一个适合大规模的线性分类器,又不打算复制一个密集的 C-contiguous 双精度 numpy 数组作为输入, 那我们建议您去使用 SGDClassifier 类作为替代。目标函数可以配置为和 LinearSVC 模型差不多相同的。

  • 内核的缓存大小: 在大规模问题上,对于 SVC, SVR, nuSVC 和 NuSVR, 内核缓存的大小会特别影响到运行时间。如果您有足够可用的 RAM,不妨把它的 缓存大小 设得比默认的 200(MB) 要高,例如为 500(MB) 或者 1000(MB)。

  • 惩罚系数C的设置:在合理的情况下, C 的默认选择为 1 。如果您有很多混杂的观察数据, 您应该要去调小它。 C 越小,就能更好地去正规化估计。

  • 支持向量机算法本身不是用来扩大不变性,所以 我们强烈建议您去扩大数据量. 举个例子,对于输入向量 X, 规整它的每个数值范围为 [0, 1] 或 [-1, +1] ,或者标准化它的为均值为0方差为1的数据分布。请注意, 相同的缩放标准必须要应用到所有的测试向量,从而获得有意义的结果。 请参考章节 预处理数据 ,那里会提供到更多关于缩放和规整。

  • 在 NuSVC/OneClassSVM/NuSVR 内的参数 nu , 近似是训练误差和支持向量的比值。

  • 在 SVC, ,如果分类器的数据不均衡(就是说,很多正例很少负例),设置 class_weight=’balanced’ 与/或尝试不同的惩罚系数 C 。

  • 在拟合模型时,底层 LinearSVC 操作使用了随机数生成器去选择特征。 所以不要感到意外,对于相同的数据输入,也会略有不同的输出结果。如果这个发生了, 尝试用更小的 tol 参数。

  • 使用由 LinearSVC(loss=’l2’, penalty=’l1’, dual=False) 提供的 L1 惩罚去产生稀疏解,也就是说,特征权重的子集不同于零,这样做有助于决策函数。 随着增加 C 会产生一个更复杂的模型(要做更多的特征选择)。可以使用 l1_min_c 去计算 C 的数值,去产生一个”null” 模型(所有的权重等于零)。

参考:python机器学习库sklearn——支持向量机svm

机器学习之支持向量机算法相关推荐

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

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

  2. 支持向量机python代码_Python机器学习SVM支持向量机算法理论 | kTWO-个人博客

    PS:这篇文章讲的是SVM的算法的基础理论知识,因为博主也是刚学习没多久,对SVM的数学思想了解的不是很深,所以这篇文章就简单介绍一下什么是SVM以及SVM是怎么工作的. 1.什么是支持向量机(SVM ...

  3. 机器学习之支持向量机算法(一)

    一.问题引入 支持向量机(SVM,Support Vector Machine)在2012年前还是很牛逼的,但是在12年之后神经网络更牛逼些,但是由于应用场景以及应用算法的不同,我们还是很有必要了解S ...

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

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

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

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

  6. 机器学习笔记——支持向量机SMO算法完整版代码分析

    机器学习笔记--支持向量机SMO算法完整版代码分析 代码大体分析 外循环 参数类 内循环 KKT条件判断 eCache参数 完整SMO代码 添加核函数代码 代码参考书籍:<机器学习实战> ...

  7. 机器学习九大算法---支持向量机

    机器学习九大算法---支持向量机 出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好 ...

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

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

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

    支持向量机算法 1.算法起源 2.算法概述 3.算法分类 4.算法思想 5.算法步骤 6.算法相关概念 7.算法实现 7.算法优点 8.算法优化 1.算法起源 1963年,前苏联学者Vladimir ...

最新文章

  1. java osgi web开发_基于 OSGi 和 Spring 开发 Web 应用
  2. 信息学奥赛一本通 1075:药房管理 | OpenJudge NOI 1.5 23:药房管理
  3. 带你了解几种二进制代码相似度比较技术
  4. matlab内存管理工具,[转载]MATLAB内存管理
  5. jquery怎么选择 某个指定id的div下面的第2个子div再设置css?
  6. 20160205 - Windows 10 家庭版没有组策略
  7. Matlab实现单(双)极性(不)归零码
  8. windowsxp主题包把windowsXP主题改成Windows7风格
  9. Xshell6及Xftp6的使用
  10. 医疗项目业务以及表设计介绍
  11. TCP是如何传输数据的?
  12. 逆向工程实验——pre9(可执行文件的加密MD5碰撞lab)
  13. stm32f0 大小端_STM32F0系列Cortex-M0原理与实践
  14. 川崎机器人总线通信_川崎机器人TCP/IP通信方法及编程过程介绍
  15. Linux基础命令---文本过滤coi
  16. 知网CAJ文件内容复制小助手
  17. 全球排名第一的免费开源ERP Odoo替代料管理应用解决方案
  18. eNSP搭建基础网络
  19. mos管怎样选型?新人必备MOS管正确选择的过程!
  20. 怎么写安卓手机脚本_利用xposed虚拟真实手机环境,建立引流脚本矩阵

热门文章

  1. 2022年多款虎年春节手机桌面壁纸
  2. r语言 svm 大样本_R语言数据分析实战:十大算法之SVM模型 - 数据分析
  3. 利用Python制作旋转花灯,祝大家元宵节快乐
  4. MapBox离线地图+python获取瓦片数据
  5. TFT LCD使用心得
  6. 做该做的事情,做重要的事情
  7. mysql插入\更新前+判断条件
  8. NC65 报销单使用银企直联网银支付后,银行的电子回执单的收款人开户行跟报销单的收款对象的开户行不一致
  9. 什么情况下不能弱势?
  10. 软件测试工程师进阶技能工具篇——jmeter性能测试实战