pyqt5 プログラミングによる tcp/ip データ通信および解析につ … ·...

6
PyQt5 プログラミングによる TCP/IP データ通信および解析について 松原 篤 工学部 技術部 1 はじめに Qt [Q Toolkit] は,Windows Mac OS など異なる OS[プラットフォーム]でも同じ仕様のプログラムを動作させること が可能なクロスプラットフォームのフレームワークであり,スマートフォンやタブレットといった携帯端末産業の需要拡大 に伴い,現在,Qt による GUI アプリケーションの開発が盛んに行われている.一方,人工知能技術の目覚ましい進 歩・発展に伴い,Python は,機械学習処理を高速,高効率に行うためのフレームワーク[ChainerTensorFlowKeras など]が充実しているため,最近特に注目を浴びているオブジェクト指向型プログラミング言語である.このようなことか ら,PyQt はクロスプラットフォーム GUI アプリケーションの開発を得意とする Qt Python で利用できるようにしたライブ ラリであるため,GUI 技術と高度なデータ解析処理の 2 つの機能を兼ね備えた高機能処理プログラムの開発が効率 良く行える. 本報告では,2 台の PC 端末間において,インターネットで標準的に利用されている TCP/IP 通信プロトコルによるソ ケット[1 クライアント-サーバ間の 1 1]通信を確立し,クライアント端末においてはデータ送信,解析結果の受信・ 表示を,サーバ端末においてはデータの受信,解析およびその結果の送信を,それぞれ行う GUI アプリケーションの 開発について述べる.なお,サーバ端末におけるデータ解析では,クライアント端末より受信したデータ[特徴量と称し た訓練およびテストデータ集合]を,サポートベクトルマシン[SVM]を利用して,訓練データによる識別器の作成,およ びテストデータによる識別を行っている. 2 Python について 2.1 Python Python 言語は,C Java といった別のテキストベースのプログラミング言語に比べ,言語の文法の簡略・単純化が 実現されているため,実装コード量の軽減により,プログラムにおいて,① 実装作業効率の向上,② コード全体像が 把握しやすい[可読性の向上],といったことや,③ パターン認識や機械学習に不可欠な高度科学技術計算処理の ためのコード実装が容易[専用ライブラリの充実性]といった利点がある. Python の環境構築については,Python の本体だけでなく,上記科学技術計算専用の各種ライブラリやユーティリテ ィなど,Python 言語による開発環境に最低限必要なものがパッケージとして提供されている「 Anaconda1) と呼ばれる Python 用ディストリビューションを活用すると便利である.Anaconda で提供されているオープンソースライブラリには, 代数やマトリックス計算を効率よく行うことを可能にしたモジュール「Numpy」,② グラフ描画の「matplotlib」,③ 機械学習処理に適した「scikit-learn(2.3 節に後述)などがある. 処理の高効率,高速化を行うためのフレームワークとしては,① 日本の Preferred Networks 社が開発した GPU の処理に威力を発揮する「 chainer 」,②Google 社によって開発された種々の深層学習処理を得意とする「 Tensor Flow」,③ 各種学習法の実装を単純化するなど TensorFlow をより扱いやすくした「Keras」などがある. 統合開発環境としては,PyCharm Spyder などがよく利用されており,Jupyter はブラウザ上でのプログラム開発が 可能な環境である. 2.2 PyQt5 PyQt[最新版 PyQt5]を用いた GUI アプリケーションの作成において,よく利用されるウィジット[オブジェクト]クラスを

Upload: others

Post on 31-Aug-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

PyQt5プログラミングによる TCP/IPデータ通信および解析について

松原 篤

工学部 技術部

1 はじめに

Qt [Q Toolkit] は,WindowsやMac OSなど異なるOS[プラットフォーム]でも同じ仕様のプログラムを動作させること

が可能なクロスプラットフォームのフレームワークであり,スマートフォンやタブレットといった携帯端末産業の需要拡大

に伴い,現在,Qt による GUI アプリケーションの開発が盛んに行われている.一方,人工知能技術の目覚ましい進

歩・発展に伴い,Python は,機械学習処理を高速,高効率に行うためのフレームワーク[Chainer,TensorFlow,Keras

など]が充実しているため,最近特に注目を浴びているオブジェクト指向型プログラミング言語である.このようなことか

