在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. Spring Framework------>Class RestTemplate----->

    org.springframework.web.client.RestTemplate 官方文档 学习心得: class RESTTemplate用于管理与客户端的HTTP连接

  2. eclipse构建及运行maven web项目

    1:环境 eclipse indigo, JDK1.6, maven 3.2.1, tomcat7.0.42 2:安装eclipse maven插件 m2eclipse 第一种方法:从网上下载m2ec ...

  3. gdal编译C#开发版本

    gdal的编译比较麻烦,情况有很多种,今天我编译的gdal遇到的问题就和以前的有点不一样,仅供参考借鉴. 1.下载gdal源码 gdal源码下载地址:https://trac.osgeo.org/gd ...

  4. android中5大布局

    Android布局也可以用HTML5做,但是用户体验性差 Android布局里XML的属性配置 1. 五种Layout中Item的基础属性: layout_width & layout_hei ...

  5. 将Discuz.net 集成到asp.net

    1,将bbs文件夹拷贝到网站的根目录下: 2,将bbs里面的bin目录,config目录,cache目录,DNT.config文件拷贝到网站根目录下: 3,修改网站web.config文件,在http ...

  6. java容器简要概述

    java中集合框架的概述 java集合类主要用于保存对象的. 常用的集合对象: Colletion接口,Collection接口是集合中的顶层容器,表示的是一组对象,它的下面有两个子接口List接口和 ...

  7. JS倒计时网页自动跳转代码

    <title>JS倒计时网页自动跳转代码</title> <script language="JavaScript" type="text/ ...

  8. textfield设置左边距

    CGRect frame = f;//f表示你的textField的frame frame.size.width = ;//设置左边距的大小 UIView *leftview = [[UIView a ...

  9. 彻底卸载sublime txt

    最近彻底重装系统之后,安装sublime txt3, 自己设置了一些,总是觉得不是很对劲,想重新安装. 结果每次安装之后,总是有一些配置文件和卸载之前的是一样的,重复几次总是如此,于是网上搜资料,怎么 ...

  10. STF(SmartPhone Test Farm)Mac版本环境搭建

    它的github页面为: https://github.com/openstf/stf 1.Linux一些基本包的安装: 在控制台分别运行 sudo apt-get update sudo apt-g ...