しいたげられたしいたけ

災害時のデマ、絶対ダメ!

Excelで手軽に試す機械学習(序章:ニュートン法とExcelマクロ)

2年ほど前に、斎藤康毅『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』(オライリージャパン) という本を、半年ほどかけて読んだ。

おかげで「機械学習」というものがどういうものか、自分なりに理解できたように思った。

ただし、理解することより他人に説明することのほうが困難だ。道具として使いこなすことは、さらに困難だ。

弊ブログに過去記事をいくつか残しているが、これらは純然たる自分用メモで、他人が読んで簡単に理解できるようなシロモノでないことは、書いた本人がよく自覚している。

これらを高校数学とパソコンの知識がある人なら理解できるように書き直したいということは、『ゼロから作るDeep Learning』を読んだ直後からずっと考えていた。ところが実生活でつまらないトラブルに巻き込まれたことが主な原因で、ずるずると先延ばしにしてしまった。

なおトラブルというのは、これはこれでネタになるので、将来ブログに書くかも知れない。法律という武器を使った。また他人の力を大幅に借りた。そしてグダグダながら、どうやら勝ってしまったらしい。

そこで遅まきながら、何回かに分けて「Excelで手軽に試す機械学習」というシリーズを書いてみようと思った。今回は『ゼロから作るDeep Learning』を離れて、できるだけ自分の言葉で説明することを心がけたい。目安としては、7セグメントLEDをパソコンに学習させるあたりまで、できるだろうか? 欲を言えば「誤差逆伝播法」もやりたいのだが。あれは応用数学的にめっちゃ興味深かったので。

www.watto.nagoya

今回は「序章」として、ニュートン法による方程式の数値解法を、Excelのマクロを使ってやらせるところまで書いてみたい。読者を選ぶ内容なので、よくやるように新着をお騒がせするのを避けるため、日付をさかのぼって公開します。

 

ニュートン法というのは、以下のようなものだった。

方程式 f(x) = 0 の解を数値的に求めたい。まずはどこか適切そうな初期値 x0 をとり、関数 f の導関数 f' の初期値 x0 における値を用いて、解により近い値 x1 を求める。

