にゃん兵衛のてくてくらぼ

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

簡単なMathematicaのコマンドをChatGPTでPythonに変換してみた

簡単なMathematicaのコマンドをChatGPTでPythonに変換してみた

 

以前にChatGPTでPythonのコードを生成してみました。

今回は、前回からの流れでWolfram言語まわりについてさらに実験してみました。

(以下、入力部分は「Wolframドキュメントセンター」より引用、応答部分は「ChatGPT」からの応答です)

 

まずは、ChatGPTに「これから入力するMathematicaコードをPythonに変換してね」と伝えます。

 

入力>

Convert the following Mathematica code to Python:

 

応答>

Certainly! Please provide the Mathematica code you'd like to convert to Python, and I'll do my best to help you with the conversion.

 

「ベストを尽くします」と返ってきた。

よし。頑張ってくれ!

 

Mathematicaのコードを入れます。これは、Wolfram言語のドキュメントセンターからとってきました。

 

入力>

Coefficient[(x + 1)^3, x, 2]

 

出力は次のようになりました。

「SymPyライブラリ使って等価な処理をするとこうです」と言ってますね。この辺りは正しく解釈して、妥当なコードを書きそうな雰囲気です。

 

----------------------------------------------

In Mathematica, the Coefficient function is used to extract the coefficient of a specified term in a polynomial. In your example, you want to find the coefficient of the term with x^2 in the polynomial (x + 1)^3. Here's how you can do the equivalent operation in Python using the SymPy library:

 

import sympy as sp

 

# Define the symbolic variable

x = sp.symbols('x')

 

# Define the polynomial

polynomial = (x + 1)**3

 

# Find the coefficient of x^2

coefficient = sp.poly(polynomial, x).coeffs()[2]

 

# Print the result

print(coefficient)

 

In this Python code, we first define the symbolic variable x, create the polynomial, and then use sp.poly to extract the coefficients. The [2] index is used to access the coefficient of x^2.

----------------------------------------------

 

最後は、いつも通り、少し生成したコードの説明があります。

相変わらず丁寧。

 

さて、このコードをGoogle Colaboratoryで実行してみます。

Google Colaboratoryのノートブックに張り付け

Pythonでの実行結果

きちんと「3」が返ってきました。

 

では、もう少し複雑に、方程式を解かせてみます(これもWolfram言語のドキュメントセンターより)。

 

入力

Solve[x^2 + a x + 1 == 0, x]

 

応答は、、、

 

-------------------------

In Mathematica, the Solve function is used to find solutions to equations. The equation you provided is a quadratic equation. Here's the equivalent code in Python using the SymPy library to solve for x:

 

import sympy as sp

 

# Define the symbolic variables

x, a = sp.symbols('x a')

 

# Define the quadratic equation

equation = x**2 + a*x + 1

 

# Solve the equation for x

solutions = sp.solve(equation, x)

 

# Print the solutions

print(solutions)

 

This Python code defines the symbolic variables x and a, sets up the quadratic equation, and then uses sp.solve to find the solutions for x. The solutions will be printed in a list format.

-------------------------

 

Wolfram言語の「Solve」を「SymPy」の「solve」で書き換えるよ、ということでこれもいい感じです。

結果は、、、

方程式を解いた結果

 

きちっと解いてますね。

数式的なものは、かなり使えそうです。

 

では、ハードルを大きく上げて、グラフはどうでしょう。

 

入力

Plot[Sin[x], {x, 0, 6 Pi}]

 

応答>

-----------------------------------------

You can create a plot of the sine function in Python using the matplotlib library. First, make sure you have matplotlib installed, and then you can create the plot as follows:

 

import matplotlib.pyplot as plt

import numpy as np

 

# Define the x values

x = np.linspace(0, 6 * np.pi, 1000)  # Generate 1000 points between 0 and 6*pi

 

# Calculate the corresponding y values using the sine function

y = np.sin(x)

 

# Create the plot

plt.plot(x, y)

plt.xlabel('x')

plt.ylabel('Sin(x)')

plt.title('Plot of Sin(x)')

plt.grid(True)

 

# Show the plot

plt.show()

 

This code will create a plot of the sine function over the range from 0 to 6π. You can adjust the number of points in the np.linspace function to control the smoothness of the plot.

 

-----------------------------------------

Pythonでグラフを書くから、matplotlibと、lispace、plot、そしてshowと、まともそうなコードです。

 

とりあえず、Colaboratoryで動かしてみます。

関数のグラフ表示も変換できた

 

おお!それなりに使える。

MathematicaのコードをPythonに、わりと簡単に変換できるということがわかりました。

 

私は「反Mathematica同盟」の構成員ではないことを書き添えておきます。念のため!

 

