改写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 ...
随机推荐
- Mosquitto-Ubuntu 14.04快速安装问题解决
Mosquitto是一个轻量级的MQTT Broker,支持很多种系统. 下载与安装:http://mosquitto.org/download/ 注意:由于客户端paho工程进展较快,目前需要使用最 ...
- Java写操作
//:ThinkingInJava/net.mindview.io/write2File.java package net.mindview.io; import java.io.BufferedRe ...
- JS向光标指定位置插入内容
方法: function insertHtmlAtCaret(html) { var sel, range; if (window.getSelection) { // IE9 and non-IE ...
- [刘阳Java]_Java技术有哪些学习重点_第1讲
纵观网上有很多非常好的对Java技术的总结,这里我个人谈谈对Java技术学习有哪些重点内容[浮浅之见] Java环境搭建 Java基础语法 Java面向对象编程 Java异常 Java IO流 Jav ...
- Xshell连接虚拟机
一般连接虚拟机失败 原因1:ip地址错误 当输入 ifconfig 只有lo没有eth0,或者有eth0,但eth0中确没有inet addr这一行 输入命令:dhclient eth0 就可以了
- 【jquery】:表单返回信息
第一个页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- EasyUI Combobox设定默认值
$(function () { $('#Select6').combobox({ onLoadSuccess: function () { var data = $('#Select6').combo ...
- arcgis学习
将使用arcgis的一些技巧记下来,以供翻阅 1.判断点在面内 insert into grid_res_relation (GRIDID, GRIDTYPE, RESID, restype, typ ...
- C# 基础(3)
跳转语句 Goto(现在一般不使用) 标志位 Flag true false 常量:(不可改变的量) 语法: Const 类型 变量名 = 常量值 在定义时赋值,其他地方不能赋值 枚举 是自己定义了一 ...
- PYTHON第二天
PYTHON之路 4.注释 Python开发规范:每一行不能超过80个字符 # : 代表注释当行 ‘’’ 上下两行 , 三个英文字符的引号,代表注释某一段代码 ‘’’ 知识点用户输入: PYth ...