我正在尝试实现一种机器学习算法(例如k)。但是在我尝试这样做之前,我希望得到一些关于我当前的主类的反馈,这个类实际上将8×8像素矩阵构建到一个数组中,然后再进行操作。(参见数据描述和样本数据集。)
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");
}
}这是我第一次尝试机器学习,任何关于我当前方法的反馈,以及一个超越这一点的算法,都将是非常感谢的。
发布于 2016-03-08 07:22:21
Data和Main并不是非常有用的类名。我建议ImageMatrix和ImageMatrixDB。
在某种意义上,您的代码是不完整的,因为它只打印它读取的数据。为了使这段代码有用,您必须提供一种检索数据的方法--而不仅仅是直接访问dataSetList和dataArray,后者应该是private。我建议这样的大纲:
public class ImageMatrix {
public ImageMatrix(int[] data, int classCode) {
assert data.length == 64;
…
}
public int[] getData() {
…
}
public int getClassCode() {
…
}
}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();
}
}为什么要在dataSetList和dataArray中两次存储相同的数据?您应该删除dataArray,它依赖于神奇的编号2810。
文件参数应该是File而不是String,这样就不会给人留下这样的印象:它接受文件的内容而不是文件的名称。
解析例程需要一种向调用方报告失败的方法。不,打印错误消息不算数,因为调用者仍然会不经意地进行。
你为什么要使用Scanner?BufferedReader已经有了一个readLine()方法,可以做您想做的事情。请注意,您未能关闭FileReader、BufferedReader和Scanner。
在Data对象中,dataSet数组有65个元素:64个数据点和类代码。类代码没有必要成为数组的一部分。
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;
}https://codereview.stackexchange.com/questions/122204
复制相似问题