土曜日, 7月 09, 2016

Mathematicaプログラムコードの手直し

Mathematicaが動いた!!!
なんという事か!? Unbelievableとはまさにこのことだ。
さすがだ!。こういう事も10.4.1.0ならあり得るかもしれないと最後の賭けのつもりでバージョンアップをしたのだったが。

やはり、もう駄目と思い込んだ矢先に、朗報が届いた。一度にいろいろな事が起きたので、書かないでいたが亘香通商さんの薦めでバージョンアップしたのだが、期待に反して動かず米本社に手紙を書いたが、それ対して回答をもらうためには通常のユーザではなくプレミアムユーザにならなければならず、米国以外のユーザは本国の代理店にプログラム持参で相談するような指示が届いた。

その結果、

平素は弊社代理店商品「Mathematica」をご愛顧賜り厚く御礼申し上げます。

お客様のノートブックファイルを拝見させていただきました。
2.3当時の文献をもとにされているためか,Regress関数が使用されておりますが,7.0以降の線形回帰はWolfram 言語に組み込まれております。
今回お客様がご使用になられたLinearModelFit関数が,まさにそれにあたります。
判り易くするためにお客様の入力されたデータを表にしてみました。
観測値
z
No.1
9.4
5.3
8
No.2
13.5
8.4
11
No.3
8.2
6.2
7
No.4
18.6
11.8
16
No.5
10.9
9.2
10
No.6
7.8
4.3
6
No.7
12.6
7.1
11
No.8
15.6
11.5
9

統計ソフトの場合,上記のような表を用意するだけで,お客様がお求めになられようとしていた数値がいとも簡単に得られます:

などと最初の返信が届いていた。最初は一般的な話だったが、参照したプログラムを見た方が、プログラムが少々おかしいと気づかれ、問題点を指摘してくれた。
最初はありきたりの指摘だったが、一々返信していたら、一般的な部門ではなく専門部門から吟味したメールが届き、あやまりの内容が分かってきた。

統計ソフトの場合,上記のような表を用意するだけで,お客様がお求めになられようとしていた数値がいとも簡単に得られます:
 
係数
切片
0.508216
X 1
0.775925
X 2
0.55167

しかしMathematicaは万能な数式処理ソフトではあるものの,統計解析に特化したプログラムではなく,さらにはWolfram言語という独自の言語を使用しているため,それらの充分な理解が必要となります

端的に言えば次の数値は,間違いではありません:
{1,00797,0.946487,-0.336903}
それから先の作業があるのです。
添付のファイルを参照ください。

通常,エンドユーザーのテクニカルサポートは米国のサポート窓口で受付けておりますが,今回代理店への連絡を要求するケースは稀なため,おそらくプログラムに異常が発生したものと解釈したのではないかと考えます。

とりいそぎ以上お伝えいたします。

亘香(せんこう)通商株式会社 (SENKO Corporation)
ヘルプデスク
220-0004 神奈川県横浜市西区北幸2-9-30 横浜西口加藤ビル2F

この時は「それから先があるのです」の意味がわからなかった。

さらに

平素は弊社代理店商品「Mathematica」をご愛顧賜り厚く御礼申し上げます。

お返事ありがとうございます。
新しいバージョンではWolfram言語を使った関数に置き換わっていますが,古い関数が機能しないわけではございません。
そこでお客様のノートブックファイルをWolfram 社の東京オフィスのテクニカル担当者がチェックしたところ,
以下のような問題点が見つかったとのことです:(青字の部分:原文のまま)
頂いたオリジナルのコードは、バグがあって、正常に動作しません。
# コーディングのバグと、論理的なバグ、また、仕様上の不適合があります。

つまり,「コードを修正すれば、LinearModelFit[ ] の結果を再現できます。」とのことでこれを同担当者が修正したものを本メールに添付しておりますので,ご査収のほどよろしくお願い申し上げます。

なお「2.1で行った結果のメモ」はどのようなフォーマットで保存されているかにもよりますが,Excel の形式(xlsx)であれば, Import[ ] で簡単に読み込めます。

亘香通商株式会社
ヘルプデスク

このメールはDELL NOTEで会社で受信したのだが、会社ではMathematicaがないので、中身がわからない。それでノートごと持ち帰り、家で帰ってから、もう一度ノートのメールを見ながら中身を検討した。MacのThunderbirdではどれも青い色の部分が通常どおりに表示されどこが青い色の部分かわからなかった。



これによると,
現代数学社のMathematicaによる多変量解析の本には、コーディングのバグと、論理的なバグ、また仕様上の不適合があります、と指摘されていた。

これで、ようやく買ったばかりの新製品のバグではないらしいと気持ちが変わりはじめる。 



そこでまず、最初の実行ファイルを見る事にする。

本の通り入力した筈であるが、最初に指摘されたのがnの定義とmyの定義の間にセパレータがないので誤動作する。正しくはn=Length[data];とセミコロンを挿入する。そこで、原文を参照したら、ちゃんとセミコロンがついているではないか!?全然気づかなかった。

