改写libsvmread读取多标记数据集
在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读取多标记数据集的更多相关文章
- tensorflow读取本地MNIST数据集
tensorflow读取本地MNIST数据集 数据放入文件夹(不要解压gz): >>> import tensorflow as tf >>> from tenso ...
- 利用Tensorflow读取二进制CIFAR-10数据集
使用Tensorflow读取CIFAR-10二进制数据集 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow官方文档 tf.transpose函数解析 tf.sli ...
- Python 读取UCI iris数据集分析、numpy基础学习
python基础.numpy使用.io读取数据集.数据处理转换与简单分析.读取UCI iris数据集中鸢尾花的萼片.花瓣长度数据,进行数据清理,去重,排序,并求出和.累积和.均值.标准差.方差.最大值 ...
- Pytorch数据集读取
Pytorch中数据集读取 在机器学习中,有很多形式的数据,我们就以最常用的几种来看: 在Pytorch中,他自带了很多数据集,比如MNIST.CIFAR10等,这些自带的数据集获得和读取十分简便: ...
- 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...
- Caffe初试(二)windows下的cafee训练和测试mnist数据集
一.mnist数据集 mnist是一个手写数字数据库,由Google实验室的Corinna Cortes和纽约大学柯朗研究院的Yann LeCun等人建立,它有60000个训练样本集和10000个测试 ...
- Linux与Windows 解压乱码 UTF8BOM读取问题
Linux 与 Windows 文件乱码问题 这几天需要在linux下用CNN跑数据,但是把数据和数据列表list上传到linux下时却出现了不少乱码的问题.将这两天碰到的编码问题简单的总结一下. 1 ...
- ArcGIS 10.1 for Desktop新特性之地理标记照片
转自:http://blog.csdn.net/esrichinacd/article/details/7730825 地理标记照片是指带有地理位置信息的照片,通常通过内置GPS的数码相机或智能手机拍 ...
- MP3 信息读取
MP3 信息读取 运行环境:Window7 64bit,.NetFramework4.61,C# 7.0: 编者:乌龙哈里 2017-03-13 参考: MP3-wikipedia ID3v1 MPE ...
随机推荐
- SQL Server数据库表重置自增主键号(通常是指ID)
执行 DBCC CHECKIDENT ('table_name', NORESEED) 以确定列中的当前最大值 然后使用 DBCC CHECKIDENT ('table_name', RESEED,n ...
- mysql处理字符串
1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my_con ...
- css3 进度条
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>1 ...
- mysql 命令行参数
MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式 例如: mysql -h${HOSTNAME} -P${PORT} -u${USERNAM ...
- MVC5+EF6 简易版CMS(非接口) 第一章:新建项目
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- 图解CSS的padding,margin,border属性
原文出处:http://hi.baidu.com/sonan/item/af05cf8759810d1cc31627d5 觉得不错,保存以备用. --------------------------- ...
- 21: Arithmetic Sequence--HZAU(dp)
http://acm.hzau.edu.cn/problem.php?id=21 题目大意: 给你一个序列问在数字最多的等比数列 分析: 刚开始看到题就知道是一个dp但是我dp实在是渣到不行 后来发 ...
- 1296: [SCOI2009]粉刷匠
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- 鼠标模拟点击a标签
今天写程序遇到的,想要用鼠标模拟点击a标签 html代码如下: <a id="jump"></a> js代码如下: var page = ....; $(' ...
- [转]深入理解mysqldump原理 --single-transaction --lock-all-tables --master-data
本文转至:http://blog.csdn.net/cug_jiang126com/article/details/49824471 在mysqldump过程中,之前其实一直不是很理解为什么加了--s ...