2011-07-06 13 views
11

Z Mathematica 7 i 8 odkryliśmy, że Mathematica nie jest w stanie prawidłowo zapisać i uzyskać wynik dopasowanej procedury. Mam nadzieję, że ktoś tutaj wie: Jaki jest najlepszy sposób obejścia tego błędu?Zapisywanie FittedModel jest buggy

Naszym zadaniem jest dopasowanie wielu zestawów danych za pomocą NonlinearModelFit, który zwraca FittedModel dla każdego zestawu danych. Te dopasowania trochę potrwają i próbowaliśmy użyć Save i DumpSave do zapamiętania wyników do pliku. Późniejsza analiza wykorzystuje Get, aby pobrać FittedModel (y) z powrotem.

Mathematica wykonuje Save & Otrzymuj bez ostrzeżenia, ale FittedModel, który wraca, jest błędny. Nazywamy Get i ładujemy FittedModel z dysku, wywołaj wynik "foo". Próba foo [10] ocenia dopasowany model za pomocą wejścia 10. Błąd, który widzimy, polega na tym, że foo ["BestFitParameters"] powinien zwrócić listę reguł, ale zamiast tego dodaje łańcuch do funkcji, ponieważ był to numer podobny do 10. Próba foo [{"BestFitParameters", "BestFitParameters"}] powinien dawać reguły dwa razy na liście, ale pozostaje nieoceniony z buggy foo.

Jest to dziwne i mylące zachowanie na górze to, w zależności od tego, czy mamy Usuń/Usuń foo lub opuścić jądra:

  • Oblicz FittedModel jak foo
  • Zapisz lub DumpSave foo na dysku
  • Wyjąć i/lub Wyczyść foo
  • Get foo z dysku
  • foo działa dobrze

Ale jeśli ponownie uruchomić jądro to nie

  • obliczyć FittedModel jak foo
  • Zapisz lub DumpSave foo na dysku
  • zabić i ponownie uruchomić jądro
  • Get foo z dysku
  • Foo jest buggy

Czy ktoś wcześniej widział takie zachowanie?

Czy istnieje dobre wytłumaczenie tego błędu?

Czy istnieje dobre obejście tego problemu?

+3

Czy możesz dodać krótki przykład kodu? –

Odpowiedz

10

Jest to znany błąd i na szczęście istnieje proste obejście tego problemu. Przed dokonaniem oceny Get, aby odczytać zapisany FittedModel, należy ocenić fałszywy model modelu.

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}} 

Jeżeli wstępna ocena jest pomijany, dopasowanego modelu nie wydaje się działać poprawnie jak stwierdził podobno z powodu awarii automatycznie załadować cały kod zależną, która implementuje funkcjonalność. Ocena In[1] zasadniczo wymusza ładowanie.

+0

Postaramy się wypróbować pierwszą rzecz o poranku (czas w Wielkiej Brytanii)! –