在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. 济南学习D2T2__数学分析题

    [问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有N个数代表每一个数的 ...

  2. 关于Datagridview控件用法的一些总结(设置列chicun)

    1. 关于Datagridview控件用法的一些总结:http://www.cnblogs.com/mingjiatang/p/4968049.html

  3. as 和 is 区别

    as 将对象转换某类型,如果失败则返回null.is用来判断对象是否为某个类型,在判断过程中会对对象进行两次转换,而as只有一次转换,故as效率高.

  4. AjaxControlToolkit MaskedEdit Unspecified error 未指定错误

    使用AjaxControlToolkit 里面的 MaskedEditValidator控件,IE里面在如下的js中出现未指定(Unspecified error)错误, if (document.a ...

  5. Oracle 截取、查找字符函数(持续更新)

    整理一些常用的截取.查找字符函数: 1.查找某一个字符串中某一个字符(串)出现的次数 SELECT LENGTH(REGEXP_REPLACE(REPLACE('anne<br>lily& ...

  6. OpenWRT连接OPENVPN的教程

    这是相当基本没有任何web界面,只是几个命令如何运行OpenWRT的 OpenVPN的例子. OpenWRT的设置更复杂,所以这个教程仅供爱好者和经验的用户使用参考. 本教程假定您有OpenWRT的安 ...

  7. innobackupex使用实践

    先介绍一下环境: MySQL:5.6.19 安装路径:/u01/mysql 数据文件:/u01/mysql/data 备份源:/u02/backup 我是异机恢复,和本机操作一样. 一. 全量备份 步 ...

  8. Android性能优化方法(六)

    ContentProvider优化改进 1.索引简单的说,索引就像书本的目录,目录可以快速找到所在页数,数据库中索引可以帮助快速找到数据,而不用全表扫描,合适的索引可以大大提高数据库查询的效率.(1) ...

  9. (最长公共子序列+推导)Love Calculator (lightOJ 1013)

    http://www.lightoj.com/volume_showproblem.php?problem=1013   Yes, you are developing a 'Love calcula ...

  10. hive数据类型学习

    Hive的内置数据类型可以分为两大类:(1).基础数据类型:(2).复杂数据类型.其中,基础数据类型包括: TINYINT, SMALLINT, INT, BIGINT, BOOLEAN, FLOAT ...