技術共有

57. 確率的ニューラル ネットワーク (PNN) に基づく分類 (MATLAB)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 確率的ニューラル ネットワーク (PNN) に基づく分類の概要

PNN (Probabilistic Neural Network、確率的ニューラル ネットワーク) は、主に分類問題を解決するために使用される、確率理論に基づくニューラル ネットワーク モデルです。 PNN は、1993 年に Makovsky と Masikin によって初めて提案されました。これは、非常に効果的な分類アルゴリズムです。

PNN の原理は、次の手順のように簡単に要約できます。

  1. データ入力層:入力サンプルデータをそれぞれモデルに入力します。
  2. パターンレイヤー:各入力データに対してパターン マッチングを実行し、指定されたカテゴリとの類似性スコアを計算します。
  3. パターン比較レイヤー:すべてのカテゴリの類似性スコアを比較し、最終的な分類結果として最も高いスコアを持つカテゴリを見つけます。

PNN には次のような特徴があります。

  1. 効率: PNN はトレーニング速度が速く、実際のアプリケーションではより高い分類精度を示します。
  2. 堅牢性:PNN はノイズや外れ値に対する強力な堅牢性を備えており、複雑な分類問題を効果的に処理できます。
  3. 簡単に説明すると:PNN の結果は直感的に解釈できるため、ユーザーはモデルの分類基準をより深く理解できます。

一般に、PNN は非常に効果的な分類アルゴリズムであり、画像認識、テキスト分類など、さまざまな分野の分類問題に適しています。

2. 確率的ニューラルネットワーク (PNN) に基づく分類の説明と主要な機能

1) 説明

3 つのバイナリ入力ベクトル X とそれらに関連するクラス Tc があります。
これらのベクトルを正しく分類するために確率的ニューラル ネットワークを作成します。

2) 重要な機能

newpnn() 関数:確率的ニューラル ネットワークの設計

確率的ニューラル ネットワーク (PNN) は、分類問題に適した放射基底ネットワークです。

文法

net = newpnn(P,T,spread)% は、2 つまたは 3 つのパラメーターを受け入れ、新しい確率的ニューラル ネットワークを返します。

パラメータ

ぷ:Q 入力ベクトルの r × Q 行列

た:Q 個のターゲット クラス ベクトルの s × Q 行列

広める: 伝播動径基底関数の拡張 (デフォルト = 0.1)

拡散がゼロに近い場合、ネットワークは最近傍分類子として機能します。スケーリングが大きくなると、設計されたネットワークでは、いくつかの近くの設計ベクトルが考慮されます。

sim() 関数: ニューラル ネットワークをシミュレートします。

文法

[Y,Xf,Af] = sim(net,X,Xi,Ai,T) 
パラメータ

ネット:ネットワーク

X: ネットワークへの入力

Xi: 初期入力遅延条件 (デフォルト = 0)

Ai: 初期層遅延条件 (デフォルト = 0)

T: ネットワークターゲット (デフォルト = 0)

3. データの設定と表示

コード

  1. X = [1 2; 2 2; 1 1]';
  2. Tc = [1 2 3];
  3. figure(1)
  4. plot(X(1,:),X(2,:),'.','markersize',30)
  5. for i = 1:3, text(X(1,i)+0.1,X(2,i),sprintf('class %g',Tc(i))), end
  6. axis([0 3 0 3])
  7. title('三个二元向量及分类')
  8. xlabel('X(1,:)')
  9. ylabel('X(2,:)')

効果を見る

4d5fefa895b64a729f35c0ae3f875dfa.png

4. 設計入力ベクトルに基づいてネットワークをテストする

1) 説明

ターゲット クラス インデックス Tc をベクトル T に変換します
NEWPNN を使用して確率的ニューラル ネットワークを設計する
SPREAD の値は 1 です。これは、これが入力ベクトル間の一般的な距離であるためです。

