기술나눔

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) 설명

세 개의 이진 입력 벡터 X와 관련 클래스 Tc가 있습니다.
이러한 벡터를 올바르게 분류하기 위해 확률적 신경망을 만듭니다.

2) 주요 기능

newpnn() 함수:확률적 신경망 설계

PNN(Probabilistic Neural Network)은 분류 문제에 적합한 방사형 기반 네트워크입니다.

문법

net = newpnn(P,T,spread)%는 2개 또는 3개의 매개변수를 받고 새로운 확률 신경망을 반환합니다.

매개변수

피:Q개의 입력 벡터로 구성된 r × Q 행렬

티:Q개의 대상 클래스 벡터로 구성된 s × Q 행렬

확산: 전파된 방사형 기저 함수의 확장(기본값 = 0.1)

확산이 0에 가까우면 네트워크는 최근접 이웃 분류기 역할을 합니다. 규모가 커지면 설계된 네트워크는 인근에 있는 여러 설계 벡터를 고려합니다.

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가지 카테고리로 구분

암호

  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(Probabilistic Neural Network)은 패턴 분류에 사용되는 인공 신경망입니다. 베이즈 정리와 가우스 혼합 모델을 기반으로 하며 연속 데이터, 이산 데이터 등 다양한 유형의 데이터를 처리하는 데 사용할 수 있습니다. 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)')