Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы оптимизации в радиотехнических системах. Практикум

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Рис. 5.19
Таким образом, на основе выполнения сформулированных правил может быть выполнено эффективное обучение системы классификации данных. ФП нечетких множеств могут быть установлены приближенно с использованием типовых форм аппроксимирующей кривой. В данном случае не требуется применения традиционных численных методов (гра­диентного поиска и т. д.), обладающих большой вычислительной сложно­стью и имеющих целый ряд недостатков, касающихся сходимости и т. д.
Ход работы
1. Запустить программную среду Matlab, установить текущую папку «X:\…\Komplex_MO\Lab5», где X – условное обозначение литеры диска. Поле для установки текущей папки показано на рис. 5.20 ;
Рис. 5.20
2. В текстовом редакторе среды Matlab создать новый файл и сохра­нить его под именем plotMembership.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
81
3. В файле plotMembership.m поместить заголовок файла-функции:
function plotMembership(x,M1,M2,M11,M22,... c1,c11,c2,c22) %--------------------------------------------
% Функция выполняет построение % графиков функций принадлежности
4. В файле plotMembership.m поместить следующий программный код
(после имеющегося кода):
figure; subplot(1, 2, 1);
plot(x,M2,x,M1); axis([c2 c1 0 1]);
grid on; xlabel('x1');
ylabel('M1 / M2'); text(c1,1, ' M1'); text(c2,1, ' M2');
subplot(1, 2, 2);
plot(x,M22,x,M11); axis([c11 c22 0 1]);
grid on; xlabel('x2');
ylabel('M11 / M22'); text(c11,1, ' M11'); text(c22,1, ' M22');
end
5. Cохранить изменения файла plotMembership.m;
6. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем plotSeparator.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
7. В файле plotSeparator.m поместить заголовок файла-функции:
function plotSeparator(x,M,separator,r,v,... c1,c11,c2,c22) %--------------------------------------------
% Функция выполняет построение % графика разделяющей прямой
82
8. В файле plotSeparator.m поместить следующий программный код
(после имеющегося кода):
num = size(M, 1); figure; plot(x,separator,'g',x,v,... 'y--.',r,separator,... 'y--.',M(1:num/2,1),M(1:num/2,2),... 'ro',M(num/2+1:num,1),M(num/2+1:num,2),... 'b*'); axis([c2 c1 c11 c22]); grid on; xlabel('x1'); ylabel('x2'); text(r,c22+100, ' r'); text(c1,v, ' v'); end
9. Cохранить изменения файла plotSeparator.m;
10. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем generateVectors.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
11. В файле generateVectors.m поместить заголовок файла-функции:
function A2 = generateVectors() %--------------------------------------------
% Генерация фильтруемых векторов % (точек рассматриваемого пространства)
12. В файле generateVectors.m поместить следующий программный код (после имеющегося кода):
A2(:, 1) = [36000;34000;28000;29500;26000;... 25000;35000;33000;29000;34000]; A2(:, 2)= [25000;32500;29000;28000;25000;... 36000;33000;32500;31500;35000]; A2(:, 3)= [1;1;1;1;1;0;0;0;0;0]; end
83
13. Cохранить изменения файла generateVectors.m;
14. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем separate.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
15. В файле separate.m поместить заголовок файла-функции:
function separator=... separate(x,r1,r2,v,a1,a22,b2,b11,H1,H2,H22,H11) %--------------------------------------------
% Функция выполняет вычисление значений % уравнения разделяющей прямой (прямых)
16. В файле separate.m поместить следующий программный код (по-
сле имеющегося кода):
separator=(b2*H11-b11*H2+b11*x-H11*x)/... (b2-H2).*(x>=r2)+... (a1*H22-a22*H1+a22*x-H22*x)/... (a1-H1).*(x<r1)+... v.*(x>=r1).*(x<r2); end
17. Cохранить изменения файла separate.m;
18. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем getClass.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
19. В файле getClass.m поместить заголовок файла-функции:
function class=... getClass(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11) %--------------------------------------------
% Функция выполняет классификацию % векторов(точек)
20. В файле getClass.m поместить следующий программный код (по-
сле имеющегося кода):
84
[M1 M2 M11 M22] =... getMembership(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11);
min2=min([M2,M22]); min1=min([M1,M11]);
if min2>min1 class=0; else class=1; end; end
21. Cохранить изменения файла getClass.m;
22. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем getRV.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
23. В файле getRV.m поместить заголовок файла-функции:
function [r r1 r2 v]=... getRV(a1,a22,b2,b11,H1,H2,H22,H11) %--------------------------------------------
% Функция выполняет % вычисление координат пересечения графиков % функций принадлежности
24. В файле getRV.m поместить следующий программный код (после имеющегося кода):
r=round((a1*H2-b2*H1)/(a1-b2-H1+H2)); v=round((a22*H11-b11*H22)/(a22-b11-H22+H11)); r1=round((a1*H22-a22*H1-a1*v+H1*v)/(H22-a22)); r2=round((b2*H11-b11*H2-b2*v+H2*v)/(H11-b11));
r1=(r)*(r1>=r2)+(r1)*(r1<r2); r2=(r)*(r1>=r2)+(r2)*(r1<r2);
end
25. Cохранить изменения файла getRV.m;
85
26. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем getMembership.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
27. В файле getMembership.m поместить заголовок файла-функции:
function [M1 M2 M11 M22] =... getMembership(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11) %--------------------------------------------
% Функция выполняет вычисление % значений функций принадлежности
28. В файле getMembership.m поместить следующий программный
код (после имеющегося кода):
M2=(0)*(x1>b2)+(b2-x1)/(b2-H2).*(x1<=b2); M1=(0)*(x1<a1)+(x1-a1)/(H1-a1).*(x1>=a1); M22=(0)*(x2<a22)+(x2-a22)/(H22-a22).*(x2>=a22); M11=(0)*(x2>b11)+(b11-x2)/(b11-H11).*(x2<=b11);
end
29. Cохранить изменения файла getMembership.m;
30. В текстовом редакторе среды Matlab создать новый файл и сохра-
нить его под именем lab5.m на жестком диске ПК в папке
X:\…\Komplex_MO\Lab5;
31. В файле lab5.m поместить заголовок:
%--------------------------------------------
% Приложение выполняет демонстрацию устройства % классификации данных в пространстве двух координат
32. В файле lab5.m поместить следующий программный код (после
имеющегося кода):
clear all;
% Начальная выборка точек с указанием класса M=generateVectors(); num=size(M,1); % Описание функций принадлежности
x=0:25:50000;
86
H2=25000; b2=36000; H1=36000; a1=25000; H22=36000; a22=25000; H11=25000; b11=36000;
[r r1 r2 v]=getRV(a1,a22,b2,b11,H1,H2,H22,H11); [M1 M2 M11 M22] = ... getMembership(x,x,a1,a22,b2,b11,H1,H2,H22,H11); plotMembership(x,M1,M2,M11,M22,H1,H11,H2,H22);
separator=... separate(x,r1,r2,v,a1,a22,b2,b11,H1,H2,H22,H11);
plotSeparator(x,M,separator,r,v,H1,H11,H2,H22);
quadrantCorrection=zeros(4,1);
%--------------------------------------------
% Проверка наличия точек, расположенных % неправильно относительно разделяющей прямой
classificated=zeros(num,1); for i=1:1:num x1=M(i,1); x2=M(i,2); classificated(i)=... getClass(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11); end;
%-------------------------------------------­% Цикл корректировки положения разделяющих прямых for i=1:1:num x1=M(i,1); x2=M(i,2); class=M(i,3); y=getClass(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11); if y~=class if (y==0)&&(x1<r) a22=(a1*H22-a1*x2+H1*x2-H22*x1)/... (H1-x1)+100; quadrantCorrection(1)=1; elseif (y==1)&&(x1<r) a1=(a22*H1-a22*x1-H1*x2+H22*x1)/... (H22-x2)+100; quadrantCorrection(2)=1;
87
elseif (y==0)&&(x1>=r) b11=(b2*H11-b2*x2+H2*x2-H11*x1)/... (H2-x1)+100; quadrantCorrection(3)=1; else b2=(b11*H2-b11*x1-H2*x2+H11*x1)/... (H11-x2)+100; quadrantCorrection(4)=1; end; end; end;
%--------------------------------------------
% Проверка наличия точек, % неправильно изменивших свое положение относительно % разделяющей прямой
classificated1=zeros(num,1); for i=1:1:num x1=M(i,1); x2=M(i,2); classificated1(i)=... getClass(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11); end;
[r r1 r2 v]=getRV(a1,a22,b2,b11,H1,H2,H22,H11); separator=... separate(x,r1,r2,v,a1,a22,b2,b11,H1,H2,H22,H11); plotSeparator(x,M,separator,r,v,H1,H11,H2,H22);
%--------------------------------------------
% Цикл для корректировки положения % разделяющих прямых относительно точек, % выявленных выше
for i=1:1:num x1=M(i,1); x2=M(i,2); class=M(i,3); if (classificated(i)==class)&&... (classificated1(i)~=class) xx1=x1; xx2=x2; if (classificated1(i)==0) a22old=a22; b11old=b11; a1old=a1;
88
if quadrantCorrection(1)==0 a22=(x2*(b11-H11+H22)-b11*H22)/... (x2-H11)+100; elseif quadrantCorrection(4)==0 b11=(x2*(a22+H11-H22)-a22*H11)/... (H22-x2)+100; else a22=(x2*(b11-H11+H22)-b11*H22)/... (x2-H11)+100; delta=a22old-a22; a1=a1-delta; end; elseif (classificated1(i)==1) a22old=a22; b11old=b11; a1old=a1; if quadrantCorrection(1)==0 a22=(x2*(b11-H11+H22)-b11*H22)/... (x2-H11)-100; elseif quadrantCorrection(4)==0 b11=(x2*(a22+H11-H22)-a22*H11)/... (H22-x2)-100; else a22=(x2*(b11-H11+H22)-b11*H22)/... (x2-H11)-100; delta=a22old-a22; a1=a1-delta;
end; end; end; end; %--------------------------------------------
% Окончательная проверка % корректности положения прямых
ERR=0; err=0; for i=1:1:num x1=M(i,1); x2=M(i,2); class=M(i,3); y=getClass(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11); if y~=class ERR=1; if (xx1>=r2)||(xx1<=r1)
89
a22=a22old; b11=b11old; a1=a1old; end; end; end; classificated2=zeros(num,1); for i=1:1:num x1=M(i,1); x2=M(i,2); class=M(i,3); classificated2(i)=... getClass(x1,x2,a1,a22,b2,b11,H1,H2,H22,H11); if classificated2(i)~=class err=err+1; end; end;
[r r1 r2 v]=getRV(a1,a22,b2,b11,H1,H2,H22,H11); [M1 M2 M11 M22]=... getMembership(x,x,a1,a22,b2,b11,H1,H2,H22,H11); plotMembership(x,M1,M2,M11,M22,H1,H11,H2,H22);
separator=... separate(x,r1,r2,v,a1,a22,b2,b11,H1,H2,H22,H11); plotSeparator(x,M,separator,r,v,H1,H11,H2,H22);
if ERR==1
disp(... sprintf(... 'Невозм. разделить точки данным способом.'));
for i=1:1:num x1=M(i,1); x2=M(i,2); class=M(i,3); if (classificated2(i)~=class) xx11=x1; xx22=x2; cl=class; minp=max(M(:,1)); maxp=min(M(:,1)); upmax=max(M(:,2)); upmin=max(M(:,2)); for j=1:1:num
90
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]