【机器学习】支持向量机分类

前言

支持向量机是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。SVM尝试寻找一个最优决策边界,使距离两个类别最近的样本最远。
SVM使用铰链损失函数计算经验风险并在求解系统中加入了正则化项以优化结构风险,是一个具有稀疏性和稳健性的分类器 。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一

SVM原理

  • 引入
    【机器学习】支持向量机分类
  • 直观理解
  • 对数据进行分类,当超平面数据点’间隔’越大,分类的确信度也越大。
  • 我们上面用的棍子就是分类平面。
  • 支持向量

【机器学习】支持向量机分类
  • 我们可以看到,分拆平面实际上只由上述四个红点决定,这些红点被称为支撑向量。
    [En]

    We can see that the split plane is actually determined only by the above four red dots, which are called support vectors.*

非线性SVM与核函数

如何变幻空间

对于非线性数据,我们通过核函数将数据分成不同的平面。

[En]

For nonlinear data, we divide the data into different planes through kernel functions.

【机器学习】支持向量机分类
  • 核函数
  • 线性核函数:K(x,z) = x*z
  • 多项式核函数:K(x,z) = (x*z+1)^p
  • 高斯核函数:K(x,z) = exp((\frac{-|x-z|^2}{z*a^2}))
  • 混合核:K(x,z) = aK1(x,z)+(1-a)K2(x,z), 0

多分类处理应用

  • 一对多法(OVR SVMs)
  • 训练时依次把某个类别样本归为一类,其他剩余样本归为一类
  • k个SVM:分类时将未知样本分类为具有最大分类函数值的那类
  • 一对一法(OVO SVMs或者pairwise)
  • 在任意两类样本之间设计一个SVM
  • k(k-1)/2个SVM
  • 当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类。
  • 层次SVM
  • 层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。类似与二叉树分类。

优点

  • 相对于其他分类算法不需要过多样本,并且由于SVM引入核函数,所以SVM可以处理高维样本。
  • 结构性风险是最小的,指的是分类器对问题的真实模型的近似与问题的实际解决方案之间的累积误差。
    [En]

    the structural risk is the minimum, which refers to the cumulative error between the approximation of the real model of the problem by the classifier and the real solution of the problem.*

  • 非线性,是指SVM擅长应对样本数据线性不可分的情况,主要通过松弛变量(惩罚变量)和核函数技术来实现,这也是SVM的精髓所在。

开源包

LibSVM:https://www.csie.ntu.edu.tw/~cjlin/libsvm/

Liblinear:https://www.csie.ntu.edu.tw/~cjlin/liblinear/

数据集

数据集是使用sklearn包中的数据集。也可以下载下来方便使用。

百度网盘:
链接:https://pan.baidu.com/s/16H2xRXQItIY0hU0_wIAvZw
提取码:vq2i

SVM实现鸢尾花分类

  • 代码
## 数据集 sklearn中

import numpy as np

import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import colors

from sklearn import svm
from sklearn import model_selection

## 加载数据集

def iris_type(s):
    it = {b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2}
    return it[s]

data = np.loadtxt('Iris-data/iris.data',dtype=float,delimiter=',',converters={4:iris_type})

x,y = np.split(data, (4, ), axis=1)

x = x[:,:2]
x_train,x_test, y_train, y_test = model_selection.train_test_split(x,y,random_state=1,test_size=0.2)

## 构建SVM分类器,训练函数

def classifier():
    clf = svm.SVC(C=0.8, kernel='linear', decision_function_shape='ovr')
    return clf

def train(clf, x_train, y_train):
    clf.fit(x_train, y_train.ravel())

clf = classifier()
train(clf,x_train,y_train)

## 初始化分类器,训练模型
def show_accuracy(a, b, tip):
    acc = a.ravel()==b.ravel()
    print('%s accracy:%.3f'%(tip, np.mean(acc)))

## 展示训练结果,及验证结果

def print_accracy(clf, x_train, y_train, x_test, y_test):
    print('training prediction:%.3f'%(clf.score(x_train, y_train)))
    print('test prediction:%.3f'%(clf.score(x_test, y_test)))

    show_accuracy(clf.predict(x_train),y_train, 'training data')
    show_accuracy(clf.predict(x_test), y_test, 'testing data')

    print('decision_function:\n',clf.decision_function(x_train)[:2])

print_accracy(clf, x_train, y_train, x_test, y_test)

def draw(clf, x):
    iris_feature = 'sepal length', 'sepal width', 'petal length', 'petal width'

    x1_min,x1_max = x[:,0].min(), x[:,0].max()
    x2_min,x2_max = x[:,1].min(), x[:,1].max()

    x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]

    grid_test = np.stack((x1.flat, x2.flat), axis=1)
    print('grid_test:\n',grid_test[:2])

    z = clf.decision_function(grid_test)
    print('the distance:',z[:2])

    grid_hat = clf.predict(grid_test)
    print(grid_hat[:2])

    grid_hat = grid_hat.reshape(x1.shape)
    cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
    cm_dark = mpl.colors.ListedColormap(['g', 'b', 'r'])

    plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)
    plt.scatter(x[:,0], x[:, 1],c=np.squeeze(y), edgecolors='k', s=50, cmap=cm_dark)
    plt.scatter(x_test[:,0],x_test[:,1], s=120, facecolor='none', zorder=10)
    plt.xlabel(iris_feature[0])
    plt.ylabel(iris_feature[1])
    plt.xlim(x1_min, x1_max)
    plt.ylim(x2_min, x2_max)
    plt.title('Iris data classification via SVM')
    plt.grid()
    plt.show()

