基肥について考えてみるまでの記事で基肥のデータをどのように持てば良いか?
という話を書いてきた。
答えはまだ出ていない。
土地によっての例外が多すぎて混乱する。
それはさておき、
自動計算を行うにあたって必要になってくるのが線形代数とその周辺の数学で、
それらも今までの記事で書いてきた。
中学生向けのプログラミング教室に関わり始めてから、
数学力のなさを改善するため、数学の勉強を続けており、
それと並行して計算機科学の勉強もしている。
ここでわかってきたことは、
Pythonという言語には他言語と比べ物にならない程、数学的なノウハウが溜め込まれているということ。
特異値分解(SVD)等の線形代数の計算で重宝するものがPHPでは用意されていない。
Pythonでアプリを開発したいという気持ちが日々高まっているのだが、
SOY CMS / ShopはPHPという言語で開発してきたし、
PHPの利便性を考えるとPHPでの開発から外れることは考えられない。
というわけで、
数学的な処理をPythonでやらせて、それをPHPで受け取ることを考えてみることにした。
今回は、機械学習の基礎であるk近傍法をPythonとPHPを組み合わせて行ってみることにした。
使用するライブラリはscikit-learnとNumPy
これらのインストール方法はこの場では触れない。
k近傍法で用いる学習用のデータはscikit-learnにあるアイリスの判定のサンプルデータを用いる。
今回参考にしたコードは、
オライリーのPythonではじめる機械学習 ――scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎を参考にして作成した。
はじめにワークスペースで同階層にiris.pyとiris.phpの2つのファイルを作成した。
iris.pyにはPythonでk-近傍法の学習と判定のコードを書き、
iris.phpには判定したいデータをPython側に送受信し、判定結果を受け取るコードを書いた。
iris.pyでは事前に学習用のデータの質の判定や学習の成功度合いは調べていない。
アイリスの品種の鑑定の概要だけど、
道端で見かけたアイリスの花のがくの長さ、がくの幅、花弁の長さと花弁の幅のデータセットをiris.pyに送ることで、
事前に学習させておいた3種類の品種から送られてきたデータが一番どれに近いか判定する。
ちなみにアイリスだけど、
アヤメ科の花なので、アヤメの花によく似ている。
それでは各々のファイルに書いたコードを載せると、
iris.py
import sys # NumPyの読み込み import numpy as np # scikit-learnで必要なものだけ読み込む from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier if __name__ == "__main__": # PHPから受け取ったデータでNumPy配列を組み立てる X_new = np.array([[sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]]]) # アイリスのサンプルデータを使ってk-最近傍法 サンプルデータを取得する iris_dataset = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0) # サンプルデータを使って、各々の品種の特徴量を学習する knn = KNeighborsClassifier(n_neighbors = 1) knn.fit(X_train, y_train) # 学習した内容からPHPで送ったデータが何であるか判定する prediction = knn.predict(X_new) print(iris_dataset['target_names'][prediction])
iris.php
<?php //鑑定したいアイリスのデータ //左からがくの長さ、がくの幅、花弁の長さ、花弁の幅 $data = array(5, 2.9, 1, 0.2); //Pythonで実行するためのコマンドを組み立てる。 $pythonPath = dirname(__FILE__) . "/iris.py"; $cmd = "python3 " . $pythonPath . " " . implode(" ", $data); //Pythonのファイルにデータを送信する exec($cmd, $out); echo $out[0];
雑なコードだけど一応これで完成。
以前、SOY CMSの高速化で使用したexec関数にPythonを実行するコマンドを渡すだけで良い。
SOY CMSの画像のリサイズでJPEGのロスレス圧縮を追加した
端末で作成したファイルがあるディレクトリに移動して下記のコマンドを実行すると、
php iris.php ['setosa']
setosaという品種名の判定結果が返ってきた。
これでPHPであってもPythonの資産を活用することができるということがわかった。