从CSV编译C#,VersatileMLDataSet,如何获取原始数据?

时间:2016-09-01 10:43:00

标签: c# csv encog

我想使用Encog库中的CSV阅读器,如下所示:

    var format = new CSVFormat('.', ' ');
    IVersatileDataSource source = new CSVDataSource(filename, false, format);
    var data = new VersatileMLDataSet(source);

是否可以从变量数据获取原始数据?在将其用于神经网络之前,我必须在dataGridView中显示CSV到用户的记录。我希望能够修改原始数据。根据{{​​3}},有属性数据,但它对我不起作用。如果我尝试这样的话:

data.Data[1][1] 

我得到空指针异常。在规范化之前使用数据还有另一个问题。我希望通过以下方式获得记录数:

data.GetRecordCount()

但是我得到错误你必须在使用它之前规范化数据集。所以即使我还没有使用数据,我还要规范化它?如果这是真的,那么最好使用我自己的CSV阅读器,然后将其加载到内存中,这对吗?

2 个答案:

答案 0 :(得分:1)

所以我只是看了GitHub上的Encog源代码。值得庆幸的是,你的问题定义明确,范围狭窄,所以我可以提供答案。不幸的是,你可能不喜欢它。

基本上,当您将IVersatileDataSource传递给VersatileMLDataSet的构造函数时,它会被放入名为_source的 private readonly 字段中。 _source周围没有抽象,因此您无法从VersatileMLDataSet外部访问它。

Data属性确实只会在规范化过程中填充。在CSVDataSource中似乎没有任何公开任何有价值的字段(同样,所有私有)。

如果您只想查看单列数据,可以保留在Encog中并查看Encog.Util.NetworkUtil.QuickCSVUtils。此类中有一些方法可以帮助您拾取文件并快速获取单列数据。

如果要从Encog中的文件中获取完整的CSV数据,可以使用Encog.Util.CSV.ReadCSV类来获取数据。这是实例化QuickCSVUtils时代码所使用的底层实现。您必须在ReadCSV周围提供一些包装器逻辑,类似于QuickCSVUtils。如果你走这条路,我建议在那个班级偷看,看看它是如何使用ReadCSV的。基本上,ReadCSV会在一次读取一行。

但是如果你真的需要从VersatileMLDataSet类中读取RAW csv数据,那么最好的办法就是在从VersatileMLDataSet派生的自定义类中提供你自己的实现。

答案 1 :(得分:1)

在阅读文件后,您需要执行以下几个步骤:

  1. 您必须定义列类型
  2. 分析数据
  3. 地图输出
  4. 设置规范化策略
  5. 获取您的数据
  6. 可选择克隆data.Data以保留原件
  7. 下面的代码带有适当的评论。

    var filename = @"iris.data.csv";
    var format = new CSVFormat('.', ',');
    IVersatileDataSource source = new CSVDataSource(filename, false, CSVFormat.DecimalPoint);
    var data = new VersatileMLDataSet(source);
    
    // Define columns to read data in.
    data.DefineSourceColumn("Col1", 0, ColumnType.Continuous);
    data.DefineSourceColumn("Col2", 1, ColumnType.Continuous);
    data.DefineSourceColumn("Col3", 2, ColumnType.Continuous);
    data.DefineSourceColumn("Col4", 3, ColumnType.Continuous);
    
    ColumnDefinition outputColumn = data.DefineSourceColumn("Col5", 4, ColumnType.Nominal);
    
    // Analyze data
    data.Analyze();
    
    // Output mapping
    data.DefineSingleOutputOthersInput(outputColumn);
    
    // Set normalization strategy
    data.NormHelper.NormStrategy = new BasicNormalizationStrategy(-1, 1, -1, 1);
    data.Normalize();
    
    // Get count
    var count = data.GetRecordCount();
    
    // Clone to get original data
    var oiginalData = data.Data.Clone();
    

    有关详细信息,请查看quickstart paper

    我使用的示例数据来自here