しかし、以降の話は著書の側の話で、小生の責任ではない。それでも指摘の通りにプログラムを直すと、指摘の通りに動いた。新しいプログラムはこれである。


これだと、教科書どおりの答えが出ている。そしてLinearModelFitの実行結果は昨日示したウインドウズ版エクセルに追加した小生のデータ解析結果

の数値と似ている!。どちらも同じデータであり、定数項を持たせる点でも同じであるが、計算誤差の蓄積がソフトでそれぞれ異なるために微妙な差が出てくるようである。

再三にわたり小生の初歩的ミスや疑問に手を抜かずおつきあいいただいた亘香通商のご担当の方々に心から感謝し、お礼申し上げる。

それにしても、Mathematicaの奥行きの深さは想像すらつかない。今回の指摘でも、説明変数の並べ方は、最初にx1、x2、そしてyというふうにデータをならべるのが暗黙の作法だそうだ。(2変数の重回帰の場合)。手紙の中にその先があるのです、という下りはそのことと関連して、偏回帰係数にマイナスが出る結果は、計算自体はあっているという。ただ、教科書のプログラムでは何をyとしているかの断りがないので、同じ並べ方をしてしまったが、エクセルで確認しても-の値がでる。

わざわざデータの並べ替えをしていただいて、regressionというプログラムと
デフォルトで装備されている線形分析機能を使った結果が、示されている。

つまり、データとその配列の順序が同一ならば、同一の結果が返される、と解釈して問題なかろう。

これで万事めでたし、となれば言う事はないのだが、また課題が出てしまった。

実はこういう問題である。このプログラム上には二つの実行可能なプログラムがあり、入力ー訂正したregressionとバージョン7以降、呼び出さなくてもすぐ答えのでるLinearModelFitというものが記述されている。訂正プログラムで、小生のデータ結果が(7)となっているように、プログラムが動く事を確認したのは、data1という8組のデータで正しいとされた結果が出たので、そのままに。その後では自分のデータは36データを読み込ませてみると、エラー的結果になった。
それで、原因がわからず、ヘルプデスク宛返信に書いてしまった。すると、実行環境のOSのバージョンを確認され、問題なしとわかり、送られたデータの数字の上から4行目の左側の{1.06, 0.35, .242}、となるべきなのに、0.35242となっていることに直に気づき、推測で配列をかきなおすと、指摘されるようなエラー的メッセージはでませんが、と答えてくれた。

送ったデータをチェックすると、配列になっておらず、動く訳なカンーベであった。最初に置かれた呼吸データを配列の最後に置くという暗黙の了解にしたがった措置で、急いでいたためチェックがおろそかになった結果である。

それでこれで決まりとばかりやってみたが、やはり動かない。それで、眼鏡をかけてもう一度でデータを眺めて行くと、多分お気づきにならない、もう一箇所の不適合が見つかり、それをなおしたら、すんなり結果が出た。Ver.7以降ついているなら前からある9.0でも動くかも、と思い、こちらのデータはチェックしてあったので、実行したら、やはり問題なく動いた。


In(2)とあるので、data文を読み込ませ、regressionプログラムを実行した値はどういう訳か-の値を含み、他の値も遠くはないがちがっている。備え付け機能の方はマルチ回帰で出した値とほぼ一致している。どういう事!??。さっぱりわからへん。
これはもう1台のiMac El Capitan (10.11.5)で動かしたバージョン9.0での動作結果である。

デバッグと毎回表示され不愉快だが、結果はその前のMaverick (OSX10.9.5)での演算と一致している。regressionプログラムの結果も一致している。

これから考えられることは、regressionプログラムの機能が偏差平方和を求める式で、その前の逆行列から求める式(動作しなかった、Theoristでは妥当な数値が得られた)よりは手計算式的なところがあって、組しやすいとおもって、最初の挑戦に選んでしまった。

しかし、テクニカルサポ−トからの回答にも、バグではないが改善したほうがよい点としてDet[ ]やInverse[ ]などの行列関数を使ったほうが拡張性が高まる、とご指摘いただき、さらにSum[list[indes],{index,1,Length{list]}]よりも、Total[list]を使う方が自然、などと指摘された。

Wolframのテクニカルサポートは,別途プレミアサービスの加入が前提となるので,実質有料サポートということになります。スタッフは全員が博士号の取得者で知識も豊富で実に頼りになると思われますが,それなりにMathematicaや言語に関する知識も要求されるかもしれません。プレミアサービスの普及に努める当社では自らテクニカルサポートは行っておりませんし•••などと親切なアドヴァイスをいただいている。
ありがとうございます。


組み込み式はおそらく、計算の打ち切りや桁落ちなどに対処してある結果だろうと、まだきまったわけではないが、それだけの長い経験の結果なのかもしれない。

この分散分析表なども出力させてみたい。20年間の空白は限りなく大きいかも、とだんだん分かってきた。!!

0 件のコメント: