2016-09-01 4 views
2

Я хочу использовать читатель CSV из библиотеки Encog, например:Encog C#, VersatileMLDataSet из CSV, как получить исходные данные?

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

Можно ли получить исходные данные из переменных данных? Я должен показать записи из CSV пользователю в dataGridView, прежде чем использовать его для нейронной сети. Я также хочу иметь возможность изменять исходные данные. Согласно documentation, есть свойство Данные, но это не работает для меня. Если я попробую что-то вроде:

data.Data[1][1] 

Я получаю исключение из null указателя. Существует еще одна проблема с использованием данных до нормализации. Я хочу, чтобы получить количество записей по:

data.GetRecordCount() 

Но я получаю ошибку Вы должны нормализовать набор данных, прежде чем использовать его. Так что, даже если я еще не использовал данные, я должен его нормализовать? Если это правда, то, вероятно, лучше использовать мой собственный CSV-ридер, а затем загрузить его в encog из памяти, правильно?

+0

Я не знаком с 'Encog', но я проверил, что тип' CSVDataSource' имеет 'ReadLine()' метод. Поэтому вы можете использовать 'source.ReadLine' для чтения данных. Тем не менее вы не сможете изменять данные. Я предлагаю найти другую библиотеку, которая имеет дело с 'CSV', например. [CsvHelper] (https://joshclose.github.io/CsvHelper). – Gabrielius

+0

Я не очень хорошо знаком с encog, но мне очень любопытно посмотреть на него. Кроме того, я сегодня ловля рыцарей LOL. Данные определяются как double [] []. Вы должны иметь возможность получить что-то из этого ... так что нулевой указатель странный. Почему вы используете индексы 1? Разве это не индекс на основе 0? Что находится внутри data.Data [0] [0]? – HBomb

ответ

1

Так что я просто посмотрел исходный код Encog на GitHub. К счастью, ваш вопрос четко определен и ограничен, поэтому я могу дать ответ. К сожалению, вам, вероятно, это не понравится.

В общем случае, когда вы передаете свой IVersatileDataSource в конструктор для VersatileMLDataSet, он помещается в поле private readonly, называемое _source. Абстракция вокруг _source отсутствует, поэтому вы не можете получить доступ к ней извне VersatileMLDataSet.

Свойство Data действительно будет заполнено только во время процесса нормализации. Также нет никаких полей в CSVDataSource, которые являются общедоступными для вас (опять же, все частные).

Если вы просто хотите посмотреть один столбец данных, вы можете остаться в Encog и посмотреть на Encog.Util.NetworkUtil.QuickCSVUtils. В этом классе есть методы, которые помогут вам получить файл и быстро получить один столбец данных.

Если вы хотите получить полные данные CSV из файла в Encog, вы можете использовать класс Encog.Util.CSV.ReadCSV для получения данных. Это базовая реализация, в любом случае используемая вашим кодом при создании экземпляра QuickCSVUtils. Вы должны будете предоставить некоторую логику обертки вокруг ReadCSV, аналогичную QuickCSVUtils. Если вы поедете по этому маршруту, я рекомендую заглянуть в этот класс, чтобы увидеть, как его использовать ReadCSV. По существу ReadCSV читает одну строку во времени.

Но если вам действительно нужно прочитать данные CSV-анализа из класса VersatileMLDataSet, лучшим вариантом будет предоставление собственной реализации внутри пользовательского класса, полученного из VersatileMLDataSet.

1

Существует несколько шагов, которые вы должны сделать после прочтения в файле:

  1. Вы должны определить свои типы столбцов
  2. Анализ данных
  3. выход Карта
  4. Настройка стратегии нормализации
  5. Получить данные.
  6. Необязательно клонировать данные.Данные для хранения оригиналов

Код ниже с соответствующими комментариями.

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.

Смежные вопросы