ら,PyQtはクロスプラットフォームGUIアプリケーションの開発を得意とするQtを Pythonで利用できるようにしたライブ

ラリであるため,GUI 技術と高度なデータ解析処理の 2 つの機能を兼ね備えた高機能処理プログラムの開発が効率

良く行える.

本報告では,2台の PC端末間において,インターネットで標準的に利用されている TCP/IP通信プロトコルによるソ

ケット[1 クライアント-サーバ間の 1 対 1]通信を確立し,クライアント端末においてはデータ送信,解析結果の受信・

表示を,サーバ端末においてはデータの受信,解析およびその結果の送信を,それぞれ行う GUI アプリケーションの

開発について述べる.なお,サーバ端末におけるデータ解析では,クライアント端末より受信したデータ[特徴量と称し

た訓練およびテストデータ集合]を,サポートベクトルマシン[SVM]を利用して,訓練データによる識別器の作成,およ

びテストデータによる識別を行っている.

2 Pythonについて

2.1 Python

Python 言語は,C や Java といった別のテキストベースのプログラミング言語に比べ,言語の文法の簡略・単純化が

実現されているため,実装コード量の軽減により,プログラムにおいて,① 実装作業効率の向上,② コード全体像が

把握しやすい[可読性の向上],といったことや,③ パターン認識や機械学習に不可欠な高度科学技術計算処理の

ためのコード実装が容易[専用ライブラリの充実性]といった利点がある.

Pythonの環境構築については,Pythonの本体だけでなく,上記科学技術計算専用の各種ライブラリやユーティリテ

ィなど,Python 言語による開発環境に最低限必要なものがパッケージとして提供されている「Anaconda」1)と呼ばれる

Python 用ディストリビューションを活用すると便利である.Anaconda で提供されているオープンソースライブラリには,

① 代数やマトリックス計算を効率よく行うことを可能にしたモジュール「Numpy」,② グラフ描画の「matplotlib」,③

機械学習処理に適した「scikit-learn」(2.3節に後述)などがある.

処理の高効率,高速化を行うためのフレームワークとしては,① 日本の Preferred Networks 社が開発した GPUで

の処理に威力を発揮する「chainer」,②Google 社によって開発された種々の深層学習処理を得意とする「Tensor

Flow」,③ 各種学習法の実装を単純化するなど TensorFlowをより扱いやすくした「Keras」などがある.

統合開発環境としては,PyCharmや Spyderなどがよく利用されており,Jupyterはブラウザ上でのプログラム開発が

可能な環境である.

2.2 PyQt5

PyQt[最新版 PyQt5]を用いた GUI アプリケーションの作成において,よく利用されるウィジット[オブジェクト]クラスを

表 1. 代表的なウィジットクラス

クラス 機能

QWidget ウィンドウ画面

QPushButton ボタン

QLabel ラベル

QComboBox コンボボックス

QLineEdit テキストエディタ(1行)

QTextEdit テキストエディタ(複数行)

QCheckBox チェックボックス

QRadioButton ラジオボタン

表 2.レイアウトに関するクラス

クラス 機能

QHBoxLayout ウィジットを水平方向に配置

QVBoxLayout ウィジットを垂直方向に配置

QFormLayout 入力ウィジットを関連付けた

ラベルと共に配置

QGridLayout ウィジットを格子状に配置

表 1に,また,レイアウトに関する代表的なクラスを表 2に,それぞれ示す 2).

各オブジェクトによるイベント発生についてQtでは,「シグ

ナル」と「スロット」という概念で定義されている.シグナルは,

オブジェクトの状態が変化したときに発行され,スロットは,

シグナルの発行によって関連づけられた関数を呼び出す機

能である.シグナルとスロットの接続には connect 関数が用

いられる.例を挙げると,QPushButton クラスのクリックイベン

トの場合は,以下のような書式となる.

QPushButton.clicked.connect(ButtonClicked)

※ButtonClickedは呼び出される関数名

なお,シグナルは QtCore,pyqtSignal クラスで自作可能であ

り,発行には emit関数が利用される.

Qtでは,TCP/IP Socket通信のためのクラスも用意されて

おり,① TCP(伝送制御プロトコル Transmission Control

Protocol)の接続を確立する QTcpSocket クラス,② クライア

ントからの接続を受け入れサーバの役割をする QTcpServer

