在libsvm和liblinear软件包里有一个C函数叫libsvmread,这个函数的作用是把如下格式的文本文件\begin{align*} 1 & \ \ *:* \ \ *:* \\ -1 & \ \ *:* \ \ *:* \end{align*}读取进MATLAB,将第一列的$1,-1$串存成一个类标记向量,之后的特征存成矩阵。

  但是有一些多标记数据集是保存成如下格式的\begin{align*} 1,3,6 & \ \ *:* \ \ *:* \\ 0,3,8 & \ \ *:* \ \ *:* \end{align*}这里样本的类标记不再只是单个$1$或$-1$了,而是若干个数字,所有样本的类标记也构成了一个矩阵,libsvmread也就不能用了。今天笔者简单改了下libsvmread的代码,让它可以读取多标记的数据集了。

  由于有的数据集很大,样本数很多,存一个full的类标记矩阵内存是吃不消的,而且注意到类标记本身一般是很稀疏的,因此存成稀疏矩阵是比较合理的,于是就涉及MATLAB稀疏矩阵的操作了。不得不说,MATLAB稀疏矩阵的存储方式绝对是反人类思维的,笔者看了半天才弄明白是怎么回事。

  以人的思维来看,稀疏矩阵可以做成一个三元组$(r,c,d)$的数组,其中$r$表示非零元素的行号,$c$表示列号,$d$表示数值就行了。例如对于$3 \times 3$的稀疏矩阵\begin{align*} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 3 & 4 \\ 2 & 0 & 0 \end{bmatrix} \end{align*}存成$(1,1,1),(2,2,3),(2,3,4),(3,1,2)$不就好了,若共有$k$个非零元素,总共也就是$O(3k)$的存储开销。但是MATLAB不是如此,它为每个稀疏矩阵准备了三个整型数组指针,分别是$Pr$、$Ir$和$Jc$,其中$Pr$按照列优先的顺序存储所有非零元素,还是对于上面那个矩阵的话,$Pr$就是$[1,2,3,4]$,显然其长度等于非零元素个数;$Ir$同样按照列优先的顺序,存储所有非零元素的行号,对于上面那个矩阵的话就是$[0,2,1,1]$(C语言里数组从$0$开始),因此其长度也等于非零元素个数;最古怪的就是$Jc$了,$Jc$的长度是$N+1$,其中$N$是矩阵的列数,第$i$个元素表示矩阵第$i$列的第一个非零元素在$Pr$里的位置,就上面那个矩阵而言,第$0$列第一个非零元素是$1$,其在$Pr$里的位置是$0$,因此$Jc[0]=0$,第$1$列第一个非零元素是$3$,其在$Pr$里的位置是$2$,因此$Jc[1]=2$,同理可知$Jc[2]=3$,若第$i$列没有非零元素,则$Jc[i]$是前一列最后一个非零元素在$Pr$里的位置$+1$,若前一列也没有非零元素,则$Jc[i]=Jc[i-1]$,最后$Jc[3]=4$表示非零元素总个数。由于稀疏矩阵的$Pr$、$Ir$和$Jc$的遍历是列优先,因此libsvmread里存储特征矩阵时也是一列对应一个样本,全部处理完后做个转置才输出的。

  另一个改动是输出变量变成了三个,除了libsvmread原本的那两个外,笔者加了一个$2$维向量,用来记录类标记的最小值和最大值,目的是为了处理那些分成若干个文件的数据集,有些类别标记可能只出现在一个文件中,其他文件没有,这样最后将所有数据合并起来时就会发现大家的类标记个数不一样,加上最小值和最大值就方便弄清楚到底是哪里出了问题。最后放上修改的libsvmread的度盘地址,需要的人自取之:http://pan.baidu.com/s/1dDF427B。

