Сохранение FittedModel является ошибкой
С Mathematica 7 и 8 мы обнаружили, что Mathematica не удалось правильно сохранить и получить результат подгонки. Я надеюсь, что кто-то здесь знает: какова наилучшая практика для этой ошибки?
Наша задача состоит в том, что мы устанавливаем множество наборов данных с помощью функции NonlinearModelFit, которая возвращает FittedModel для каждого набора данных. Эти припадки занимают некоторое время, и мы попытались использовать Save и DumpSave для запоминания результатов в файл. Последующий анализ использует Get, чтобы вернуть FittedModel обратно.
Mathematica выполняет команду "Сохранить и получать без предупреждений", но FittedModel, которая возвращается, ошибочна. Мы вызываем Get и загружаем FittedModel с диска, вызываем результат "foo". Попытка foo [10] оценивает модель с вводом 10. Ошибка, которую мы видим, состоит в том, что foo [ "BestFitParameters" ] должен возвращать список правилам, но вместо этого вставляет строку в функцию, поскольку она была числом, например 10. Попробуйте foo [{ "BestFitParameters" , "BestFitParameters" }] должен давать правила дважды в списке, но не оценивается с ошибкой foo.
Наверху есть странное и вводящее в заблуждение поведение, в зависимости от того, удалили ли мы/очистили foo или вышли из ядра:
- Вычислить FittedModel как foo
- Сохранить или DumpSave foo на диск
- Удалить и/или очистить foo
- Получить foo с диска
- foo отлично работает
Но если мы перезапустим ядро, это не сработает
- Вычислить FittedModel как foo
- Сохранить или DumpSave foo на диск
- Убейте и перезапустите ядро
- Получить foo с диска
- foo не работает
Кто-нибудь видел такое поведение раньше?
Есть ли хорошее объяснение этой ошибки?
Есть ли хороший способ обхода?
Ответы
Ответ 1
Это известная ошибка, и, к счастью, есть простой способ обхода проблемы. Прежде чем оценивать Get
, чтобы прочитать сохраненный FittedModel
, оцените код модели, подгоняемый фиктивным способом.
In[1]:= NonlinearModelFit[Range[5], a x, x, a];
In[2]:= Get[FileNameJoin[{$HomeDirectory, "Desktop", "bignlm.mx"}]];
In[3]:= AbsoluteTiming[nlm["BestFitParameters"]]
Out[3]= {17.6010000, {a -> 1.45015, b -> 2.33999}}
Если эта начальная оценка пропущена, установленная модель не работает корректно, как указано, из-за невозможности автоматически загрузить весь зависимый код, реализующий функциональные возможности. Оценка In[1]
в основном заставляет загружать.