クラス,③ データを送受信用に変換,管理する QDataStream クラス,などがよく利用される.また,受信データを別ス

レッドで扱えるようにするなど,マルチスレッドを実現する QThread クラスも併用される.

2.3 scikit-learn

scikit-learn ライブラリでは,教師あり/なし分類,回帰[Classification,Regression]問題といった機械学習でよく利用さ

れるアルゴリズムが豊富に用意されている 3).例を挙げると,①教師あり学習[Supervised Learning]として,非線形な分

類や回帰問題に利用されるサポートベクトルマシン[SVM:Support Vector Machine],②教師なし学習[Unsupervised

Learning]として,異常検知に適した 1classs SVM や,線形的な判別・分類に特化した Fisher の線形判別分析法

[LDA:Linear Discriminant Analysis],③教師データを必要とせず,データの類似性を見出してクラスタリングを行う

Kmeans 法や,データの分布を正規分布とした確率モデルで表現してクラスタリングを行う混合正規分布モデル

[Gaussian Mixture Models]法,④次元圧縮を行うことにより,学習効率を向上させる主成分分析法[PCA:Principal

Component Analysis],などがよく利用される.このようなアルゴリズムは,①svm モジュールの SVC[分類]や SVR[回

帰],②同モジュールの OneClassSVM や discriminant_analysis モジュールの LinearDiscriminantAnalysis,③

clustering モジュールの KMeans や mixture モジュールの GaussianMixture,④decomposition モジュールの PCA,と

いったクラスとして,それぞれ定義されている.

3 サポートベクトルマシン

サポートベクトルマシン[以降 SVM]は,教師つきサンプルデータ集合[訓練データ]を用いた学習処理によって,2ク

ラス分類が可能な識別器を作成する機械学習法である 4),5).SVM では,原則,2 つのクラス[データグループ]間の距

離が最大[マージンの最大化]となる識別境界面[超平面(hyperplane)]を決定するため,線形分離可能な識別器が形

成される.一方,実際の観測データでは雑音などで値にばらつきがあるため,①識別境界面を超えて,他方のクラス

に位置するデータの存在を許す方法[ソフトマージン]や,②非線形関数を用いてデータを高次元空間に変換・写像

[カーネル関数]することによって線形分離可能を実現する方法により,識別器が形成される場合が多い.

いま,教師つき訓練データ集合𝒟 = {(𝑡𝑖, 𝒙𝑖)|𝑖 ∈ [1, 𝑁], 𝑡𝑖 ∈ {−1, +1}, 𝒙𝑖 ∈ 𝓡𝑑∀ }とした教師データ𝑡𝑖,𝑑次元デ

ータベクトル 𝒙𝑖 = (𝑥1,𝑖 , 𝑥2,𝑖 , ⋯ , 𝑥𝑑,𝑖)𝑇および𝒙𝑖の非線形空間への写像𝜑(𝒙𝑖)を導入すると,ここで扱う 2 クラス分類に

関わる最適化問題は,次式のような制約つき凸 2次計画問題となる.

min𝒘,𝑏,𝝃

[1

2𝒘𝑇𝒘 + 𝐶 ∑ 𝜉𝑖

𝑁

𝑖=1

]

subject to 𝑡𝑖[𝒘𝑇𝜑(𝒙𝑖) + 𝑏] ≥ 1 − 𝜉𝑖 , 𝜉𝑖 ≥ 0

(1)

𝜉𝑖は,最適化問題における不等式制約𝑡𝑖[𝒘𝑇𝜑(𝒙𝑖) + 𝑏] ≥ 1を,等式制約𝑡𝑖[𝒘𝑇𝜑(𝒙𝑖) + 𝑏] = 1 − 𝜉𝑖と非負条件

𝜉𝑖 ≥ 0に変換することができるスラック変数であり,① 𝜉𝑖 = 0のとき,マージン内で正しく識別,② 𝜉𝑖 ∈ (0, 1] のとき,

マージンを超えるが識別境界面は超えないため正しく識別,③ 𝜉𝑖 > 1のとき,識別境界面を超えるため誤識別,とい

った意味をもつ. 𝐶は誤分類の許容度を表すパラメータであり,𝐶が小さいとき,誤りを許容する度合が大きくなる.

