Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы оптимизации в радиотехнических системах. Практикум
.pdf
Рис. 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
