技術屋にゃん兵衛のてくてくらぼ by データウィズ [DataWith]

気の向くままソフトについて書いてます。バリバリエンジニアではないのであくまでも初心者目線で。

Wolfram EngineをVisualBasicで使う(9:機械学習の簡単な実装)

Wolfram EngineをVisualBasicで使う(1:VisualStudioでの流れを把握)

Wolfram EngineをVisualBasicで使う(2:Wolfram言語の入力を受け付ける)

Wolfram EngineをVisualBasicで使う(3:グラフを表示してみる)

Wolfram EngineをVisualBasicで使う(4:入力により結果を数字とグラフで切り替える)

Wolfram EngineをVisualBasicで使う(5:グラフィックスの対応範囲を広げる)

Wolfram EngineをVisualBasicで使う(6:オンラインリソースって使えるの?)

Wolfram EngineをVisualBasicで使う(7:画像ファイルの処理)

Wolfram EngineをVisualBasicで使う(8:化学構造式の描画)

Wolfram EngineをVisualBasicで使う(9:機械学習の簡単な実装)

 

Wolfram EngineをVisualBasicで使う(9:機械学習の簡単な実装)

 

これまでは、なにか1つ関数を入れたらその結果が表示されるように作ってきましたが、今回は、Wolfram Engineに値を与えて学習させ、その学習モデルを使って入力値に対する予測値を返すようにしたいと思います。

 

GUIは少しテキストを入れて、どういうふうに入力するかを説明しました。

 

今回は、XY値のペアを食わせて、新しいX値が来たときにどのようなY値が予想されるかを考えます。Wolfram言語では「Predict」関数です。

 

機械学習用のGUI

どういう動きをさせたいかを説明します。

 

1.TextBox1に、学習データを入れる(今回はWolfram言語感を出したいため、Wolfram言語の形式で入力します。それを画面上の説明文に書いています)

2.学習データと同時に、新しい入力データをTextBox2に入れます(今回は学習と予測を一回ですることにしました)。

3.「Predict」ボタンを押すと、TextBox1のデータを学習し、TextBox2が入力されたときの予測値をTextBox3に表示する

 

理屈は簡単で、実装も簡単。

 

上の入力部分は、Wolfram言語の

1->1.5, 2->2.3, 3->3.1, 4-> 4.1

のような形式、Rule「ルール:規則」、で入力するため、この文字列を直接、Wolfram言語のコードに連結すればよいです。

 

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()

 

        Dim result As String = ml.EvaluateToOutputForm("trainingset = {" + TextBox1.Text + "}; p = Predict[trainingset, Method -> ""LinearRegression""]; p[" + TextBox2.Text + "]", 0)

        TextBox3.Text = result

 

    End Sub

End Class

 

今回は「Predict」を「LinearRegiression」を使って行うように定義しました。

ここでのTIPSは「Method -> “”LinearRegiression””」です。Wolfram言語ではダブルクオートですが、VisualBasic側では「"”LinearRegiression””」のように2つのダブルクオートで書かないとエラーになります。

 

さて、実際に実行してみます。

先ほどの学習データを使って、「2.2」が入力されたときに帰ってくる値を予測します。

 

学習データと新しい入力値

「Predict」を押すと、次のように「2.49543」が返ってきました。

まあよさそうです。

 

予測値が返ってきた

「Predict」では、「LinearRegression」「NeuralNetwork」「RandomForest」「GaussianProcess」「NearestNeighbors」などの手法が使えます。

これらは単純に「Method->”手法名”」と書くだけで切り替えできます。

 

なので、今ハードコードしている「LinearRegiression」をメニューで切り替えられるようにしています。

 

画面のデザインにComboBox1を追加し、「プロパティ」の「Items」で、上の手法のリスストを追加します。

 

GUIにコンボボックスを追加

プルダウンメニュー項目の定義

で、コードを次のように変更します。

コンボボックス内の選択された文字列をMethodのルールに埋め込むコードです。

 

Dim result As String = ml.EvaluateToOutputForm("trainingset = {" + TextBox1.Text + "}; p = Predict[trainingset, Method -> """ + ComboBox1.SelectedItem.ToString() + """]; p[" + TextBox2.Text + "]", 0)

 

さて、実行してみます。

 

今日の完成形

で、「LinearRegiression」だと、「2.49543」が正しく返ってきました。

 

ちなみに、他のMethodにした時の結果は次のようになりました。

学習データ、推測する入力値は同じです。

 

LinearRegression

2.49543

NeuralNetwork

2.40668

RandomForest

3.0004

GaussianProcess

2.46515

NearestNeighbors

2.3

 

学習量が足りないか。。。

今日はここまで。