LibSVM文件转换为csv格式

Spark MLlib 的官方例子里面提供的数据大部分是 libsvm 格式的。这其实是一种非常蛋疼的文件格式,和常见的二维表格形式相去甚远,下图是里面的一个例子:

libsvm 文件的基本格式如下:

<label> <index1>:<value1> <index2>:<value2>…

label 为类别标识,index 为特征序号,value 为特征取值。如上图中第一行中 0 为标签,128:51 表示第 128 个特征取值为 51 。

Spark 固然提供了读取 libsvm 文件的API,然而如果想把这些数据放到别的库 (比如scikit-learn) 中使用,就不得不面临一个格式转换的问题了。由于 CSV 文件是广大人民群众喜闻乐见的文件格式,因此分别用 Python 和Java 写一个程序来进行转换。我在网上查阅了一下,基本上全是 csv 转 libsvm,很少有 libsvm 转 csv 的,唯一的一个是 phraug库中的libsvm2csv.py 。但这个实现有两个缺点: 一个是需要事先指定维度; 另一个是像上图中的特征序号是 128 - 658 ,这样转换完之后 0 - 127 维的特征全为 0,就显得多余了,而比较好的做法是将全为 0 的特征列一并去除。下面是基于 Python 的实现:

import sys
import csv
import numpy as np

def empty_table(input_file):  # 建立空表格, 维数为原数据集中最大特征维数
    max_feature = 0
    count = 0
    with open(input_file, ‘r‘, newline=‘‘) as f:
        reader = csv.reader(f, delimiter=" ")
        for line in reader:
            count += 1
            for i in line:
                num = int(i.split(":")[0])
                if num > max_feature:
                    max_feature = num

    return np.zeros((count, max_feature + 1))

def write(input_file, output_file, table):
    with open(input_file, ‘r‘, newline=‘‘) as f:
        reader = csv.reader(f, delimiter=" ")
        for c, line in enumerate(reader):
            label = line.pop(0)
            table[c, 0] = label
            if line[-1].strip() == ‘‘:
                line.pop(-1)

            line = map(lambda x : tuple(x.split(":")), line)
            for i, v in line:
                i = int(i)
                table[c, i] = v

    delete_col = []
    for col in range(table.shape[1]):
        if not any(table[:, col]):
            delete_col.append(col)

    table = np.delete(table, delete_col, axis=1)  # 删除全 0 列
    with open(output_file, ‘w‘) as f:
        writer = csv.writer(f)
        for line in table:
            writer.writerow(line)

if __name__ == "__main__":
    input_file = sys.argv[1]
    output_file = sys.argv[2]
    table = empty_table(input_file)
    write(input_file, output_file, table)

