西瓜书6.2 matlab的libsvm使用
因为python的教程没有找到详细的所以就改用matlab了
使用的是matlab r2016a,libsvm3-24,具体的安装配置教程就直接参考谦恭大大的了:
https://blog.csdn.net/github_35807147/article/details/80725642
libsvm的使用需要按照它需要的格式排列数据,格式即:
标记值 属性序号:属性值 属性序号:属性值......
这次的数据格式使用libsvmwrite函数生成,它的使用格式如下:
libsvmwrite(‘libsvm_data.mat’,label,instance);
label为样本的标记值矩阵,n*1大小,
instance是一个稀疏矩阵,我们通过sparse()函数来生成。
数据准备的过程如下:
label=[1;1;1;1;1;1;1;1;0;0;0;0;0;0;0;0;0];
instance=[2,1,2,3,3,1,0.697,0.406;...
3,1,1,3,3,1,0.774,0.376;...
3,1,2,3,3,1,0.634,0.264;...
2,1,1,3,3,1,0.608,0.318;...
1,1,2,3,3,1,0.556,0.215;...
2,2,2,3,2,0,0.403,0.237;...
3,2,2,2,2,0,0.481,0.149;...
3,2,2,3,2,1,0.437,0.211;...
3,2,1,2,2,1,0.666,0.091;...
2,3,3,3,1,0,0.243,0.267;...
1,3,3,1,1,1,0.245,0.057;...
1,1,2,1,1,0,0.343,0.099;...
2,2,2,2,3,1,0.639,0.161;...
1,2,1,2,3,1,0.657,0.198;...
3,2,2,3,2,0,0.360,0.370;...
1,1,2,1,1,1,0.593,0.042;...
2,1,1,2,2,1,0.719,0.103];
instance=sparse(instance);
libsvmwrite('libsvm_data.mat',label,instance);
然后再将生成的libsvm_data.mat用libsvmread读入,
libsvmread的作用是把如下格式的文本文件\begin{align*} 1 & \ \ *:* \ \ *:* \\ -1 & \ \ *:* \ \ *:* \end{align*}读取进MATLAB,将第一列的$1,-1$串存成一个类标记向量,之后的特征存成矩阵。
粗暴理解就是一个预处理的作用。
[data_label,data_instance]=libsvmread('libsvm_data.mat');
找到的参考博客上是这么写的,但我一琢磨,好家伙,data_label和label有什么区别么?同理instance和data_instance有什么区别么?
于是我就换了换,原本应当是
model=svmtrain(data_label,data_instance)
我直接
model=svmtrain(label,instance)
输出结果都是
optimization finished, #iter = 7
nu = 0.764822
obj = -10.174209, rho = 0.319850
nSV = 14, nBSV = 12
Total nSV = 14
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 14
rho: 0.3199
Label: [2x1 double]
sv_indices: [14x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [14x1 double]
SVs: [14x8 double]
没有任何区别,大约是这次提供的数据集是完整并且严格按照格式写出来的,所以没法体现出区别。
建模函数svmtrain进行分类建模时的完整格式应当类似下面这个:
model = svmtrain(trainlabel, traindata, ‘-s 0 -t 2 -c 1.2 -g 2.8’);
具体每个参数的作用这个大大的博客里写得很详尽了:https://www.omegaxyz.com/2018/01/23/matlab_svm/
完成题目所需要修改的核函数类型是-t,0是线性核,2是RBF核即高斯核,那么就修改代码如下:
model=svmtrain(label,instance,'-t 0')
得到线性核的结果
optimization finished, #iter = 25
nu = 0.457287
obj = -6.675040, rho = 3.775986
nSV = 10, nBSV = 6
Total nSV = 10
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 10
rho: 3.7760
Label: [2x1 double]
sv_indices: [10x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [10x1 double]
SVs: [10x8 double]
而高斯核的结果就是参数缺省时的结果,也就是最上面那个。
然后就是结果分析。
#iter是迭代次数,nu与前面的操作参数-n v相同,obj为SVM文件转换为的二次规划求解得到的最小值,rho是判决函数的常数项b,nSV是支持向量个数,nBSV是边界上的支持向量个数。Total nSV是支持向量总个数。
而在训练好的模型中,parameters内装的是训练模型的参数,totalSV是支持向量的数目,Labe装的是类别标记,nSV装的是每类支持向量的个数,sv_coef装的是支持向量对应的Wi,SVs里则是每个支持向量。我们要看的就是SVs的内容。输出时应当是稀疏矩阵,为了可观性可以用full()函数转化为全矩阵后输出。
线性核的SVs结果如下:
2.0000 1.0000 1.0000 3.0000 3.0000 1.0000 0.6080 0.3180
1.0000 1.0000 2.0000 3.0000 3.0000 1.0000 0.5560 0.2150
2.0000 2.0000 2.0000 3.0000 2.0000 0 0.4030 0.2370
3.0000 2.0000 2.0000 2.0000 2.0000 0 0.4810 0.1490
3.0000 2.0000 2.0000 3.0000 2.0000 1.0000 0.4370 0.2110
2.0000 3.0000 3.0000 3.0000 1.0000 0 0.2430 0.2670
2.0000 2.0000 2.0000 2.0000 3.0000 1.0000 0.6390 0.1610
1.0000 2.0000 1.0000 2.0000 3.0000 1.0000 0.6570 0.1980
3.0000 2.0000 2.0000 3.0000 2.0000 0 0.3600 0.3700
2.0000 1.0000 1.0000 2.0000 2.0000 1.0000 0.7190 0.1030
高斯核的SVs结果如下:
2.0000 1.0000 2.0000 3.0000 3.0000 1.0000 0.6970 0.4060
3.0000 1.0000 1.0000 3.0000 3.0000 1.0000 0.7740 0.3760
2.0000 1.0000 1.0000 3.0000 3.0000 1.0000 0.6080 0.3180
1.0000 1.0000 2.0000 3.0000 3.0000 1.0000 0.5560 0.2150
2.0000 2.0000 2.0000 3.0000 2.0000 0 0.4030 0.2370
3.0000 2.0000 2.0000 2.0000 2.0000 0 0.4810 0.1490
3.0000 2.0000 2.0000 3.0000 2.0000 1.0000 0.4370 0.2110
3.0000 2.0000 1.0000 2.0000 2.0000 1.0000 0.6660 0.0910
2.0000 3.0000 3.0000 3.0000 1.0000 0 0.2430 0.2670
1.0000 1.0000 2.0000 1.0000 1.0000 0 0.3430 0.0990
2.0000 2.0000 2.0000 2.0000 3.0000 1.0000 0.6390 0.1610
1.0000 2.0000 1.0000 2.0000 3.0000 1.0000 0.6570 0.1980
3.0000 2.0000 2.0000 3.0000 2.0000 0 0.3600 0.3700
2.0000 1.0000 1.0000 2.0000 2.0000 1.0000 0.7190 0.1030
可以看到的是线性核的支持向量个数比高斯核要少,但两者的向量长度是相同的,而且部分向量是一致的,两者相差不多的原因、依据网上博主们的核函数选择原则来看,或许是因为这个样本集的样本数和属性数相差不大。而在其他情况下的表现还有待讨论。
西瓜书6.2 matlab的libsvm使用的更多相关文章
- Matlab的libsvm的安装
最关键的是compilers的选择(对于把Microsoft visual stdio 2005或者其他的编译器安装在自定义目录下的这一步非常关键) 以下是步骤:>> mex -setu ...
- python实现简单决策树(信息增益)——基于周志华的西瓜书数据
数据集如下: 色泽 根蒂 敲声 纹理 脐部 触感 好瓜 青绿 蜷缩 浊响 清晰 凹陷 硬滑 是 乌黑 蜷缩 沉闷 清晰 凹陷 硬滑 是 乌黑 蜷缩 浊响 清晰 凹陷 硬滑 是 青绿 蜷缩 沉闷 清晰 ...
- 决策树ID3原理及R语言python代码实现(西瓜书)
决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...
- 朴素贝叶斯python代码实现(西瓜书)
朴素贝叶斯python代码实现(西瓜书) 摘要: 朴素贝叶斯也是机器学习中一种非常常见的分类方法,对于二分类问题,并且数据集特征为离散型属性的时候, 使用起来非常的方便.原理简单,训练效率高,拟合效果 ...
- 周志华-机器学习西瓜书-第三章习题3.5 LDA
本文为周志华机器学习西瓜书第三章课后习题3.5答案,编程实现线性判别分析LDA,数据集为书本第89页的数据 首先介绍LDA算法流程: LDA的一个手工计算数学实例: 课后习题的代码: # coding ...
- LASSO回归与L1正则化 西瓜书
LASSO回归与L1正则化 西瓜书 2018年04月23日 19:29:57 BIT_666 阅读数 2968更多 分类专栏: 机器学习 机器学习数学原理 西瓜书 版权声明:本文为博主原创文章,遵 ...
- 决策树 机器学习,西瓜书p80 表4.2 使用信息增益生成决策树及后剪枝
使用信息增益构造决策树,完成后剪枝 目录 使用信息增益构造决策树,完成后剪枝 1 构造决策树 1 根结点的选择 色泽 信息增益 根蒂 信息增益 敲声 信息增益 纹理 信息增益 脐部 信息增益 触感 信 ...
- matlab配置Libsvm 防止备忘录
1 首先我们要下载一个Libsvm 工具箱 其中,这一切都可以被下载到 2 我们解包 我解压在桌面上 住址C:\Users\Administrator\Desktop\libsvm 3打开matlab ...
- 64位matlab中libsvm的安装
因为windows版的matlab对编译器的识别不好.所以直接在网上下了已经编译好的libsvm文件放入toolbox文件夹就可以用libsvm了 libsvm已编译好的文件下载地址: 猛戳我下载 1 ...
- MATLAB安装libsvm无法使用解决办法(转)
buaasuozi 这是原作者: 安装libsvm 不成功有可能是你的MATLAB版本或者是编译文件版本的问题,但是不要急着换其他版本....说不定就有别的解决办法呢 首先感谢Lin教授及其实验室提 ...
随机推荐
- 05 Java 数组
Java 数组 一.什么是数组 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据,按照一定的顺序排列组合而成 其中每一个数据称为数组元素,每个数组元素可以通过下标来访问它们 二.数组的声 ...
- 对比学习InfoNCE loss之“搬砖学习”
以下链接讲解清晰,供参考 对比学习损失(InfoNCE loss)与交叉熵损失的联系,以及温度系数的作用 - 知乎 (zhihu.com)
- 微信小程序顶部透明
{ "pages": [ "pages/index/index" ], "window": { "backgroundTextSt ...
- 通过抓取pintpoint2的页面信息把数据存入数据库python3
目标:对生产环境的服务质量进行量化, 解决办法:把pintpoint2里的数据转存入mysql数据库,作成报表,目前支持总请求数,错误请求数,中位数,平均数,95值(每分钟一次定时任务),其它指标可以 ...
- DELL服务器升级BIOS,做RAID磁盘阵列
dell服务器BIOS升级.LSI集成整列卡驱动安装 1.下载启动盘rufus,安装linux系统到U盘 1.准备两个U盘,插入启动U盘进入系统,进入centos7选择页面,插入另一个U盘用于安装li ...
- 第12周 预习、实验与作业:Java并发编程
以前你编写的Java程序同时能做几件事情?有几个执行流程?main方法执行完,整个程序一定会退出吗? 最多只能做一件事 函数按着顺序执行,函数内按着语句执行.可以有多个可以有一个. 不一定.因为Mai ...
- js 动态给table添加、删除行。
1.添加table 行 function addtablTr() { var $table = $("#abc"); var vTr = '<tr><td> ...
- dynamics 365 复制(克隆)现有组织
很多时候需要复制现有的开发环境作为新的开发环境,以保留原有测试数据,旧的开发环境作为问题修复环境,以下是复制步骤: 1. 登录数据库服务器,备份现有数据库 2. 还原数据库为新的数据库名称 3. 在前 ...
- Unit mysqld.service could not be found.
具体命令 service mysqld status systemctl status mysqld 结果 Unit mysqld.service could not be found. 查看mysq ...
- C#当窗体大小改变时,窗体中的控件大小也随之改变
第一种:推荐 在窗体中加上如下代码即可实现,但窗体点击放大按钮时却不能改变控件大小. private Size beforeResizeSize = Size.Empty;protectedoverr ...