上記(1)式は最適化問題における主問題[primary problem]であるが,乗数𝛼𝑖 ≥ 0,𝜇𝑖 ≥ 0 (𝛼𝑖,𝜇𝑖 ∈ ℝ)に対するラ

グランジュ関数[Lagrangian] 𝐿(𝒘, 𝑏, 𝜶, 𝝃, 𝝁)

𝐿(𝒘, 𝑏, 𝜶, 𝝃, 𝝁) =1

2𝒘𝑇𝒘 + 𝐶 ∑ 𝜉𝑖

𝑁

𝑖=1

− ∑ 𝛼𝑖

𝑁

𝑖=1

[𝑡𝑖{𝒘𝑇𝜑(𝒙𝑖) + 𝑏} − (1 − 𝜉𝑖)] − ∑ 𝜇𝑖𝜉𝑖

𝑁

𝑖=1

(2)

および,次式の KKT[Karush Kuhn Tucker]条件

𝜕𝐿

𝜕𝒘|𝒘= 𝒘# = 0,

𝜕𝐿

𝜕𝑏= 0,

𝜕𝐿

𝜕𝜉𝑖

= 0

𝑡𝑖{𝒘𝑇𝜑(𝒙𝑖) + 𝑏} − (1 − 𝜉𝑖) ≥ 0

𝜉𝑖 ≥ 0,𝛼𝑖 ≥ 0,𝜇𝑖 ≥ 0

相補性条件 : 𝛼𝑖[𝑡𝑖{𝒘𝑇𝜑(𝒙𝑖) + 𝑏} − (1 − 𝜉𝑖)] = 0, 𝜇𝑖𝜉𝑖 = 0

(3)

を導入すると,主問題(1)は,次式に表す双対問題[dual problem]に帰着される.

max𝜶

[∑ 𝛼𝑖

𝑁

𝑖=1

−1

2∑ ∑ 𝛼𝑖𝛼𝑗𝑡𝑖𝑡𝑗𝐾(𝒙𝑖 , 𝒙𝑗)

𝑁

𝑗=1

𝑁

𝑖=1

]

subject to 𝛼𝑖 ∈ [0, 𝐶], ∑ 𝛼𝑖𝑡𝑖𝑁𝑖=1 = 0

(4)

𝐾(𝒙𝑖 , 𝒙𝑗)は写像𝜑(𝒙𝑖)と写像𝜑(𝒙𝑗)の内積[𝜑(𝒙𝑖)𝑇𝜑(𝒙𝑗)]で表されるカーネル関数である.代表的なカーネル関数とし

て,𝑝次多項式カーネル,動径基底カーネル,シグモイドカーネルなどがある.特に,次式で表す動径基底カーネル

関数の𝛾は,分布の分散値に依存した識別境界面の複雑さを表すパラメータである[𝛾が小さいほど,境界面が複雑].

𝐾(𝒙𝑖 , 𝒙𝑗) = exp [−𝛾(𝒙𝑖 − 𝒙𝑗)𝑇

(𝒙𝑖 − 𝒙𝑗)] (5)

訓練データ𝒙𝑖の識別については,① 𝛼𝑖 = 0のとき, 𝒙𝑖は正しく識別,② 𝛼𝑖 ∈ (0, 𝐶)のとき,𝒙𝑖はマージン上に位

置するサポートベクトルとなって正しく識別,③ 𝛼𝑖 = 𝐶のとき,𝜉𝑖 ∈ (0, 1] であれば識別境界面を超えないため正しく

識別,𝜉𝑖 > 1であれば超えるため誤識別と,それぞれなる.また, 𝒙𝑖の中で,サポートベクトルとなったデータのみが,

境界識別面の形成に寄与する.なお, 𝒙𝑖についてであるが,実際には,観測データより抽出された固有量が扱われる

ため,一般的には「特徴量」と呼ばれる.

4 GUIアプリケーション

4.1 画面の構成および操作

クライアント側およびサーバ側のGUI画面を図 1に示す.実装に利用したGUIに関わるクラスは,クライアント側で

は,QLabel[各オブジェクトに関連付ける名前表示用],QComboBox[サーバ IP の選択],QLineEdit[入力用:ポート番

号,SVM パラメータ],QTextEdit[表示用:受信メッセージ,送信データ,解析結果],QPushButton[通信の接続および

切断,データの設定および送信,画面終了],QGraphicsView[グラフ表示]であり,サーバ側では,QLabel[クライアント

側と同様の用途],QLineEdit[表示用:ポート番号,クライアント IP],QTextEdit[表示用:受信メッセージ,受信データ,

(a) クライアント側 (b) サーバ側

図 1. ウィンドウ画面

解析結果],QPushButton[通信切断,画面終了]である.なお,クライアント,サーバ側とも各オブジェクトの配置には,