改写libsvmread读取多标记数据集的更多相关文章

  1. tensorflow读取本地MNIST数据集

    tensorflow读取本地MNIST数据集 数据放入文件夹(不要解压gz): >>> import tensorflow as tf >>> from tenso ...

  2. 利用Tensorflow读取二进制CIFAR-10数据集

    使用Tensorflow读取CIFAR-10二进制数据集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow官方文档 tf.transpose函数解析 tf.sli ...

  3. Python 读取UCI iris数据集分析、numpy基础学习

    python基础.numpy使用.io读取数据集.数据处理转换与简单分析.读取UCI iris数据集中鸢尾花的萼片.花瓣长度数据,进行数据清理,去重,排序,并求出和.累积和.均值.标准差.方差.最大值 ...

  4. Pytorch数据集读取

    Pytorch中数据集读取 在机器学习中,有很多形式的数据,我们就以最常用的几种来看: 在Pytorch中,他自带了很多数据集,比如MNIST.CIFAR10等,这些自带的数据集获得和读取十分简便: ...

  5. 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集

    上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...

  6. Caffe初试(二)windows下的cafee训练和测试mnist数据集

    一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试 ...

  7. Linux与Windows 解压乱码 UTF8BOM读取问题

    Linux 与 Windows 文件乱码问题 这几天需要在linux下用CNN跑数据,但是把数据和数据列表list上传到linux下时却出现了不少乱码的问题.将这两天碰到的编码问题简单的总结一下. 1 ...

  8. ArcGIS 10.1 for Desktop新特性之地理标记照片

    转自:http://blog.csdn.net/esrichinacd/article/details/7730825 地理标记照片是指带有地理位置信息的照片,通常通过内置GPS的数码相机或智能手机拍 ...

  9. MP3 信息读取

    MP3 信息读取 运行环境:Window7 64bit,.NetFramework4.61,C# 7.0: 编者:乌龙哈里 2017-03-13 参考: MP3-wikipedia ID3v1 MPE ...

随机推荐

  1. form 上传 html 代码

    $("#fm").form('submit',{ url: url, onSubmit: function(){ //进行表单验证 $scope.editor.sync(); va ...

  2. Linux/Unix双机建立信任教程

    Linux/Unix双机建立信任教程 一 需要建立信任关系的2台主机都执行生成密钥输入ssh-keygen -t rsa之后全部默认回车,这样就会在/root/.ssh下生成密钥文件 [root@pl ...

  3. Adapter(适配器)-类对象结构型模式

    1.意图 将一个类接口转换成客户希望的另外一个接口.Adapter模式使那些原本不能一起工作的类,可以一起工作. 2.别名 包装器 Wrapper. 3.动机 一个应用可能会有一些类具有不同的接口,并 ...

  4. iOS 判断电话号 几种方法

    1.方法一 - (BOOL)isMobileNumber:(NSString *)mobileNum { /** * 手机号码 * 移动:134[0-8],135,136,137,138,139,15 ...

  5. PHP declare(ticks=N); 的作用

    一般用法是 declare(ticks=N);拿declare(ticks=1)来说,这句主要作用有两种: 1.Zend引擎每执行1条低级语句就去执行一次 register_tick_function ...

  6. java读取properties配置文件方法(一)

    为了修改项目参数方便,需要使用properties配置文件: 首先是需要三个jar包(不同的jar包,读取配置文件的方式会有所不同,这里使用的是2.6版本的jar包) commons configur ...

  7. XML文件操作(C#)

    XML应用于Web开发的许多方面,常用于简化数据的存储和共享,它的设计宗旨是传输数据,而非显示数据.下面简单介绍一下C#是如何对XML文件进行读取的. 1.首先,建立XML对象并关联XML文件 str ...

  8. topsort | | jzoj[1226] | | NOIP2003神经网络

    今天终于通过了那道永远都看不懂题目的神经网络... 所谓拓扑排序,就是在有向无环图中,根据已经有的点和点之间的关系进行排序 引用jzyz教材上的栗子:比如说奶牛比较食量大小,我现在拿到的是cow[i] ...

  9. spring默认启动位置以及contextConfigLocation设置源码解析

    这几天在看spring的源码,涉及到spring启动位置的部分,下面就看看spring到底是从哪儿开始加载的.本文使用的是spring3.0M3 首先spring的加载会借助一个监听器ContextL ...

  10. Verilog之SOS信号-仿顺序操作

    SOS信号:. . . _ _ _ . . . 1. module sos_module ( CLK, RSTn, Pin_Out, SOS_En_Sig ); input CLK; input RS ...