首页 > 其他分享 >【机器学习】支持向量机分类

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

时间:2022-10-20 10:01:43浏览次数:70  
标签:SVM 机器 clf 分类 train grid test 向量

前言

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

SVM原理

  • 引入
  • 【机器学习】支持向量机分类_python

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

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

  • 我们可以看到决定分割面其实只有上面4个红色的点决定的,这四个点就叫做支持向量。

非线性SVM与核函数

如何变幻空间

对于非线性的数据我们是通过核函数把数据分为不同的平面在进行处理。

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

  • 核函数
  • 线性核函数: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<=a<1\

多分类处理应用

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

优点

  • 相对于其他分类算法不需要过多样本,并且由于SVM引入核函数,所以SVM可以处理高维样本。
  • 结构风险最小,这种风险是指分类器对问题真实模型的逼近与问题真实解之间的累计误差。
  • 非线性,是指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聚类对鸢尾花进行分类​

  • 分类效果图
  • 【机器学习】支持向量机分类_机器学习_04

  • 分类结果参数
  • 【机器学习】支持向量机分类_核函数_05

总结

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



标签:SVM,机器,clf,分类,train,grid,test,向量
From: https://blog.51cto.com/u_14349764/5777702

相关文章

  • 机器学习中用随即森林(决策树)预测缺失值
    训练集和测试集的划分Ytrain:指的是缺失值那行所对应的有值的部分Ytest:指的是缺失值,需要预测的部分(一般的监督学习不会预测Ytest,因为我们是预测该缺失的数据,所以Ytest不用......
  • 向量点乘、叉乘公式的一种推导方法
    点乘:      叉乘:   ......
  • 概念介绍_软件架构和资源分类
    *JavaWeb: *使用Java语言开发基于互联网的项目*软件架构: 1.C/S:Client/Server客户端/服务器端 *在用户本地有一个客户端程序,在远程有一个服务器端......
  • 图像分类经典项目:基于开源数据集Fashion-MNIST的应用实践
    Datawhale作者:何新,Datawhale优秀学习者简介:何新,武汉理工大学硕士​​https://github.com/whut2962575697​​图像分类是计算机视觉和数字图像处理的一个基本问题。传统的图......
  • 算法高级(46)-波士顿动力机器人ATLAS
    一、引言如果说阿尔法狗是对人类智力的碾压,那么,波士顿动力研发的机器人,正在挑战的是仿生学。波士顿动力公司(BostonDynamics)一致在专注于机器人的研发,每一次波士顿动力放出......
  • 概念介绍-软件架构、资源分类
    概念介绍-软件架构web概念概述使用java语言开发基于互联网的项目软件架构:C/S:Client/Server客户端/服务器端在用户本地有一个客户端程序,在远程有一个......
  • 0003 机器学习实战 第三章 分类
    1 本章所有示例代码#!/usr/bin/envpython#-*-coding:UTF-8-*-"""路径:lesson03.py标题:分类创建:2022-10-1517:46更新:2022-10-1517:......
  • ML[001] 机器学习基本概念
    机器学习是能够从数据中学习的算法(通过经验E改进后,在任务T上由性能度量P衡量的性能会有所提升) 1.数据集(dataset)训练集(trainingset):用来进行训练,也就是产生模型或算......
  • 01#嵌入式系统基础:定义、由来、分类
    嵌入式系统的定义嵌入式系统是一种计算机硬件和软件的组合,也许还有机械装置,用于实现一个特定功能。在某些特定情况下,嵌入式系统是一个大系统或产品的一部分。例如,微波炉......
  • 【自然语言处理(NLP)】基于SQuAD的机器阅读理解
    【自然语言处理(NLP)】基于SQuAD的机器阅读理解作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践......