QGridLayout クラスを利用している.

操作法としては,クライアント側[同図(a)]では,まず,①コンボボックスよりサーバ側の IP を選択設定[図中(i)]し,

「Connected」ボタンを clickすると,②サーバ側との通信確立が成功すれば,サーバからの受信メッセージがテキストエ

ディタに表示される[同(ii):なお,確立に失敗すれば,例外処理としてQMessageBoxクラスを活用してメッセージボック

スによるメッセージを別途発動].次に,③教師つき訓練データおよびテストデータのファイル名をそれぞれコンボボッ

クス(iv),(v)より選択し,④「Setted Data」ボタンを click すると,データがテキストエディタ(iii)に表示される.⑤SVM 用

の解析パラメータ(𝐶, 𝛾 )をテキストエディタ内でそれぞれ設定した後,「Transmission」ボタンを click すると,サーバ側

にデータおよび解析パラメータが送信される.サーバ側から送信された⑥解析およびテストデータによる識別結果が

テキストエディタ(vi)に,また,同時受信した識別器情報を利用して作成した識別の様子を表す図がエリア(vii)に,そ

れぞれ表示される.

一方,サーバ側[同図(b)]では,プログラムの起動後,クライアントからの接続を待機する状態となり,①接続要求が

あった場合,クライアントの IPをテキストエディタ(i)に,また受信メッセージをエディタ(ii)にそれぞれ表示してクライアン

トとの通信を確立させる.その後,解析データの受信待ちの状態となり,②データを受信した場合には,テキストエディ

タ(iii)に訓練データおよびテストデータを表示し,③受信した訓練データおよび解析パラメータ(𝐶, 𝛾 )を用いて SVM

[sklearn.svm.SVC]による機械学習を行い,識別器を作成する.④作成した識別器により,テストデータの識別[判別]

を行い,⑤その識別結果をテキストエディタ(iv)に表示すると共に,⑥クライアント側に,識別器情報[学習済 SVC クラ

スのオブジェクト]と共に送信する.

なお,通信の切断については詳細を割愛するが,サーバ,クライアントのいずれの側からでも「Disconnected」ボタン

を利用して通信を切断することができる.ただし,バグ対策として,切断のタイミングにより,アクセスの必要性を失った

GUI画面上でのオブジェクト(ボタンやテキストエディタ)については,その機能を無効[disabled]にしている.

4.2 通信プロトコルについて

図 2 に接続,データ通信に関するプロトコルを簡単に示す.サーバ側において,受信を待機している状態につい

ては,①QTcpServerクラスの listen関数により,クライアントからの接続要求があるまで待機する.②通信確立の後,互

いにメッセージの送受信[QTcpSocket. write, QDataStream.readString]を行いながら,解析に必要なデータ群が到着

するまで待機する.受信情報の処理については,クライアント,サーバ双方側とも QThread クラスにより生成したサブス

レッド上で行い,イベント処理についても,先述の QtCore.pyqtSignal クラスによりシグナルを作成し,発行には emit関

数を,シグナルとスロットの接続に connect関数を,それぞれ多用している.

図 2. 通信プロトコル

図 3. データ構成

図 4. Toy Sample 1に対する SVM識別例[左:クライアント,右:サーバ]

通信データの構成について,図 3に示す.受信に際し,コロン文字を境に,文字列を「識別番号」と「処理用データ」

に分割して,識別番号に応じて,シグナルが発行され関連付けられた処理ブロックで,処理用データが活用される仕

組みである.メッセージの内容

については,詳細を割愛する

が,例を挙げると「クライアント

からアクセスがありました(図 2

のメッセージ Clog No.0)」,「解

析結果を受け取りました (同

Slog No.1)」といった意で構成

している.

4.3 識別結果例

Toy Sample 1 とした訓練およ

びテストデータを用いた SVM

解析による結果を図 4に示す.

Toy Sample 1のデータとは,教

師 つ き 訓 練 デ ー タ 集 合

