Преобразование словарей python в MATLAB

Yas спросил: 13 июня 2018 в 03:32 в: python

У меня есть список словарей python, сохраненных в такой форме:

TEST BayesianSearch: Fold 1 results: {'AUC': 0.02361111111111111, 'precision': 0.012, 'recall': 0.0034607372805101266, 'map': 0.006173611111111111, 'NDCG': 0.0038391623343341052, 'MRR': 0.024472222222222218, 'F1': 0.005372169077405249, 'HR': 0.048, 'ARHR': 0.02458333333333333}

TEST BayesianSearch: Fold 2 results: {'AUC': 0.034277777777777775, 'precision': 0.016416666666666666, 'recall': 0.003939761087163834, 'map': 0.009020833333333329, 'NDCG': 0.0052255728628175955, 'MRR': 0.035861111111111094, 'F1': 0.006354527945317168, 'HR': 0.06566666666666666, 'ARHR': 0.0359722222222222}

В MATLAB,

  • Как я могу найти начало с TEST BayesianSearch: Fold i results, где i = 1, 2, 3, 4, 5?
  • Из этих строк, как я могу получить номера?

1 ответ

pkpkpk ответил: 13 июня 2018 в 08:14

Задача может быть выполнена с использованием регулярных выражений Matlab, которая поддерживает имена групп захвата. Использование имен групп захвата в Matlab является удобным, так как regexp автоматически создает для вас структуру, причем именованные группы захвата как поля, при использовании правильного ключевого слова names.

Для символьного вектора str и выражения регулярного выражения с names, в документации указано:

Если str и выражение являются символами-символами или строковыми скалярами, то вывод представляет собой 1-на-структурный массив, где n - число Матчи. Имена полей структуры соответствуют именам токенов.

Регулярное выражение, которое я использовал для задачи, следующее:

(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)

Вышеприведенное выражение фиксирует все числа в названных группах захвата. Вы можете найти живую демонстрацию регулярного выражения здесь.


Объяснение регулярного выражения:

  • (?:TEST.*?(?=\d\.)) Сопоставьте, но не захватывайте TEST, и используйте положительный результат, чтобы соответствовать всем, вплоть до первого числа, за которым следует десятичная точка.
  • (?<AUC>\d*\.\d*) Группа захвата с именем AUC, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'a-z:]*) Совпадает, но не захватывает все в классе символов, включая: запятую, пробел, апостроф, нижние регистры ASCII и двоеточие.
  • (?<precision>\d*\.\d*) Захват группы с именем precision, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'a-z:]*) Совпадает, но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, строчные символы ASCII и двоеточие.
  • (?<recall>\d*\.\d*) Захват группы с именем recall, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'a-z:]*) Сопоставьте, но не запишите e все в классе символов, который включает в себя: запятую, пробел, апостроф, строчные символы ASCII и двоеточие.
  • (?<map>\d*\.\d*) Группа захвата с именем map фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'A-Z:]*) Совпадает, но не захватывает все в классе символов, включая: запятую, пробел, апостроф, верхний регистр ASCII символы и двоеточие.
  • (?<NDCG>\d*\.\d*) Захват группы с именем NDCG, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'A-Z:]*) Совпадает, но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<MMR>\d*\.\d*) Захват группы с именем MMR, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'A-Z:]*\d':\s) Совпадает, но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII более высокого кода и двоеточие. Затем за ним следует цифра, апостроф, двоеточие и пробелы.
  • (?<F1>\d*\.\d*) Захват группы с именем F1, фиксирует цифры, десятичную точку и другие цифры .
  • (?:[,\s'A-Z:]*) Совпадает, но не захватывает все в классе символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<HR>\d*\.\d*) Захват группы с именем HR, фиксирует цифры, десятичную точку и другие цифры.
  • (?:[,\s'A-Z:]*) Сопоставьте, но не захватите все в класс символов, который включает в себя: запятую, пробел, апостроф, символы ASCII верхнего регистра и двоеточие.
  • (?<ARHR>\d*\.\d*) Группа захвата с именем ARHR, фиксирует цифры , десятичная точка и больше цифр.

Реализация Matlab:

Прочитайте свой текстовый файл с fileread и выполните обычную выражение.

Ключевое слово names используется для возврата имени name и текста для каждого именованного токена.

data = fileread('mytext.txt');
alldata = regexp(data,"(?:TEST.*?(?=\d\.))(?<AUC>\d*\.\d*)(?:[,\s'a-z:]*)(?<precision>\d*\.\d*)(?:[,\s'a-z:]*)(?<recall>\d*\.\d*)(?:[,\s'a-z:]*)(?<map>\d*\.\d*)(?:[,\s'A-Z:]*)(?<NDCG>\d*\.\d*)(?:[,\s'A-Z:]*)(?<MMR>\d*\.\d*)(?:[,\s'A-Z:]*\d':\s)(?<F1>\d*\.\d*)(?:[,\s'A-Z:]*)(?<HR>\d*\.\d*)(?:[,\s'A-Z:]*)(?<ARHR>\d*\.\d*)",'names')

Вывод ut реализованного кода представляет собой массив 1 × 2 struct с указанными группами захвата как поля.

alldata(1):

AUC: '0.02361111111111111'
precision: '0.012'
recall: '0.0034607372805101266'
map: '0.006173611111111111'
NDCG: '0.0038391623343341052'
MMR: '0.024472222222222218'
F1: '0.005372169077405249'
HR: '0.048'
ARHR: '0.02458333333333333'

alldata(2):

AUC: '0.034277777777777775'
precision: '0.016416666666666666'
recall: '0.003939761087163834'
map: '0.009020833333333329'
NDCG: '0.0052255728628175955'
MMR: '0.035861111111111094'
F1: '0.006354527945317168'
HR: '0.06566666666666666'
ARHR: '0.0359722222222222'

Для доступа к вашим данным просто используйте точечную нотацию, например alldata(1).AUC. что для численных расчетов вам нужно будет преобразовать поля из векторов символов в парные.

Дополнительное видео по вопросу: Преобразование словарей python в MATLAB

Introduction to Machine Learning, Part 2: Unsupervised Machine Learning

Getting started with Simulink Coder Support Package for BBC microbit, Part 3

double pendulum part 4 - matlab simulation