Wolfram EngineをVisualBasicで使う(10:機械学習の簡単な実装・続き)
線形回帰で予測値を出すということを可視化してみようと思います。
今回は、「新しい入力値」や「それに対する予測値」のテキスト欄、「手法」のプルダウンメニューはいらないと思います。ので消します。
- GUIを次のようにPicturBoxを追加し、グラフが大きく表示できるように変更しました(400x400 pixが表示できるぐらいに)。
線形回帰を表示されるグラフ領域を作成 -
下の画像部分に次の2つのグラフを表示します。
・線形回帰分析の結果の直線
・学習用データの散布図
今回はちょっとコードを工夫してみました。
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")
ml.WaitAndDiscardAnswer()
ml.EvaluateToOutputForm("trainingset = {" + TextBox1.Text + "}; p = Predict[trainingset, Method -> ""LinearRegression""]", 0)
Dim tmp_txt As String = ml.EvaluateToOutputForm("MapApply[List, {" + TextBox1.Text + "}]", 0)
Dim result_plot As Image = ml.EvaluateToImage("Show[Plot[p[x], {x, -1, 5}], ListPlot[" + tmp_txt + "]]", 400, 400)
PictureBox1.Image = result_plot
End Sub
End Class
-
まず、
ml.EvaluateToOutputForm("trainingset = {" + TextBox1.Text + "}; p = Predict[trainingset, Method -> ""LinearRegression""]", 0)
ですが、今回は線形回帰しか使わないので「LinearRegression」で固定します。また、前回にあった、「予測したい値をテキストボックスから持ってきて、、モデルpを適用する部分はいりません。
また、予測値を返すわけでもないので、「Dim result As String =」も不要で、単純にWolfram言語の分を評価するだけになります。
-
次の
Dim tmp_txt As String = ml.EvaluateToOutputForm("MapApply[List, {" + TextBox1.Text + "}]", 0)
は、少しテクニックです。Wolfram言語の特徴を示しています。
学習データをプロットしたいのですが、テキストボックスには、Wolfram言語のルールの形式「a -> b」という形で書かれています。これをプロットするにはデータをリスト形式にする必要があります。
MapApplyはWolfram言語の特徴的な関数の一つでです。ルール「a -> b」というのは内部的には「Rule [a, b]」と表現されています(このあたりがWolfram言語がLisp的という人もいる理由です)。この頭の「Rule」を「List」にするということです。その結果。「List [a, b]」のように置き換えられ、表示上は「{a, b}」となります。
1->1.8, 2->2.1, 3->3.0, 4-> 4.4
という入力テキストが、「tmp_txt」という文字列に
{1,1.8}, {2, 2.1}, {3,3.0}, {4, 4.4}
という形で入ります。これでListPlot[]というグラフを書く関数に渡すことができます。
-
その次に、先に上げた2つの「線形回帰分析の結果の直線」と「学習用データの散布図」を1つのグラフ上に描画します。
Dim result_plot As Image = ml.EvaluateToImage("Show[Plot[p[x], {x, -1, 5}], ListPlot[" + tmp_txt + "]]", 400, 400)
-
そして、VisualBasicのGUIデザイン画面のPictureBoxに表示します。
PictureBox1.Image = result_plot
- 実際に実行してみます。
学習データを入力 -
学習データを入力して、「Predict」ボタンを押すと、Wolfram Engineが起動して、次のようなグラフを表示します。
結果:線形回帰(直線)と学習データ(散布図)
今回のコードで特徴的なことがあります。
これまでは、「EvaluateToOutputForm ()」の中にすべてのWolfram言語のコードを書いていましたが、今回は、「EvaluateToOutputForm ()」と「EvaluateToImage ()」の2つを使っています。
後ろでWolfram Engineが生きていれば、「p」という学習済みのモデルをVisualBasicのコード内でそのまま生かして、次のWolfram言語のコードで呼び出せるということがわかります。
今回はだらだらとした説明が多かったのですが、役に立ったでしょうか。。。