Что означает это заявление Ruby? - PullRequest
0 голосов
/ 15 октября 2019

Код ниже взят из документации для Ruby Gem rroc. Мне отчаянно нужно рассчитать AUC для моего проекта AI. Однако я практически ничего не знаю о файловых операциях ввода-вывода Ruby, не имея возможности учиться. В документации говорится, что rroc ожидает массив размером 2 на 2, но первая строка кода ниже предполагает, что данные находятся в файле csv, и они будут отформатированы в my_data для roc для вычисления auc.

Я пробовал каждыйвозможная комбинация данных и массивов csv в качестве обоих файлов для первой строки для чтения или прямого ввода в строку, вычисляющую auc. В лучшем случае код работает без ошибок, но выдает бесполезный вывод 0. Я надеюсь, что, если бы я имел более полное представление о том, что делает эта строка, я мог бы либо решить проблему, либо отказаться от драгоценного камня с предыдущей версии этогодрагоценный камень, как показывали, был устаревшим, и этому 8 лет. Я взял данные из статьи, на которую ссылается автор драгоценных камней, и уверен, что это не проблема, но потом ...

Итак, чтобы уточнить вопрос: из этого утверждения мы можем сказать, какого родаданные должны быть в 'some_data.cvs'? И что будет с ним, чтобы сделать my_data?

require 'rroc'

my_data = open('some_data.csv').readlines.collect { |l| l.strip.split(",").map(&:to_f) }
auc = ROC.auc(my_data)
puts auc

Ниже я скопировал вывод для двух прогонов, первый со считанными данными массива, второй со значениями csv (каждый в отдельных файлах),Я добавил строку, чтобы прочитать входной файл, просто чтобы быть уверенным.

RoyiMac:ruby $ ruby PDaucT.rb
[[90, 1], [80, 1], [70,-1], [60,1], [55,1], [54,1], [53,-1], [52,-1], [51,1], [50,-1], [40,1], [39,-1], [38,1], [37,-1], [36,-1], [35,-1], [34,1], [33,-1], [30,1], [10,-1]] 

0.0
RoyiMac:ruby $ ruby PDaucT.rb
90,1,80,1,70,-1,60,1,55,1,54,1,53,-1,52,-1,51,1,50,-1,40,1,39,-1,38,1,37,-1,36,-1,35,-1,34,1,33,-1,30,1,10,-1

0.0

1 Ответ

1 голос
/ 15 октября 2019

Объяснение кода:

open('some_data.csv') # open the some_data.csv file
  .readlines          # returns an array with each element being a line
  .collect { |l|      # for each line do the following tranformation
    l.strip           # remove proceeding and trailing whitespace characters
     .split(',')      # split the line based on the "," character (returning an array)
     .map(&:to_f)     # call .to_f on each element in the array, converting them to a float value
  }

map / collect являются псевдонимами друг друга.

Однако, как уже сказал Тадман в комментариях лучше использовать стандартную библиотеку csv . То же самое может быть достигнуто с помощью:

require 'csv'

my_data = CSV.read('some_data.csv', converters: :float)
# should output
#=> [[90, 1], [80, 1], [70,-1], [60,1], [55,1], [54,1], [53,-1], [52,-1], [51,1], [50,-1], [40,1], [39,-1], [38,1], [37,-1], [36,-1], [35,-1], [34,1], [33,-1], [30,1], [10,-1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...