𝒟 = {(𝑡𝑖 , 𝒙𝑖)|𝑖 ∈ [1,20], 𝑡𝑖 ∈

{−1, +1}, 𝒙𝑖 ∈ 𝓡2∀ },ただし,

2 クラス分類として均等な学習

がなされるよう各クラスに属する

データ数を同数としたもので,

テストデータ数は 10 個である

[以降,教師データ+1の訓練データが属するクラスを「クラス 1」と,教師データ−1のデータが属するクラスを「クラス 2」

と呼ぶ].

SVM 解析の条件について,写像𝜑(𝒙𝑖)には動径基底カーネル関数[(5)式を参照]を使用し,解析パラメータは,

(𝐶, 𝛾 ) = (20.0, 1.4)とした.なお,解析パラメータ(𝐶, 𝛾 )の設定については,(4)式の最適化問題を効率的に解くため

に Plattが提案した逐次最小問題最適化法[Sequential Minimal Optimization: SMO] とよばれるアルゴリズム 5)に基づ

き,著者が別途 C言語で作成した SVM解析プログラムを活用して算出した,必要以上に,①境界識別面が複雑にな

らない,②マージンや識別境界面を超える点を生み出さない,となるような値を,参考までに採用した[最適解

図 5. 識別の様子[Toy Sample 1]

図 6. 識別例[ [Toy Sample 2]

( 𝐶# , 𝛾# )を迅速に求めるため,識別関数において,更新前後のバイアス値𝑏の差分を最小化するにあたり,Powellの

共役傾斜法 6) を採用].

サーバ側からの受信結果として,クライアント側の GUI 画面

上では,①テストデータに対する識別結果が精度として 80%で

あったこと,また,②識別情報[[sklearn.svm.SVC オブジェクト]

に基づき,matplotlib クラスによる識別の様子を表す図の一部

が表示されていることがわかる.識別の様子を表す図について

は,画質の関係上,スクロールバーを移動して全体像を掴む

構造になっているため,図 5 に画像ファイルとして保存したも

のを,あらためて示す.●および●印はそれぞれクラス 1 およ

びクラス 2 に属する訓練データであり,識別境界面[超平面]を

実線で,各クラスのマージンを点線で示している.各マージン

上に位置する訓練データがサポートベクトルである.また,+

および+印がテストデータであり,真値による評価を行った結

果,互いに識別境界面を越えて誤識別される点が 1 点ずつあ

ったことがわかる.

図 6は別のサンプルデータ Toy Sample 2[訓練データ 500,

テストデータ 20]に対する識別結果であるが,Toy Sample 1の

場合と異なり,すべてのデータを完全に分類できる境界識別

面が形成できず,境界面を飛び越えて位置している外れ値

[ や 印で,これらのデータに対するラグランジュ乗数値𝛼𝑖

は𝐶(= 20)値に等しい] が多く存在する様子がわかる.

5 おわりに

機械学習を利用したオンライン計測システムにおいては,状況の変化に応じて識別器のパラメータを更新する必要

性に迫られるときがある.このような場合,オンライン計測に直接関わる部分とは別途パラメータ更新専用の処理部を

導入することにより,システム全体の安定性を保証できることが期待される.以上のことから,開発した GUI アプリケー

ションのような類のデータ通信システムは,オンラインシステムのサブシステムとして役立つものと思われる.

また,SVM 解析による識別器の作成についても,本来は,豊富なデータ量を用いて汎化性能の高いものを作る必

要があり,そのような観点から,解析パラメータ(𝐶, 𝛾 )の最適解も,確固たる指標[計測精度の高さなど]をもとに決定さ

れるべきものである.

参考文献

1) Anaconda,https://www.anaconda.com/

2) PyQt5 Reference Guide,http://pyqt.sourceforge.net/Docs/PyQt5/index.html

3) Documentation of scikit-learn 0.20.0,http://scikit-learn.org/stable/documentation.html

4) C.Cortes,V.Vapnik, "Support-Vector Networks", Machine Learning,20,pp.273-297 (1995)

5) J.C.Platt,"Fast Training of Support Vector Machines Using Sequential Minimal Optimization",Advances in

Kernel Methods : Support Vector Learning,the MIT press,pp.185-207 (1999)

6) 田中正吾,知能化計測の基礎と応用,アイピーシー,pp.61-70 (1997)