1 题目要求
为节省存储空间和提高文件的网络传输效率,数据文件常采用稀疏方式存储,如图像压缩、稀疏编码等技术。而在计算时,又需要从稀疏数据(sparse data)中恢复出原始数据(full data),以便采用向量或矩阵运算。现有如下稀疏数据,如LIBSVM提供的公开数据aloi文件(LIBSVM Data: Classification, Regression, and Multi-label multiclass.html#aloi),格式如下图所示:
文件的第一列表示样本的类别,共有1000类,采用0-999标记;而对于二分类数据,其类别符号采用“+1”和“-1”标示类别。“76:1”表示该样本的第76个属性的值为1,每行中未列出的属性其值为0,故无需在文件中存储。行尾标记符为回车。按要求完成以下任务:
- 自动计算LIBSVM类型数据的样本数和特征数(属性个数)。
- 从稀疏文件中恢复出全部数据(去除列标记,每个样本的属性值全部列出,以空格分隔),并将类别标记写入与该文件对应的文本文件中,如记为”aloi_full.txt”和”aloi_label.txt”
- 为便于共享计算结果,结果仍采用稀疏形式存储和传输,即实现问题2的逆变换。受限于目前知识,本题暂不考虑计算问题,仅要求从格式形如文件”aloi_full.txt”和”aloi_label.txt”,获得稀疏的aloi数据,记为“restore_aloi.txt”.
- 比对aloi和restore_aloi.txt文件的差异,并记录文件正反变换的时间,将结果回显在屏幕上。
2 需求分析
本题是有关文件处理的问题。首先构造一个文件类其中包含公有型数据成员样本数和特征数,还要公有型成员函数获取类别标记和获取稀疏数据。
- 从网站上获取aloi.txt文件,明确样本数指行数,特征数指所有样本中最多的属性个数。所以计算LIBSVM类型数据的样本数即统计行数,计算其特征数即找所有行数中最后一个数据的