下に示すグラフで、グラフ上の点 (x0f(x0))x軸上の点 (x0, 0、そして (x0,f(x0)) における接線とx軸の交点 (x1, 0) のつくる三角形に着目する。

(x0f(x0)) における接線の傾きは f'(x0)なので、x1 は

f:id:watto:20190720114444p:plain

で計算できる。

同様の手順で x2 、x3 …と計算を繰り返すことにより、グラフと x軸の交点の x座標すなわち方程式 f(x) = 0 の解が、いくらでも正確に求められるのである。

f:id:watto:20190720113914p:plain

間違ったこと書いてませんよね? ご指摘歓迎。

 

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

  

この方法を用いて、ごく簡単な実例をExcelに計算させてみる。

f(x) = x^2 - 2 として f(x) = 0 を解くと、x = ± √2 となる。f(x) = 0 の数値解を求めるということは、√2 の値を計算するということだ。繰り返し計算は、マクロにやらせてみる。

スクリーンショットはExcel2016から採取しました。

f:id:watto:20190721011230p:plain

セルB2は、xの初期値を入れる。C2には、数式「=B2^2-2」を入力する(カギカッコ内の数式はExcelにコピペ可能のはず。以下同じ)。

「数値微分作業エリア」のセルE3は、データの直接入力である。F2には「=B2+E3」がと、G3には「=F3^2-2」と入力する。

これらのセルの計算結果を用いて、数値微分 f'(x)すなわちセルE6の「=(G3-C2)/E3」と、x1すなわちセルB6の「=B2-C2/E6」を計算する。

数値微分をあえて用いるのは、機械学習という今後の主題を見すえてのことである。

一覧表にまとめたほうが、わかりやすいかな?

セル  数式
 B2 (数値)
 C2 =B2^2-2
 E3 (数値)
 F3 =B2+E3
 G3 =F3^2-2
 E6 =(G3-C2)/E3
 B6 =B2-C2/E6

この状態で、セルB6をコピーしてセル B2に「値の貼り付け」を行う。

この操作を繰り返すと、驚くべきスピードでB2 の値は「1.41421356」に、C2の値は「0」に収束するはずである。なおB2の初期値をマイナスにとると、B2の値は「-1.4142136」に収束する。

 

今回は、繰り返し計算をマクロに記録してやらせるところまでやってみたい。

Excel2016では、マクロを記録するための「開発」タブが初期状態では非表示なので、表示させる。

リボンの「ファイル」をクリックし、情報画面の左端メニューいちばん下の「オプション」をクリックする。

f:id:watto:20190720125604p:plain

 

「Excel のオプション」画面が表示されるので、「リボンのユーザー設定(B):」の「□開発」にチェックを入れる。

f:id:watto:20190720125643p:plain

ワークシートに戻ると「開発」タブが表示されるようになる。

 

「開発タブ」中の「マクロの記録」ボタンをクリックすると

f:id:watto:20190721011343p:plain

 

「マクロの記録」ダイアログボックスが表示される。「OK」ボタンをクリックすると、操作の記録が始まる。

f:id:watto:20190720133504p:plain

記録中は、「マクロの記録」ボタンは 「■記録終了」に変化している。何か操作ミスをしたら、この「■記録終了」ボタンをクリックして最初からやり直せばいい。

 

記録するのは次の2操作だけである。

  1. セル「B6」上で右クリックし、ショートカットメニュー「コピー(C)」をクリックする
  2. セル「B2」上で右クリックし、ショートカットメニュー「貼り付けのオプション:」から「値(V)」をクリックする

f:id:watto:20190721020636p:plain

 

上記2つの操作をしたら、「■記録終了」ボタンをクリックして、マクロの記録を終了する。

f:id:watto:20190721011558p:plain

 

記録したマクロは、リボンの「マクロ」ボタンで確認できる。

f:id:watto:20190721011729p:plain

 

「マクロ」ボタンをクリックすると「マクロ」ダイアログボックスが表示される。

f:id:watto:20190720133815p:plain

 

記録されているマクロは「実行(R)」ボタンをクリックすれば実行できるが、繰り返し実行には適していないので、ボタンを作成してマクロを割り当てることにする。

 

「挿入」ボタン配下の「フォームコントロール」中「ボタン(フォームコントロール)」をクリックする。

f:id:watto:20190721011823p:plain

 

ワークシート状のどこか空いている場所(データの入力されたセルのない場所)で斜めにドラッグすると、「マクロの登録」ダイアログボックスが表示される。

記録されたマクロのうち、ボタンに登録したいマクロ名をクリックして選択する。一つしかなければ、それでいい。

f:id:watto:20190720135718p:plain

 

「OK」をクリックすると、ドラッグしたサイズのボタンが表示される。

一旦無関係な場所をクリックして選択を解除してからクリックすると、記録したマクロが実行される。

f:id:watto:20190721011902p:plain

 

ボタンの編集や削除は、一旦ボタン上で右クリックするとボタンが選択できるので、そうしてから行えばいい。

さらにC2とG3の数式を、

「=B2^2-3」「=F3^2-3」

「=B2^2-5」「=F3^2-5」

などと変更すると √3、√5 などの数値が求まるので、理系人間は面白がってくれるんじゃないかな。

とにかく気持ちいいほど収束スピードが速いのだ。理系人間だったら知ってるか、当然。

 

ちなみにマクロつきExcelブックを保存したいときには、「名前を付けて保存」ダイアログボックスの「ファイルの種類(T):」から、「Excelマクロ有効ブック(*.xlsm)」を選択する必要がある。

f:id:watto:20190720140341p:plain

 

マクロつきExcelブックを開いたときには「セキュリティの警告」メッセージが表示される。

f:id:watto:20190721011932p:plain

マクロを有効にしたいときには「コンテンツの有効化」をクリックすればいい。

 

なお「セキュリティの警告」は、マクロウイルス(マクロで書かれたウイルス)の被害を防ぐためのものなので、もし身に覚えのないファイルで「セキュリティの警告」が表示された場合には、「コンテンツの有効化」をクリックしないで、ただちにファイルを削除しウイルススキャンを実行してください。

ご存知のこととは思いますが、念のため。

 

繰返しになりますが、今回はあくまで序章で、本題に入るのは次回以降です。

 

追記:

今回のシートの内容をCSVで保存してみました。

,x,f(x)=x^2-2,,数値微分作業エリア,,,,
,10,=B2^2-2,,h,x+h,f(x+h),,
,,,,0.0001,=B2+E3,=F3^2-2,,
,,,,数値微分,,,,
,x1=x-f(x)/f'(x),,,f'(x)=(f(x+h)-f(x))/h,,,,
,=B2-C2/E6,,,=(G3-C2)/E3,,,,

上のデータをテキストファイルに保存し、拡張子を「.csv」に変更してExcelで開いてください。罫線や列幅などの情報は飛んでしまいますが、数式、数値、文字データの入力の手間は省略できるはずです。

スポンサーリンク