長いプログラムはできるかどうかは、またそのうちに。

Wolfram EngineをVisualBasicで使う(13:.nb/.cdfファイルの生成)

Wolfram EngineをVisualBasicで使う(13:.nb/.cdfファイルの生成)

 

VisualBasic + Woflram Engineで開発したGUIでWolfram言語のプログラムを入力して、それをノートブック(.nb)やCDFファイル(.cdf)に書き出して、MathematicaやWolfram Playerで再生しました。

 

【ノートブックファイルへのエクスポート】

  1. GUIを次のように作ります。

  2. ボタンを押すとファイルが生成されるように次のコードを書きます。Exportの引数となる文章の組み立てが複雑なので、あえて分割して文字列を作っています。

    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 input_txt As String = TextBox1.Text

        Dim eval_txt As String = "Evaluate[" + input_txt + "]"

        ml.Evaluate("Export[""C:\data\sample.nb""," + eval_txt + "]")

     

    End Sub

  3. 実行して、入力部分に

    Manipulate[Plot[Sin[x (1 + a x)], {x, 0, 6}], {a, 0, 2}]

    を入力して、ボタンを押します。

    実行してWolfram言語を入力
  4. 今回は保存パスやファイル名を固定しているので、「C:¥data」に「sample.nb」というファイルが生成されます。できるまでに少し時間がかかります。

    .nbファイルが生成された
  5. これをMathematicaで開くと次のようになります。

    生成結果をMathematicaで開く

 

期待通りの結果ですね。

さて、次はMathematicaではなく、再生専用のWolfram Playerを使って再生できるようにしてみます。

 

【CDFファイルへのエクスポート】

  1. ボタンのラベルを少し変更します。

  2. コードを次のように変更します。「Export」ではなく、「CDFDeploy[]」を使います。

    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 input_txt As String = TextBox1.Text

        Dim eval_txt As String = "Evaluate[" + input_txt + "]"

        ml.Evaluate("CDFDeploy[""C:\data\sample.cdf""," + eval_txt + "]")

     

    End Sub

  3. 実行して、入力部分に

    Manipulate[Plot[Sin[x (1 + a x)], {x, 0, 6}], {a, 0, 2}]

    を入力して、ボタンを押します。

    実行してWolfram言語を入力
  4. こちらも保存パスやファイル名を固定しているので、「C:¥data」に「sample.cdf」というファイルが生成されます。できるまでに少し時間がかかります。

    CDFファイルが生成された
  5. これをWolfram Playerで開くと次のようになります。

    CDFファイルをWolfram Playerで再生

    ちゃんと再生もできるので問題なさそうです。

    Manipulateも実行できた

    もし、CDFファイル生成して、簡単なプログラムを再生専用で配布するのであれば、Wolfram Engineでもいけそうです。

    別々に生成しているので、一つにまとめようと思います。

  6. ラジオボタンで、どちらかを選べるようにGUIを次のように変更します。

    ラジオボタンで切り替えられるようにする
  7. ラジオボタンの設定で生成されるファイルが切り替えられるように、次のようにコードを改良します。

    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 input_txt As String = TextBox1.Text

         Dim eval_txt As String = "Evaluate[" + input_txt + "]"

     

         If RadioButton1.Checked = True Then

             ml.Evaluate("Export[""C:\data\sample.nb""," + eval_txt + "]")

         ElseIf RadioButton2.Checked = True Then

             ml.Evaluate("CDFDeploy[""C:\data\sample.cdf""," + eval_txt + "]")

         End If

     

     End Sub

  8. 実行してみます。

    実行してWolfram言語を入力

    うまく切り替えて2種類のファイルが生成できるようになりました。

Wolfram EngineをVisualBasicで使う(12:コマンドラインのコマンドを呼び出す)

Wolfram EngineをVisualBasicで使う(12:コマンドラインのコマンドを呼び出す)

 

今回は、VisualBasicからWolfram言語を呼び出し、そのWolfram言語からWindowsのコマンドラインのコマンドを呼び出してみます。

 

すごく無駄な動きですが、Wolfram言語からコマンドラインを呼び出す、とという動作を確認するためなので許してください。

