シンボリック回帰の問題を解決するための人工免疫システムの使用

こんにちは、ハブロコミュニティ!



私はあなたの法廷に、私の修士号に基づいて書かれた記事を提出します(応用数学、コンピューターサイエンスおよび力学、ボロネジ州立大学)。 彼女のテーマは「シンボリック回帰の問題を解決するための分散人工免疫システムの使用」です。 人工免疫システムの基本概念と、シンボリック回帰の問題を解決するための実装への私のアプローチを簡単に(実質的に)検討することを試みます-ある時点でその値のセットから関数のシンボリック表現を復元します。 プログラムはPython(バージョン3.3)で作成され、ソースはGithubで入手できます。



免疫システムの基本概念と説明


検索では、habrの人工免疫システムのトピックが非常に控えめに( 一度 )カバーされていることが示されました。 はい、そしてロシア語では、言及に値する本は1つだけであり、印刷版ではほとんど見つけることができません[1]。 したがって、生物学から借用したいくつかの基本的な概念を検討します。



ある意味では、免疫システムは特定の特性を持つ遺伝的アルゴリズムとニューラルネットワークの相続人と見なすことができます。 さまざまな出版物から判断すると、彼らはそれらを適用して次の問題を解決しようとしています:認識(免疫系とともに)、ウイルス対策の作成(生物学的免疫系の主な機能に基づいて論理的です)、さまざまな最適化の問題。

リンパ球は免疫系を構成する細胞です。 身体は、免疫記憶の主なキャリアであるBリンパ球と、敵(抗原)に抵抗力を与える主な「軍事ユニット」と、B細胞の反応を促進または抑制するTリンパ球を区別します。 ほとんどの研究では、Bリンパ球のみが考慮されますが、Bリンパ球のみも考慮されます。 明らかに、解決されている問題に応じて、リンパ球は検討中の領域のさまざまなオブジェクトを表すことができます。 私たちのタスク(関数のシンボリック表現を検索する)では、リンパ球は問題の可能な解決策の1つになります-一部の関数は式ツリー(たとえば、図1のような)で表されます。 このツリーでは、さまざまな操作(+、-、*、/、sin、cos)、数値、変数、最大数が設定されています(検索の深さを制限するため)。 遺伝的アルゴリズムの用語を使用する場合、リンパ球は単なる個人です。



図 1



親和性は、特定のリンパ球が何らかの抗原(ウイルス)にどれだけよく反応するかの尺度です。 生物学では、これはさまざまな化学結合と反応によって決定されます。私たちの国では、これは単に目的関数の値です。これは、関数の正確に与えられた値と同じポイントで得られた関数の値の間のユークリッド距離です。



最初に、ランダムに生成された多数のリンパ球が作成されます(体内では、骨髄がこれを行います)。 次に、システムの機能のサイクル全体を通して、現在のリンパ球のセットから最適なものが選択され、さまざまな超変異操作がそれらに適用されます(よりよく適応した細胞を作成するために-進化の過程)。 次に、古いセルと新しく取得したセルから新しい現在のセットを選択し、十分な精度で解が見つかるまでこのステップを繰り返します。または、最大許容反復回数を実行します。 ソリューションの評価として、以前に考慮された目的関数が使用されます。 機能するアルゴリズムを図2に示します。



図 2



アルゴリズムは古典的な遺伝的アルゴリズムと似ており、ここでは組み換え演算子のみが使用されておらず、選択が異なっているように見えることは簡単です(実際にはエリート主義に似ています)。



式ツリーでの次のアクションは、突然変異として使用されます。





並行性を追加


もちろん、このシステムを並列化して複数のマシンで動作させる機能を追加したいと思います。 この場合、OpenMPはこの理由で正確に放棄する必要があり(複数のマシンで起動が必要)、別の場合はMPI:システム全体の実行中にコンピューティングノードが追加/失敗/シャットダウンできるようにしたいと思います。機能します。 これは、p2pで使用されるような「トポロジ」を作成することで実現できます。 1つのノードは複数の隣接ノードを認識し、隣接ノードとのみ交換します。 もちろん、自転車のように見えますが、このモデルを並列化する可能性を確認するだけです。

ネットワーク上でのデータ伝送はそれほど速くないので、この非常に分散した免疫システムをどのように構成するかを理解することはまだ残っているため、各反復でのノード間の相互作用は除外されます。 生体免疫系は(ある程度まで)分布していると考えることができます-細胞は体全体に分布しています。 したがって、このモデルでは、N回の反復ごとに2つのノード間で最適なリンパ球の交換を追加するだけです。 そして、もちろん、同じものではなく、異なるもので。 したがって、アルゴリズムの並列バージョンは次の形式を取ります。



図 3



遺伝的アルゴリズムと類推すると、この分布は島モデルに似ています-個々の集団が特別に選択された個体を交換するとき。



実装とコード


私はPythonプログラマーではありません(ただし、非常にC#)が、Pythonは身近であり、とても気に入っています。 もちろん、PEP-8の本(Lutz、Pythonに飛び込む)を2冊読んでいますが、優秀なPythonプログラマー向けのコードはあまり魅力的ではないと思います。 やがて、C#で書くのと同じくらいどこかで判明しました。 unittestを使用すると、健全性をテストするためのスクリプトmain.py、local_node.py、およびlocal_server.pyがあります。 すべてのコメント/追加/ヒントは大歓迎です、少なくともいくつかのフィードバックを取得したいと思います。



Githubプロジェクト



これはプログラムの仕組みです(関数x * x + sin(sin(x))* x * y、関数の値は100ポイント、4計算ノード、アルゴリズムの200反復で指定され、30反復ごとに交換されます):

図 4



文献と参考文献


1)人工免疫システムとその使用/ [ed。 Dasgupts]-M .: Fizmatlit 2006-344 p。

2)Colin G. Johnsonシンボリック回帰のための人工免疫システムプログラミング/ Colin G. Johnson //遺伝的プログラミング:第6回欧州会議。 -2003。-P. 345–353-ISBN = 3-540-00971-X



PSすみません、テキストが少し乱雑であることが判明した場合、何らかの方法で、防御の準備をしようとしています-考えを収集し、行われた作業について伝えます。



All Articles