Wolfram EngineをVisualBasicで使う(9:機械学習の簡単な実装)
これまでは、なにか1つ関数を入れたらその結果が表示されるように作ってきましたが、今回は、Wolfram Engineに値を与えて学習させ、その学習モデルを使って入力値に対する予測値を返すようにしたいと思います。
GUIは少しテキストを入れて、どういうふうに入力するかを説明しました。
今回は、XY値のペアを食わせて、新しいX値が来たときにどのようなY値が予想されるかを考えます。Wolfram言語では「Predict」関数です。
どういう動きをさせたいかを説明します。
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」で、上の手法のリスストを追加します。
で、コードを次のように変更します。
コンボボックス内の選択された文字列を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 |
学習量が足りないか。。。
Copyright (c) 2023-2024, techtechlab by DataWith