動作としては、インターネット上のホストにコマンドラインでpingを実行して、そのホストに到達できるかどうかを処理するものです。

 

  1. GUIのデザインを次のようにします。テキストボックスにはホスト名を入れます。ボタンを押すと、コマンドラインを呼び出して、pingを実行し、その結果をLabelに表示します。

  2. ボタンに次のコードを割り当てます。

    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 cmd_txt As String = "cmd /c ping " + TextBox1.Text

        Dim result As String = ml.EvaluateToOutputForm("Run[""" + cmd_txt + """]", 0)

        If result = 0 Then

            Label2.Text = "ホストに届きました。."

        Else

            Label2.Text = "ホストに届きませんでした。"

        End If

     

    End Sub

     

    Wolfram言語のRunは外部のプログラムを呼び出すものです。今回はWindowsのコマンドプロンプトを呼ぶので「cmd」を指定します。

    コマンドプロンプトで実行するのは、

    cmd /c ping ホスト名

    です。

     

    pingコマンドは、正しく届けば「0」が返ってくるので、これを条件分岐して、回答を返すようにしました。

  3. さて、実行してみます。「www.yahoo.co.jp」を調べます。

    値を入れて動作確認


    次のように後ろでコマンドプロンプトが動きます。

    バックグラウンドでコマンドラインが動作
  4. 結果は、OKです。

  5. 次は意図的に、届かないものを入れてみます。



    これも正解です。

 

外部コマンドを呼び出す部分だけをWolframKernel.exeでやってみた結果も書いておきます。

WolframKernel.exeで実行した結果

 

Run使うと、他のWindowsコマンドを呼び出すことができるので、OSとの間のやり取りができます。

 

VisualBasicから直接、pingしたほうが効率的ですが、Wolfram Engineを使わないと連載が続かないので、あえて無駄な実装をしました。

Wolfram EngineをVisualBasicで使う(11:数式を画像にする)

Wolfram EngineをVisualBasicで使う(11:数式を画像にする)

 

Wolfram Mathematicaの中で、数式を書くとき、パレット使うと、教科書に出ているような形で数式を入力できます。また、Wolfram言語で書いたものもこの形式に変換することもできます。

 

入力を教科書の数式のようにするのはさすがに無理ですが、Wolfram言語で書いた数式を教科書のような形式にして、これをそれなりの画像にすることはできそうです。

 

  1. GUIのデザインは次のようにします。テキストボックスにWolfram言語で数式を入力してボタンを押すと、それを成形して、画像として下のPictureBoxに表示できるようにします。

    フォームの作成
  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("eqn = HoldForm[" + TextBox1.Text + "]; graphic = Graphics[{Text[eqn, {0, 0}] }]", 0)

     

            Dim result_plot As Image = ml.EvaluateToImage("Rasterize[graphic, ""Image"", ImageSize -> 150]", 300, 300)

            PictureBox1.Image = result_plot

     

        End Sub

    End Class

    今回は、VisualBasicの記述よりは、Wolfram言語での記述がカギです。

    最初の処理、

    ml.EvaluateToOutputForm("eqn = HoldForm[" + TextBox1.Text + "]; graphic = Graphics[{Text[eqn, {0, 0}] }]", 0)

    はどういうことかというと、「HoldForm」というのは、式の中を評価せずにそのままにしておくよ、ということで、テキストボックスに入れた式をeqnに代入します。

    で、「Graphics」+「Text」で、文字列eqnを画像の中央に配置してグラフィックスとして処理できるようにします。

    reference.wolfram.com

     を参照。

    Dim result_plot As Image = ml.EvaluateToImage("Rasterize[graphic, ""Image"", ImageSize -> 150]", 300, 300)

    この行で出来上がった画像を指定されたサイズでラスタライズします。それを画像オブジェクトとしてVisualBasicに返します。

  3. 実際に実行してみます。最初に次の普通の数式を入れてみます。

    y = (x^2 + 3*x + 8) / (x - 2)

    Wolfram言語での数式入力

    「Show」を押すと、次のようになりました。

    出力された数式
  4. もう少し複雑な次の2つをそれぞれ試してみます。Wolfram言語の表記方法に従って入力します。

    y = (x^2 + 3*x + 8) / Sqrt[x – 2]

    平方根の表示

    y = Integrate[x^2 + Sin[x]Cos[x], x]

     

    積分の表示
  5. ただ、このままではこれらの数式をMS Wordに貼ったりして再利用できないため、エクスポート用の次の1行を足して画像ファイルとして保存するようにしました(これはVisualBasic側のコマンドです)。

    result_plot.Save("C:\equation\equation.png", Imaging.ImageFormat.Png)

  6. 実行すると次のように画像ファイルが作成されました。

  7.  

    レビューすると、次のように数式が画像で保存されています。

    生成された画像ファイル

 

今日はここまで。

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

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

 

線形回帰で予測値を出すということを可視化してみようと思います。

今回は、「新しい入力値」や「それに対する予測値」のテキスト欄、「手法」のプルダウンメニューはいらないと思います。ので消します。

 

  1. GUIを次のようにPicturBoxを追加し、グラフが大きく表示できるように変更しました(400x400 pixが表示できるぐらいに)。

    線形回帰を表示されるグラフ領域を作成
  2. 下の画像部分に次の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

     

  3. まず、

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

    ですが、今回は線形回帰しか使わないので「LinearRegression」で固定します。また、前回にあった、「予測したい値をテキストボックスから持ってきて、、モデルpを適用する部分はいりません。

    また、予測値を返すわけでもないので、「Dim result As String =」も不要で、単純にWolfram言語の分を評価するだけになります。

  4. 次の

    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[]というグラフを書く関数に渡すことができます。

  5. その次に、先に上げた2つの「線形回帰分析の結果の直線」と「学習用データの散布図」を1つのグラフ上に描画します。

     

    Dim result_plot As Image = ml.EvaluateToImage("Show[Plot[p[x], {x, -1, 5}], ListPlot[" + tmp_txt + "]]", 400, 400)

  6. そして、VisualBasicのGUIデザイン画面のPictureBoxに表示します。

     

    PictureBox1.Image = result_plot

     

  7. 実際に実行してみます。

    学習データを入力
  8. 学習データを入力して、「Predict」ボタンを押すと、Wolfram Engineが起動して、次のようなグラフを表示します。

    結果:線形回帰(直線)と学習データ(散布図)

今回のコードで特徴的なことがあります。

 

これまでは、「EvaluateToOutputForm ()」の中にすべてのWolfram言語のコードを書いていましたが、今回は、「EvaluateToOutputForm ()」と「EvaluateToImage ()」の2つを使っています。

 

後ろでWolfram Engineが生きていれば、「p」という学習済みのモデルをVisualBasicのコード内でそのまま生かして、次のWolfram言語のコードで呼び出せるということがわかります。

 

今回はだらだらとした説明が多かったのですが、役に立ったでしょうか。。。

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

今回は、前回分を少し掘り下げて説明することにします。

 

        Dim ml As IKernelLink = MathLinkFactory.CreateKernelLink("-linkmode launch -linkname 'C:\Program Files\Wolfram Research\Wolfram Engine\13.3\WolframKernel.exe'")

        ml.WaitAndDiscardAnswer()

 

ボタンをクリックするとMathLinkFactory.CreateKernelLink()で、"launch"を指定することで、後ろでWolfram Kernelを起動します。

Wolfram Engineというものはなく、かなりややこしい。

C:\Program Files\Wolfram Research\Wolfram Engine\13.3\

の中を見ると、

math.exe

MathKernel.exe

wolfram.exe

WolframKernel.exe

WolframPlayer.exe

WolframScript.exe

の6つのexeがあります。

ネットで少し調べたら、

mathematica.stackexchange.com

が見つかりました。

これによると、

math.exe = wolfram.exe

MathKernel.exe = WolframKernel.exe

とあります。確かにファイルサイズサイズが同じなんですよね。

なぜ、同じものなのに名前が違うのか。調べてみると次の記事が見つかりました。

github.com

 

これによると…

「2015年4月6日のv3.1.0にmath.exeをよりモダンな名前wolfram.exeに変えた」

とあります。Kernelのほうはこの記事にはありませんでしたが、おそらく同じタイミングだったのではないかと思います。

後方互換を残すためにあえて古いものを残しているんでしょうね。たぶん。

 

では、math.exeとMathKernel.exeの違いはというと、起動してみるとわかります。

 

math.exeを起動すると。。。

math.exeを起動したところ

 

一方、MathKernel.exeの場合は。。。

MathKernel.exeを起動したところ

 

math.exeは、Windowsのコマンドプロンプトライクに起動しますが、MathKernel.exeの場合、「File」「Edit」などのメニューがある(大したことはありませんが)GUI付きのプログラムだということがわかります。これが90KBほどのサイズの違うということなのでしょう。

 

プログラムの本体は「SystemFiles」フォルダの下にあります。これは4GB以上のサイズがあります。

WolframPlayer.exeは、Mathematicaを使ったことがる人にはなじみがあると思います。Mathematicaで作ったノートブックファイル(.nb)を再生するものです。

起動すると次のようなトップ画面が表示されます。

WolframPlayer.exeを起動したところ

 

そして、またややこしいのがWindowsのスタートメニュー。フォルダー名は「Wolfram Engine」と書かれながらも、中の項目は「wolframscript (Wolfram Engine)」となっています。

この、メニューに行きつく先が「wolframscript.exe」です。

 

さて、話がそれてきているので、もどします。

2つ目の関数ですが、前にも話した通り、出力が文字列か画像かで"Evaluate***"の関数名が変わります。

 

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

        TextBox3.Text = result

 

中のWolfram言語の3行は、簡単にいうと、

  • テキストボックスの内容をトレーニングセットに代入
  • トレーニングセットと方法を指定して予測
  • テキストボックスの新しい入力値に対する出力を予測

です。

 

「はみだし」終了。

 

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

 

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

今日はここまで。