draw(clf, x)

结果展示

可以看到分类效果和之前的k-means聚类效果图是差不多的。

有兴趣的可以看看k-means聚类进行分类:

使用k-means聚类对鸢尾花进行分类:https://www.cnblogs.com/hjk-airl/p/16410359.html

  • 分类效果图
    【机器学习】支持向量机分类
  • 分类结果参数
    【机器学习】支持向量机分类

总结

可以看到SVM鸢尾花分类和K-means聚类是不同的,但是都可以达到分类的效果。

Original: https://www.cnblogs.com/hjk-airl/p/16457435.html
Author: hjk-airl
Title: 【机器学习】支持向量机分类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/499079/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 头歌Python数据框、序列定义及数据处理应用实验闯关

    粘贴答案不是目的 把Python学会这才叫做意义 童年的纸飞机 现在终于飞回我手里~~ 这是网站给的答案,不过运行报错,其他关卡应该没问题。 def return_values()…

    Python 2023年8月20日
    0130
  • 前端面试八股文(详细版)—上

    本文将详细讲解 HTML 、CSS 、JavaScript 、计算机网络知识等方面的内容,Vue 、React 、git 、项目开发实例等内容放在下篇,预祝各位成功上岸! 第一板块…

    Python 2023年10月9日
    047
  • CDNOW 用户消费数据情况分析(python)(入门案例)

    import numpy as npimport pandas as pdfrom pandas import DataFrame,Seriesimport matplotlib …

    Python 2023年8月9日
    049
  • Python—线性回归

    目录 1.简单线性回归模型 2.多元线性回归模型 * 2.1 应用F检验法完成模型的显著性检验 2.2应用t检验法完成回归系数的显著性检验 3.基于回归模型识别异常点 4.含有离散…

    Python 2023年8月1日
    056
  • [Pandas]Dataframe赋值

    在进行Titanic幸存者预测的过程中,数据预处理涉及到空值填充。我的想法是以Pclass分组,为Age的空值填充随机值x~ U(mean-σ,mean+σ) 开始是参考其他文章的…

    Python 2023年8月7日
    056
  • Dapr v1.9.0 版本已发布

    Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务逻辑,而不必…

    Python 2023年10月18日
    042
  • pytest常用知识点记录

    pytest.ini文件:可以自定义一些规则,然后run.py文件直接使用pytest.main()方法执行用例即可 run.py addopts :执行参数 失败重跑:addop…

    Python 2023年9月11日
    054
  • Suspense组件

    先上官网:https://cn.vuejs.org/guide/built-ins/suspense.html 注意一下 <suspense></suspense…

    Python 2023年10月7日
    058
  • Requests,PyTest

    1:将Post和Get请求进行封装 GET&#xFF1A; 无参:get(URL) 含参数: URL后拼接 get(URL,params=) POST: post(URL,…

    Python 2023年9月12日
    038
  • 花1块钱让你的网站支持 ChatGPT

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年11月4日
    030
  • python移动平均线绘图_对python pandas 画移动平均线的方法详解

    数据文件 66001_.txt 内容格式: date,jz0,jz1,jz2,jz3,jz4,jz5 2012-12-28,0.9326,0.8835,1.0289,1.0027,…

    Python 2023年8月8日
    055
  • shell脚本

    1、什么是shell 什么是shell ? Shell(外壳) 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。 Shell 既是一种命令语言, 又是一种程序设计语…

    Python 2023年6月16日
    072
  • python | 微信轰炸脚本代码

    一、环境准备 1、Python3.6 2、itchat第三方库 <span class="code-snippet_outer"><span …

    Python 2023年6月12日
    0170
  • VMware与Centos系统安装

    今日任务 1.Linux发行版的选择 2.vmware创建一个虚拟机(centos) 3.安装配置centos7 4.xshell配置连接虚拟机(centos) 选择性 pc可以选…

    Python 2023年6月3日
    069
  • MYSQL卸载

    MYSQL卸载 卸载MYSQL一共需要经过5步: 第一步:停止MySQL的服务(正在运行的软件无法卸载) 第二步:删除MySQL相关文件 第三步:进入控制面板卸载MySQL(全卸载…

    Python 2023年6月3日
    090
  • playwright 打包程序 无法定位程序输入点gethostname于动态链接库ws2_32.dll上

    node.exe 无法找到入口playwright 打包程序在win7上边报错需要替换包里边的node.exe程序 win7支持10-13 版本node 默认下载为16node-1…

    Python 2023年6月12日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球