雷雲.ARCHIVEを公開しました

機械学習の習作をかねて作成していた、過去の雷雲発生状況検索サービスを公開しました。まだ日付単位での表示しか出来ませんが、もう2~3検索機能を追加する予定でいます。

私自身が、故障したパソコンを修理するにあたって、何時雷がなっていたか明確にする必要に迫られた事から作成した物です。気象庁のホームページには過去に遡った観測記録がありますが、観測地点の数が1県に数カ所しか無い上に、雷の有無を条件に検索する事ができません。データの基となっている雷ナウキャストも過去1週間程度しか遡る事ができません。落雷証明書を発行している気象会社もありましたがWEBで検索できるのは過去2週間までで、これ以上古い情報は有料となっていました。

これで曖昧な記憶からも、何時に落雷があったのか素早く推測できるようになります。

どの辺りが機械学習?って感じのサービスですが、基となった気象図の座標を、緯度経度にマップするために機械学習を使っています(ニューラルネットワークを使って回帰分析モデルを作る)。使用している座標系の違いや、平面から球面に戻すための幾何学計算はけっこう面倒なものなのです。自分で平面にマップした物を、球面に戻すならなんとかなると思うのですけどね。

記憶域プールでトライブルに見舞われたので覚書2

記憶域プールでトライブルに見舞われたので覚書に続いて、またトラブルに見舞われたので覚え書きを残しておく。

物理ディスクは正常

回復性の低下のエラーが出ているが、物理ディスクセクションは全て正常という状態になった。PowerShellからステータスを確認すると記憶域スペースは確かにDegradedモードになっているが、物理ディスクは全て正常になっている。

PS C:\WINDOWS\system32> Get-VirtualDisk

FriendlyName ResiliencySettingName OperationalStatus HealthStatus IsManualAttach Size
------------ --------------------- ----------------- ------------ -------------- ----
RAID5        Parity                Degraded          Warning      False          3 TB


PS C:\WINDOWS\system32> Get-PhysicalDisk

FriendlyName       SerialNumber         CanPool OperationalStatus HealthStatus Usage            Size
------------       ------------         ------- ----------------- ------------ -----            ----
USBHDD1            0123456789ABCDEF     False   OK                Healthy      Auto-Select   1.82 TB
USBHDD2            0123456789ABCDEF     False   OK                Healthy      Auto-Select   1.82 TB
USBHDD3            00000000354340b930b5 False   OK                Healthy      Auto-Select   1.82 TB

例によってRepair-VirtualDiskは正常に終了して何も教えてくれない。物理ディスクを追加してもDegradedモードから戻らない。前回と異なりchkdsk -rで全セクタのチェックを行っても正常となる。

一見すると正常に使えているのだが、どうも管理領域が破損している物と思われる。仕方が無いので、再び前回と同じように、新たな記憶域スペースを作成してデータを移動したあと、既存の記憶域スペースを削除する事で対応することにした。

せっかく便利な機能なのだから、もうちょっとなんとかならないのだろうか。

ニューラルネットワークを使って回帰分析モデルを作る

地図上の座標に対して大体の緯度経度を求めたかったので、Accord.NETのニューラルネットワークを使った機械学習で回帰分析モデルを作って対処してみた。

本当はきっちり計算式を求めて算出すれば良いのだろうけれど、平面を球面に投射する変換式とか、測地系の変換とか私の数学センスでは手が出ない。そもそも元の地図がどんな図法かもしらないし・・・。と言うわけで、思考を放棄して機械に頼ることにした。

1. 学習元データを作成する

地図上の特徴的な地形の場所の座標と、緯度経度を対にした学習データを作成する。ニューラルネットワークでは学習データのない入力に対して、どのような出力が発生するか予測困難という特徴がある。変換対象内に満遍なく学習サンプルをとるのは当然として、実用上変換したい地図上の座標の上下左右の隅の辺りの学習サンプルも加えるのが重要。
ニューロンからの出力は0~1の範囲になるので、学習元データの出力がこの範囲に収まるように適当に剰余算して丸めておきます。

2.学習アルゴリズムの選択

BackPropagationLearning(誤差逆伝搬法)による学習だと誤差の収束に時間がかかるので、LevenbergMarquardtLearning(レーベンバーグ・マーカート法)を使います。

3.最適な中間層の数を推定する

学習サンプルを使ってニューラルネットワークに学習させた後、学習済ネットワークに学習サンプルを与えて計算をさせ出力の差を積分することで、学習誤差を求める。これを中間層の数を増減させながら繰り返し、学習誤差が大きくならない、最小の中間層の数を求めます。
中間層が多いほどより複雑なデータを学習することがでますが、学習サンプル間を補間するときに発振してしまう可能性が高くなります。可能な限り少ない中間層の数で学習させると、なだらかな曲線で補間される可能性が高くなります。

4.最適な学習済ニューロンを作る

最適と思われる中間層の数を確定したら、学習データを元に学習済ニューラルネットワークを複数作ります。ニューラルネットワークは初期値として与える乱数データによって、学習結果がどのような状態に収束するか変わります。したがって良好な学習結果を得るためには初期状態を変えながら複数の学習結果を得て、その結果同士を比較する必要があります。
今回私は学習誤差の小さい物を最適と判断したました。用途によっては単純に誤差の小さい物では無く、判定方法を変える必要があると思います。

5.使う

これで一応は学習モデルが出来たので、実際に使って異常な変換とか発生しないか確かめます。使いたい範囲内で変な発振してないので大丈夫っぽい。