2) テストネットワーク

コード

  1. T = ind2vec(Tc);
  2. spread = 1;
  3. net = newpnn(X,T,spread);
  4. %测试网络
  5. %基于输入向量测试网络。通过对网络进行仿真并将其向量输出转换为索引来实现目的。
  6. Y = net(X);
  7. Yc = vec2ind(Y);
  8. figure(2)
  9. plot(X(1,:),X(2,:),'.','markersize',30)
  10. axis([0 3 0 3])
  11. for i = 1:3,text(X(1,i)+0.1,X(2,i),sprintf('class %g',Yc(i))),end
  12. title('测试网络')
  13. xlabel('X(1,:)')
  14. ylabel('X(2,:)')

効果を見る

99dcaabffb554913b0d153b807c6b7e2.png

3) 新しいデータテストネットワーク

コード

  1. x = [2; 1.5];
  2. y = net(x);
  3. ac = vec2ind(y);
  4. hold on
  5. figure(3)
  6. plot(x(1),x(2),'.','markersize',30,'color',[1 0 0])
  7. text(x(1)+0.1,x(2),sprintf('class %g',ac))
  8. hold off
  9. title('新数据分类')
  10. xlabel('X(1,:) and x(1)')
  11. ylabel('X(2,:) and x(2)')

効果を見る

03a46217cb4840ddb1d7a4da2b249be4.png

5. 確率的ニューラル ネットワークは、入力空間を 3 つのカテゴリに分割します。

説明する

3つのカテゴリーに分けられる

コード

  1. x1 = 0:.05:3;
  2. x2 = x1;
  3. [X1,X2] = meshgrid(x1,x2);
  4. xx = [X1(:) X2(:)]';
  5. yy = net(xx);
  6. yy = full(yy);
  7. m = mesh(X1,X2,reshape(yy(1,:),length(x1),length(x2)));
  8. m.FaceColor = [0 0.5 1];
  9. m.LineStyle = 'none';
  10. hold on
  11. m = mesh(X1,X2,reshape(yy(2,:),length(x1),length(x2)));
  12. m.FaceColor = [0 1.0 0.5];
  13. m.LineStyle = 'none';
  14. m = mesh(X1,X2,reshape(yy(3,:),length(x1),length(x2)));
  15. m.FaceColor = [0.5 0 1];
  16. m.LineStyle = 'none';
  17. plot3(X(1,:),X(2,:),[1 1 1]+0.1,'.','markersize',30)
  18. plot3(x(1),x(2),1.1,'.','markersize',30,'color',[1 0 0])
  19. hold off
  20. view(2)
  21. title('三分类')
  22. xlabel('X(1,:) and x(1)')
  23. ylabel('X(2,:) and x(2)')

効果を試す

d9f88e5a4a194cdab4a7d4c903d77645.png

6. まとめ

確率的ニューラル ネットワーク (PNN) は、パターン分類に使用される人工ニューラル ネットワークです。これはベイズの定理と混合ガウス モデルに基づいており、連続データや離散データを含むさまざまな種類のデータの処理に使用できます。 PNN は、分類問題を扱う際に従来のニューラル ネットワークよりも柔軟であり、より高い精度と一般化機能を備えています。

PNN の基本的な動作原理は、入力データ セットとサンプル セット内の各サンプルの間の類似性を計算し、その類似性に基づいて入力データを分類することです。 PNN は、入力層、パターン層、競合層、出力層の 4 つの層で構成されます。入力データはまず入力層を介してパターン層に渡され、次に競合層を介して類似度が計算され、最後に出力層で類似度に応じて分類されます。

Matlab では、関連するツールボックスを使用するか、自分でプログラムして PNN 分類を実装できます。まず、トレーニング データ セットとテスト データ セットを準備し、トレーニング データ セットを通じて PNN モデルをトレーニングする必要があります。トレーニングが完了したら、テスト データ セットを使用して PNN の分類パフォーマンスを評価し、予測を行うことができます。