以下基于 Java 来实现,不得不说 Java 由于没有 Numpy 这类库的存在,写起来要繁琐得多。

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LibsvmToCsv {
    public static void main(String[] args) throws IOException {

        String src = args[0];
        String dest = args[1];

        double[][] table = EmptyTable(src);
        double[][] newcsv = NewCsv(table, src);
        write(newcsv, dest);
    }

    // 建立空表格, 维数为原数据集中最大特征维数
    public static double[][] EmptyTable(String src) throws IOException {
        int maxFeatures = 0, count = 0;
        File f = new File(src);
        BufferedReader br = new BufferedReader(new FileReader(f));
        String temp = null;
        while ((temp = br.readLine()) != null){
            count++;
            for (String pair : temp.split(" ")){
                int num = Integer.parseInt(pair.split(":")[0]);
                if (num > maxFeatures){
                    maxFeatures = num;
                }
            }
        }
        double[][] emptyTable = new double[count][maxFeatures + 1];
        return emptyTable;
    }

    public static double[][] NewCsv(double[][] newTable, String src) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(src)));
        String temp = null;
        int count = 0;
        while ((temp = br.readLine()) != null){
            String[] array = temp.split(" ");
            double label = Integer.parseInt(array[0]);
            for (String pair : Arrays.copyOfRange(array, 1, array.length)){
                String[] pairs = pair.split(":");
                int index = Integer.parseInt(pairs[0]);
                double value = Double.parseDouble(pairs[1]);
                newTable[count][index] = value;
            }
            newTable[count][0] = label;
            count++;
        }

        List<Integer> deleteCol = new ArrayList<>();  // 要删除的全 0 列
        int deleteColNum = 0;

        coll:
        for (int col = 0; col < newTable[0].length; col++){
            int zeroCount = 0;
            for (int row = 0; row < newTable.length; row++){
                if (newTable[row][col] != 0.0){
                    continue coll;  // 若有一个值不为 0, 继续判断下一列
                } else {
                    zeroCount++;
                }
            }

            if (zeroCount == newTable.length){
                deleteCol.add(col);
                deleteColNum++;
            }
        }

        int newColNum =  newTable[0].length - deleteColNum;
        double[][] newCsv = new double[count][newColNum];  // 新的不带全 0 列的空表格
        int newCol = 0;

        colll:
        for (int col = 0; col < newTable[0].length; col++){
            for (int dCol : deleteCol){
                if (col == dCol){
                    continue colll;
                }
            }

            for (int row = 0; row < newTable.length; row++){
                newCsv[row][newCol] = newTable[row][col];
            }
            newCol++;
        }
        return newCsv;
    }

    public static void write(double[][] table, String path) throws FileNotFoundException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path)));
        try{
            for (double[] row : table){
                int countComma = 0;
                for (double c : row){
                    countComma ++;
                    bw.write(String.valueOf(c));
                    if (countComma <= row.length - 1){
                        bw.append(‘,‘);
                    }
                }
                bw.flush();
                bw.newLine();
            }
        } catch (IOException e){
            e.printStackTrace();
        } finally {
            try{
                if (bw != null){
                    bw.close();
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

/

原文地址:https://www.cnblogs.com/massquantity/p/10054496.html

时间: 2024-10-02 02:44:28

LibSVM文件转换为csv格式的相关文章

ubuntu下用java代码调用命令将java格式文件转换为html格式文件

首先我们应该在电脑上装上GNU Source-highlight 3.1.7,给个链接参考: http://www.gnu.org/software/src-highlite/#mozTocId120994 下面代码实现了 将java类型的代码转换为html文件类型的代码,如果java代码的文件名为 helloword.java,则转换为html格式的文件名为helloword.java.html,将java代码在浏览器上显示出来.其次我还将html文件中的内容提取出来,便于在html文件里编写

将excel2003文档文件转换为excel2007格式

在sharepoint 2010 中,excel2007或excel 2010文档格式,支持web app 应用,能够在浏览器在线打开,查看,但excel 2003格式的文档只能用office客户端打开,为了让上传的文档能够直接支持web app,只能将上传的excel 2003文档转换成excel 2007 文档再上传.文档转换的code如下: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.

PDF可以转换为CAD格式吗?怎么将PDF文件转换为CAD格式?

PDF可以转换为CAD格式吗?怎么将PDF文件转换为CAD格式?相信不小小伙伴对这个问题都会存有疑问,毕竟我们经常会在工作中将CAD图纸文件转换为PDF格式,而在此将PDF转换为CAD格式,确实很多人都存有疑问的! 将CAD图纸文件转换为PDF格式进行保存,一是微视方便查阅图纸,二则是因为CAD图纸文件过于庞大,而其中又包含了许多图形,只有PDF格式的图纸才可以最大程度上的还原原有CAD图纸 的文件内容!一般来说CAD图纸的转换格式是不可逆的,PDF可以转换为CAD格式吗?怎么将PDF文件转换为

PHP 将amr音频文件转换为mp3格式

说下整体思路 1.服务器安装ffmpeg 2.使用ffmpeg -i 指令来转换amr为mp3格式(这个到时候写在PHP代码中,使用exec函数执行即可) 3.在网页端使用HTML5的audio标签来播放mp3文件 下面是操作细节: 一.服务器安装ffmpeg以cenos为例 此处参考:http://my.oschina.NET/ethan09/blog/372435 需要特别注意的是,在下面的方法中,amrnb和amrwb的安装到make环节会请求3gp的一个网址,一般是请求不到的,可以用cr

excel批量转换为CSV格式,xls批量导出csv格式

工具/原料 excel 2013 地址链接:http://pan.baidu.com/s/1c1ZABlu 密码:d3rc 方法/步骤 首选我们把需要导出为CVS的Excel文件整理集中到一个文件夹中.然后新建一个文件夹用来保存CSV文件的.支持Xlsx.xls格式.   新建一个EXCEL表格,打开后,点击菜单栏上的"开发工具":功能区下点击打开Visual Basic.   如果菜单栏上没有开发工具,则在选项中添加.点击文件,弹出菜单选择选项.在EXCEL选项中,点击自定义功能区,

使用Pandoc命令将Markdown格式文件转换为HTML格式文件

一.Pandoc命令介绍 Pandoc是一个强大的格式语言转换工具,被称为该领域的"瑞士军刀".比如可用Pandoc命令将Markdown格式文件转换成HTML格式文件. 二.具体转换命令 具体转换命令如下: pandoc --standalone --self-contained --css pandoc.css src.md --output target.html 以上转换命令中选项含义介绍如下. 1."–standalone" 为目标格式文件增加合适的&qu

新款文章,绝无仅有!微信语音aud文件转换为mp3格式

前提 需求: 目前aud后缀的音频文件无法在任何软件上进行播放,需要进行转换,而当你有需要的时候,例如语音作为追债证据的时候,需要将语音文件分享给其它人听,这时候就需要在手机中找到对应的aud语音文件,然后转换成mp3. 一.首先怎么找aud文件? 额,这个较为繁琐.我的iphone是新买的,没有root过能找aud文件么? ok,当然能.你需要用一款软件对你所有的数据进行备份,因为你直接在手机里找是无法找到的 A.下载"爱思助手",备份你数据到电脑上 B.这个较长哈,取决于你的数据量

uiautomator日志文件转换为junit格式文件

内容比较简单,使用工具automator-log-converter.jar 输入命令:“java –jar automator-log-converter.jar  repotr.txt report.xml ,然后你就看到了同级目录下有一个xml文件了,送上那个工具,好像没有上传附件的工具,如有需要可以联系我:[email protected]

C# .csv文件转为Excel格式;Excel格式转换为.csv

using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.Windows.Forms; using Excel=Microsoft.Office.Interop.Excel; namespace WinFromAPP { public partial class Form1 : Form { public Form1() { InitializeComponent(