首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取包含8×8图像数据集的CSV文件

读取包含8×8图像数据集的CSV文件
EN

Code Review用户
提问于 2016-03-08 02:32:56
回答 1查看 864关注 0票数 1

我正在尝试实现一种机器学习算法(例如k)。但是在我尝试这样做之前,我希望得到一些关于我当前的主类的反馈,这个类实际上将8×8像素矩阵构建到一个数组中,然后再进行操作。(参见数据描述样本数据集。)

代码语言:javascript
复制
import java.util.*;
import java.io.*;

public class Main {

    static class Data {

        int[] dataSet;
        int classCode;

        public Data(int[] dataSet, int label) {
            this.dataSet = dataSet;
            this.classCode = label;
        }

        @Override
        public String toString() {
            return "Class Code: " + classCode + " DataSet:" + Arrays.toString(dataSet) + "\n";
        }

    }

    ArrayList<Data> dataSetList;
    int[][] dataArray = new int[2810][65];

    private void readFile(String csvFile) {
        int instances = 0;
        dataSetList = new ArrayList<>();
        try {
            Scanner scan = new Scanner(new BufferedReader(new FileReader(csvFile)));
            while (scan.hasNext()) {
                String line = scan.next();
                String[] extractedDataFromFile = line.split(",");
                for (int i = 0; i < extractedDataFromFile.length; i++) {
                    dataArray[instances][i] = Integer.parseInt(extractedDataFromFile[i]);
                }
                dataSetList.add(new Data(dataArray[instances], dataArray[instances][extractedDataFromFile.length - 1]));
                instances++;
            }
            System.out.println(dataSetList.toString());
        } catch (FileNotFoundException ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.readFile("dataset1.csv");
    }

}

这是我第一次尝试机器学习,任何关于我当前方法的反馈,以及一个超越这一点的算法,都将是非常感谢的。

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-03-08 07:22:21

大纲

DataMain并不是非常有用的类名。我建议ImageMatrixImageMatrixDB

在某种意义上,您的代码是不完整的,因为它只打印它读取的数据。为了使这段代码有用,您必须提供一种检索数据的方法--而不仅仅是直接访问dataSetListdataArray,后者应该是private。我建议这样的大纲:

ImageMatrix.java

代码语言:javascript
复制
public class ImageMatrix {
    public ImageMatrix(int[] data, int classCode) {
        assert data.length == 64;
        …
    }

    public int[] getData() {
        …
    }

    public int getClassCode() {
        …
    }
}

ImageMatrixDB.java

代码语言:javascript
复制
public class ImageMatrixDB implements Iterable<ImageMatrix> {
    private List<ImageMatrix> list = new ArrayList<>;

    public static ImageMatrixDB load(File f) throws IOException {
        …
    }

    public Iterator<ImageMatrix> iterator() {
        return this.list.iterator();
    }
}

为什么要在dataSetListdataArray中两次存储相同的数据?您应该删除dataArray,它依赖于神奇的编号2810。

文件参数应该是File而不是String,这样就不会给人留下这样的印象:它接受文件的内容而不是文件的名称。

解析例程需要一种向调用方报告失败的方法。不,打印错误消息不算数,因为调用者仍然会不经意地进行。

Implementation

你为什么要使用ScannerBufferedReader已经有了一个readLine()方法,可以做您想做的事情。请注意,您未能关闭FileReaderBufferedReaderScanner

Data对象中,dataSet数组有65个元素:64个数据点和类代码。类代码没有必要成为数组的一部分。

代码语言:javascript
复制
public static ImageMatrixDB load(File f) throws IOException {
    ImageMatrixDB result = new ImageMatrixDB();
    try (FileReader fr = new FileReader(f);
         BufferedReader br = new BufferedReader(fr)) {
        for (String line; null != (line = br.readLine()); ) {
            int lastComma = line.lastIndexOf(',');
            int classCode = Integer.parseInt(line.substring(1 + lastComma));
            int[] data = Arrays.stream(line.substring(0, lastComma).split(","))
                               .mapToInt(Integer::parseInt)
                               .toArray();
            result.list.add(new ImageMatrix(data, classCode));
        }
    }
    return result;
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/122204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档