全体として、PNN はさまざまな分類問題に適した強力な分類方法です。実際のアプリケーションでは、特定の問題に応じて適切な特徴とモデル パラメーターを選択して、分類パフォーマンスを向上させることができます。 Matlab は豊富なツールと関数サポートを提供し、PNN の実装と適用を容易にします。

7. ソースコード

コード

  1. %% 基于概率神经网络(PNN)的分类(matlab)
  2. %此处有三个二元输入向量 X 和它们相关联的类 Tc。
  3. %创建 y 概率神经网络,对这些向量正确分类。
  4. %重要函数:NEWPNN 和 SIM 函数
  5. %% 数据集及显示
  6. X = [1 2; 2 2; 1 1]';
  7. Tc = [1 2 3];
  8. figure(1)
  9. plot(X(1,:),X(2,:),'.','markersize',30)
  10. for i = 1:3, text(X(1,i)+0.1,X(2,i),sprintf('class %g',Tc(i))), end
  11. axis([0 3 0 3])
  12. title('三个二元向量及分类')
  13. xlabel('X(1,:)')
  14. ylabel('X(2,:)')
  15. %% 基于设计输入向量测试网络
  16. %将目标类索引 Tc 转换为向量 T
  17. %用 NEWPNN 设计 y 概率神经网络
  18. % SPREAD 值 1,因为这是输入向量之间的 y 典型距离。
  19. T = ind2vec(Tc);
  20. spread = 1;
  21. net = newpnn(X,T,spread);
  22. %测试网络
  23. %基于输入向量测试网络。通过对网络进行仿真并将其向量输出转换为索引来实现目的。
  24. Y = net(X);
  25. Yc = vec2ind(Y);
  26. figure(2)
  27. plot(X(1,:),X(2,:),'.','markersize',30)
  28. axis([0 3 0 3])
  29. for i = 1:3,text(X(1,i)+0.1,X(2,i),sprintf('class %g',Yc(i))),end
  30. title('测试网络')
  31. xlabel('X(1,:)')
  32. ylabel('X(2,:)')
  33. %数据测试
  34. x = [2; 1.5];
  35. y = net(x);
  36. ac = vec2ind(y);
  37. hold on
  38. figure(3)
  39. plot(x(1),x(2),'.','markersize',30,'color',[1 0 0])
  40. text(x(1)+0.1,x(2),sprintf('class %g',ac))
  41. hold off
  42. title('新数据分类')
  43. xlabel('X(1,:) and x(1)')
  44. ylabel('X(2,:) and x(2)')
  45. %% 概率神经网络将输入空间分为三个类。
  46. x1 = 0:.05:3;
  47. x2 = x1;
  48. [X1,X2] = meshgrid(x1,x2);
  49. xx = [X1(:) X2(:)]';
  50. yy = net(xx);
  51. yy = full(yy);
  52. m = mesh(X1,X2,reshape(yy(1,:),length(x1),length(x2)));
  53. m.FaceColor = [0 0.5 1];
  54. m.LineStyle = 'none';
  55. hold on
  56. m = mesh(X1,X2,reshape(yy(2,:),length(x1),length(x2)));
  57. m.FaceColor = [0 1.0 0.5];
  58. m.LineStyle = 'none';
  59. m = mesh(X1,X2,reshape(yy(3,:),length(x1),length(x2)));
  60. m.FaceColor = [0.5 0 1];
  61. m.LineStyle = 'none';
  62. plot3(X(1,:),X(2,:),[1 1 1]+0.1,'.','markersize',30)
  63. plot3(x(1),x(2),1.1,'.','markersize',30,'color',[1 0 0])
  64. hold off
  65. view(2)
  66. title('三分类')
  67. xlabel('X(1,:) and x(1)')
  68. ylabel('X(2,:) and x(2)')