周志华《机器学习》习题6.2——使用LIBSVM比较线性核和高斯核的差别

本文主要是介绍周志华《机器学习》习题6.2——使用LIBSVM比较线性核和高斯核的差别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.题目

试使用LIBSVM,在西瓜数据集3.0α上分别用线性核和高斯核训练一个SVM,并比较其支持向量的差别。

西瓜数据集3.0α如下图:
在这里插入图片描述

2.LIBSVM

libsvm是目前比较著名的SVM软件包,由台湾大学林智仁(Chih-Jen Lin)教授等开发,它可以帮助程序员轻松的实现SVM二分类、多分类或者SVR等任务。
LIBSVM官网:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
在这里插入图片描述

可以根据官网新手引导进行下载和配置,这里就直接使用anaconda进行安装了。
在anaconda控制台中输入

pip install libsvm

即可安装。

3. 代码实现

因为我过去下载的数据集是xlsx格式,所以这里需要将表格数据转成libsvm要求的数据格式。当然,下面我将转换完的数据放进来了,如果需要可以直接复制粘贴。
libsvm要求数据集为以下格式:数据集包含若干行,每行对应一个样例,对于每个样例有以下格式:

[类别] [属性编号1]:[属性值1] [属性编号2]:[属性值2] …

以本题的西瓜数据为例子,转换完就是这样:

1 1:0.697 2:0.46
1 1:0.774 2:0.376
1 1:0.634 2:0.264
1 1:0.608 2:0.318
1 1:0.556 2:0.215
1 1:0.403 2:0.237
1 1:0.481 2:0.149
1 1:0.437 2:0.211
0 1:0.666 2:0.091
0 1:0.243 2:0.267
0 1:0.245 2:0.057
0 1:0.343 2:0.099
0 1:0.639 2:0.161
0 1:0.657 2:0.198
0 1:0.36 2:0.37
0 1:0.593 2:0.042
0 1:0.719 2:0.103

对于第一行: ”1 1:0.697 2:0.46“
从左到右数字依次的含义是,“1” 表示第1个类别,“1:0.697” 表示第一个属性取值0.697,“2:0.46” 表示第二个属性取值0.46。
然后,将上述格式的数据存在一个.scale或者.txt文件,就可作为libsvm的训练数据,留给后续步骤使用。

from libsvm.svm import *
from libsvm.svmutil import *
import openpyxl
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as npdef xl_to_scale_file():workbook = openpyxl.load_workbook("../第三章_线性模型/xigua3.0.xlsx")sheet1 = workbook['Sheet1']with open("./xigua.scale", 'w') as f:i = 0data_class = sheet1[3][i]for i in range(sheet1.max_column):data_class = sheet1[3][i]atr_1 = sheet1[1][i]atr_2 = sheet1[2][i]line = str(data_class.value) + " 1:" + str(atr_1.value) + " 2:" + str(atr_2.value)f.writelines(line + "\n")

然后,就可以调用libsvm了。
首先使用 svm_read_problem() 将训练集读入进来:

train_label, train_value = svm_read_problem("./xigua.scale")

然后,调用svm_train()训练svm,第一个参数为训练标签,第二个数据为训练样本,第三个数据为字符串,用来指定svm的参数,其可以指定的参数完整版说明如下:

options:
-s svm_type : set type of SVM (default 0)
0 – C-SVC
1 – nu-SVC
2 – one-class SVM
3 – epsilon-SVR
4 – nu-SVR
-t kernel_type : set type of kernel function (default 2)
0 – linear: u’v
1 – polynomial: (gamma
u’v + coef0)^degree
2 – radial basis function: exp(-gamma
|u-v|^2)
3 – sigmoid: tanh(gamma*u’v + coef0)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates: whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
-wi weight: set the parameter C of class i to weight
C, for C-SVC (default 1)

这里只用到其中两个:
-t 用于指定核函数,
0——线性核
2——高斯核
-c 用于指定C-SVC(经典SVM分类)优化目标函数中的参数C,可以理解为代价,当代价越高时,表示对于分类出错的代价越高,SVM的优化过程如下式。其中 ξ i \xi _{i} ξi 是松弛变量,表示第i个样例分类错误的程度(比如,如果一个正例被分到了反例那边,它距离超平面越远,则 ξ i \xi _{i} ξi越大)
m i n w , b , ξ 1 2 w T w + C ∑ l i = 1 ξ i \underset{w,b,\xi } {min} \frac{1}{2}w^{T}w + C\sum_{l}^{i=1}\xi _{i} w,b,ξmin21wTw+Cli=1ξi
这里先设置核函数为线性核,c为100

model = svm_train(train_label, train_value, '-t 0 -c 100')

然后,计算准确率:

p_label, p_acc, p_val = svm_predict(train_label, train_value, model)

然后,为了可以展示效果,可以对其进行可视化,代码如下:

train_label, train_value = svm_read_problem("./xigua.scale")
x1 = [mapi[1] for mapi in train_value]
x2 = [mapi[2] for mapi in train_value]
x = np.c_[x1,x2]np_x = np.asarray(x)
np_y = np.asarray(train_label)
N, M = 100, 100x1_min, x2_min = np_x.min(axis=0)
x1_max, x2_max = np_x.max(axis=0)x1_min -= 0.1
x2_min -= 0.1
x1_max += 0.1 
x2_max += 0.1t1 = np.linspace(x1_min, x1_max, N)
t2 = np.linspace(x2_min, x2_max, M)grid_x, grid_y = np.meshgrid(t1,t2)grid = np.stack([grid_x.flat, grid_y.flat], axis=1)
y_fake = np.zeros((N*M,))
y_predict, _, _ = svm_predict(y_fake, grid, model)cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0'])
plt.pcolormesh(grid_x, grid_y, np.array(y_predict).reshape(grid_x.shape), cmap=cm_light)
plt.scatter(x[:,0], x[:,1], s=30, c=train_label, marker='o')plt.show()

首先,用线性核进行训练,得到如下结果:

在这里插入图片描述

Accuracy = 82.3529% (14/17) (classification)

然后,将线性核改为高斯核,再次运行:

在这里插入图片描述
Accuracy = 82.3529% (14/17) (classification)

这里可以通过提高参数C来提高高斯核分类的准确率。
将C修改为10000:

model = svm_train(train_label, train_value, '-t 2 -c 10000')

再次运行:

在这里插入图片描述
Accuracy = 100% (17/17) (classification)

通过观察可以发现,由于训练集在二维特征空间中线性不可分,所以使用线性核无法全部分类正确,而使用高斯核可以将二维特征点升高维度,从而让这些点在高维空间中线性可分。同时,随着参数C的提高,分类错误代价会提高,训练过程中,超平面会尽可能的将训练集全部分开,但会有过拟合的风险。

这篇关于周志华《机器学习》习题6.2——使用LIBSVM比较线性核和高斯核的差别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813353

相关文章

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas使用AdaBoost进行分类的实现

《Pandas使用AdaBoost进行分类的实现》Pandas和AdaBoost分类算法,可以高效地进行数据预处理和分类任务,本文主要介绍了Pandas使用AdaBoost进行分类的实现,具有一定的参... 目录什么是 AdaBoost?使用 AdaBoost 的步骤安装必要的库步骤一:数据准备步骤二:模型

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H