Day 21 支援向量机 SVM

介绍:

支援向量机(support vector machine,简称为SVM)是一种简单的分类模型,如果我们看维基百科的描述肯定会一头雾水:

支援向量机(英语:support vector machine,常简称为SVM,又名支援向量网路)是在分类与回归分析中分析资料的监督式学习模型与相关的学习演算法。给定一组训练实例,每个训练实例被标记为属於两个类别中的一个或另一个,SVM训练演算法建立一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样对映就使得单独类别的实例被尽可能宽的明显的间隔分开。然後,将新的实例对映到同一空间,并基於它们落在间隔的哪一侧来预测所属类别。

其实它的模型就是在特徵空间中间隔最大的线性分类器,而SVM的学习目标便是让间隔最大化。

我们一样拿维基百科的图来举例:

我们现在有 H1, H2, H3 三条直线,如果三条直线分别代表3个分类器的话,那麽很明显地:H3 表现的最好。因为 H1 不能把类别分开;H2 可以,但只有很小的间隔;而 H3 能以最大间隔将它们分开。

对於 SVM 来说,资料点被视为 p 维向量,而我们想知道是否可以用 p-1 维超平面来分开这些点。这就是所谓的线性分类器。

所以维基百科上的这张图就是一个 将2维的资料以 1维的直线分开的例子。而以此类推:

SVM 便可以用这种方式,将三维的资料以2维的超平面分开了。

怎麽决定分类的"线"?

其实分类的线未必会是直线,也有可能会是曲线,而不同的演算法都是在不同的假设或条件下去找那条分类的线。
而 SVM 则是去假设有一个超平面 https://chart.googleapis.com/chart?cht=tx&chl=%24w%5ETx%2Bb%3D0%24 可以完美分割两组资料,所以 SVM 就是在找参数(w和b) 让两组之间的距离最大化。

详细的数学式这里不会做太多介绍。总之,你只需要知道 SVM 会希望区隔两类的边界(虚线)距离越大越好!而这其实就是一个简单的最佳化问题。剩下的就交给公式了(X

Kernel Function

先前提到,当我们遇到在低维度线性不可分的问题时,可以透过将样本映射到高维度的方式,找到一个最适的超平面。而这时候就有很多种不同的kernel Function可以完成这件事,我们列举几个常用的:

  1. linear kernel (线性核函数)
  2. polynomial kernel (多项式核函数)
  3. Radial Basis Function kernel (径向基函数)(高斯核函数)
  4. sigmoid kernel (Sigmoid 核函数)

SVM 的优点与缺点:

优点:

  1. 可以有效处理高维数据
  2. 决策函数由少量的支持向量决定,预测效率高
  3. 可以透过更换Kernel,做出非线性的决策边界

缺点:

  1. 维度过高容易造成运算负担
  2. 特徵远大於样本的情况下容易造成过度拟和的问题

实作:

一样透过iris资料集进行简单的分类实作:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC

iris = load_iris()

# X是花萼与花瓣的长度、宽度的原始资料
# Y是将花分类之後的正确答案
X = iris.data
Y = iris.target

# 拆分成训练集与测试集
x_train, x_test, y_train, y_test = train_test_split(X ,Y ,test_size =0.2, random_state=0)

# 核函式,预设是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
clf = SVC(kernel='linear')

clf.fit(x_train,y_train)

print(clf.predict(x_test))             # 印出测试的预测结果
print(y_test)                                    # 印出测试答案
print(clf.score(x_test,y_test))    # 印出预测准度

Reference

https://zhuanlan.zhihu.com/p/49331510

https://pyecontech.com/2020/03/24/svm/

https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E6%94%AF%E6%92%90%E5%90%91%E9%87%8F%E6%A9%9F-support-vector-machine-svm-%E8%A9%B3%E7%B4%B0%E6%8E%A8%E5%B0%8E-c320098a3d2e

https://medium.com/jameslearningnote/%E8%B3%87%E6%96%99%E5%88%86%E6%9E%90-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%AC%AC3-4%E8%AC%9B-%E6%94%AF%E6%8F%B4%E5%90%91%E9%87%8F%E6%A9%9F-support-vector-machine-%E4%BB%8B%E7%B4%B9-9c6c6925856b


<<:  EP24 - 持续部署使用 Octopus Deploy 四部曲,整合 Jenkins 自动部署到 EKS

>>:  Proxmox VE 网路进阶设定 (Bridge、LACP、VLAN)

[Day1]PHP的资料型态01

PHP的资料型态 这里将纪录一些学习的笔记 Bollean布林值 算是最简单的资料型态,可以为tru...

D5 - 如何用 Google Apps Script 搭配 HTML 客制 Google 表单的回应信件?

来到了第五天,关於寄信可以进入比较进阶的操作。但一样先讲结论,如果你很急着用,可以直接使用这份 Ad...

【第二十二天 - XSS Lab】

Q1. XSS Lab 为了避免骇客透过 JS 进行攻击,工程师会进行过滤,以下就针对 prompt...

电子书阅读器上的浏览器 [Day27] 无痕模式

原先的 browser 实作就已经包含了无痕模式的细部功能,像是禁止使用 Cookie,和不记录浏览...

Day 27 - Clean Coder 时间管理与专业人士

前言 昨天讲 Clean Code,虽然昨天只聚焦在命名与注解,仅占 Clean Code 这本书的...