
M852_Antonova_1
.pdf
ближайшие центры
••[D I] = min(D,[],2);
суммарная ошибка приближения центрами
••newerror = sum(sqrt(sum((X - centers(I,:)).^2,2)))
визуализация
••clf; scatter(X(:,1), X(:,2), 30, ‘filled’ ,‘k’); hold on; scatter(centers(:,1), centers(:,2), 50);
••fordraw = reshape([X centers(I,:) nan(size(X))]’, [2 m*3])’;
••plot (fordraw(:,1), fordraw(:,2))
пауза
••pause
пересчет центров
••formult = sparse(1:m,I,1,m,k);
••centers = diag(1./sum(formult))*(formult’*X);
••end
Начальные положения центров и результат пересчета приведены на рис. 5.1, две разные кластеризации (при различных начальных положениях центров) — на рис. 5.2.
Сгенерируем рандомное числовое множество в диапазоне (–1,5; 3,5). Для наглядности изобразим его на плоскости (рис. 5.3).
Рис. 5.1. Начальные положения центров (а) и результат пересчета (б)
Рис. 5.2. Две разные кластеризации (при различных начальных положениях центров):
а— кластеризация больше в правой нижней точке; б — кластеризация больше
вправой верхней точке
41

Рис. 5.3. Рандомное числовое множество
Кластеризация с помощью метода k-средних
Этап 1. Обработаем числовое множество для получения пяти кластеров с примерно одинаковыми значениями — центрами кластеров. Таким образом, все множество из 100 точек может быть представлено с помощью всего лишь пяти центров (рис. 5.4), характеризующих значения подмножеств (см. прил. 3).
Рис. 5.4. Представление множества точек в среде MATLAB |
42

Этап 2. Разделим большое множество на регионы, исходя из средних значений элементов — центров кластеров, таким образом лучше всего визуализировать кластеры данных (рис. 5.5).
Рис. 5.5. Разделение точек до ближайшего центра в среде MATLAB
Вывод
Математическое множество чисел успешно кластеризировано с помощью метода k-средних. Таким образом, метод k-средних — наиболее наглядный для анализа и простой в исполнении — позволяет характеризовать кластеры по значениям их центров.
Задание
Сгенерировать числовое множество в выбранном диапазоне. Обработать множество для получения N вариантов кластеров с примерно одинаковыми значениями — центрами кластеров. Разделить большое множество на регионы, исходя из средних значений элементов — центров. Сделать выводы по полученным результатам.
Контрольные вопросы
1.Что такое кластеризация?
2.Что является «центральной» задачей кластеризации?
3.Что такое нечеткая кластеризация?
4.Что такое метод k-средних?
5.В чем заключаются недостатки метода k-средних?
43
ЛИТЕРАТУРА
Левитин А.В. Ограничения мощи алгоритмов: деревья принятия решения // Алгоритмы: введение в разработку и анализ = Introduction to The Design and Analysis of Algorithms. М.: Вильямс, 2006. С. 409–417.
Шеннон К. Работы по теории информации и кибернетике. М.: Иностранная литература, 1963.
Интернет-ресурсы
http://logic.pdmi.ras.ru/~sergey/teaching/ml/notes-01-dectrees.pdf http://www.statsoft.ru/home/textbook/modules/stneunet.html http://studopedia.su/18_22535_obobshchennaya-model-neyrona.html
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Приложение 1 |
|
|
|
Пример кода для лабораторной работы № 3 |
|||||||||||
• |
function |
|
model = CNR_train |
(classpath, debugga) |
||||||||||
|
• |
chars |
|
= |
‘0123456789ABCEHKMOPTXY’; |
|||||||||
|
• |
X |
= |
zeros |
([2200 |
10]); |
|
|
|
|||||
|
• |
Y |
= |
zeros |
([2200 |
1]); |
|
|
|
|||||
|
• |
timel |
|
= |
tic; |
|
|
|
|
|
|
|||
|
• |
if |
|
debugga |
|
|
|
|
|
|
||||
|
|
else |
• |
count |
= 3; |
|
|
|
|
|
|
|||
|
• |
|
count |
=100; |
|
|
|
|
|
|||||
|
|
end |
• |
|
|
|
|
|
||||||
|
• |
|
|
|
|
|
|
|
|
|
|
|
||
|
• |
for |
|
|
|
char=1:22; |
|
|
|
|
|
|||
• |
time1=tic; |
|
|
|
|
|
|
|
|
|||||
• |
fprintf(‘time |
on char |
%s |
: : ’, |
chars(char)); |
|||||||||
• |
for sample=1:count |
|
|
|
|
|
|
|||||||
|
• |
K= |
(char-1)*100 |
+ |
sample; |
|
||||||||
• |
Sym = imread( [‘C:/Program Files/MATLAB/MATLAB Production |
|||||||||||||
Server/R2015a/bin/5/’ classpath |
‘/’ |
chars(char)]); |
||||||||||||
• |
Sammod |
= |
sym; |
|
|
|
|
|
|
|||||
• |
Sammod |
= |
imadjust |
(sammod); |
|
|
||||||||
• |
us = |
fapecial(‘unsharp’); |
|
|
|
|||||||||
• |
sammod |
=imfilter(sammod,us); |
|
|
||||||||||
• |
sammod |
= |
imadjust(sammod); |
|
|
|||||||||
• |
sammod |
= |
sammod < |
150; |
|
|
|
|||||||
• |
simresy |
|
= |
imresize |
(sammod, |
[64 |
NaN]); |
|||||||
• |
simresx |
|
= |
imresize |
(sammod, |
[NaN 64]); |
||||||||
• |
[ , n] |
= |
size(sinresy); |
|
|
|
||||||||
• |
IntensityX |
= |
sum(simresy, |
2)/n; |
|
|||||||||
• |
[ , m] |
= |
size(sinresx); |
|
|
|
||||||||
• |
IntensityY |
= |
sum(simresx, |
2)/m; |
|
|||||||||
• |
syms |
= |
|
regionprops |
(sammod), ‘EulerNumber’, |
‘Eccentricity’, ‘Centroid’, ‘Orientation’, ‘BoundingBox’ );
• |
X(K,1) |
= |
syms(1).EulerNumber; |
|
• |
X(K,2) |
= |
syms(1).Eccentricity; |
|
• |
X(K,3) |
= |
syms(1).Centroid(1)/syms(1).BoundingBox(3); |
|
• |
X(K,4) |
= |
syms(1).Centroid(2)/syms(1).BoundingBox(4); |
|
• |
X(K,5) |
= |
syms(1).Orientation; |
|
• |
X(K,6) = syms(1).BoundingBox(3)/syms(1).BoundingBox(4); |
|||
• |
X(K,7:70) |
= |
IntensityX(:); |
|
• |
X(K,7:71) |
= |
IntensityY(1, :); |
|
• |
Y(K) = |
char; |
|
• end
45
• |
fprintf(‘%.2f |
(sec)\n’, toc(time2)); |
||
|
• |
end |
= classRF_train(X,Y,1000,15); |
|
• |
model |
|||
• |
save |
model; |
|
|
• |
fprintf(‘total |
time %.2f\n’, toc(time1)); |
•end
•load model;
• |
I |
= |
imread |
(filename); |
|
|
|
|||||
• |
chars |
= |
‘0123456789ABCEHKMOPTXY’; |
|
||||||||
• |
outstr |
= |
‘ |
|
|
|
’; |
|
|
|
||
• |
Ires |
= |
imresize(I, |
[200 |
NaN]); |
|
||||||
• |
[m,n] |
= |
size(Ires); |
|
|
|
|
|||||
• |
Ires |
= |
imcrop(Ires, |
[10 |
0 n-10 m]); |
|
||||||
• |
OutI |
= |
zeros([size(Ires) |
3], |
‘uint8’); |
|
||||||
• |
OutI |
(:, |
:, |
1) |
= |
Ires; |
|
|
|
|||
• |
OutI |
(:, |
:, |
2) |
= |
Ires; |
|
|
|
|||
• |
OutI |
(:, |
:, |
3) |
= |
Ires; |
|
|
|
|||
• |
[a |
b] |
= |
size(Ires); |
|
|
|
|
||||
• |
Shift |
= |
a*b; |
|
|
|
|
|
|
|||
• |
Imod = imfilter (imadjust(Ires) ,fspecial (‘unsharp’)); |
|||||||||||
• |
LMap |
= |
medfilt2(Ires, [90 |
90], ‘symmetric’) |
||||||||
• |
Imod |
= |
(imadjust(0.7*Imod – |
0.7*LMap) |
< 10); |
|||||||
• |
NewI |
= |
zeros(size(Imod), |
‘uint8’); |
|
|||||||
• |
areas |
= |
regionprops(Imod, |
‘Image’, |
‘Perimeter’, |
|||||||
‘EulerNumber’, |
‘BoundingBox’, |
‘Area’, ‘Orientation’, |
||||||||||
‘Eccentricity’, |
‘PixeldxList’); |
|
|
|||||||||
|
• |
for |
i=1:size(areas) |
|
|
|
||||||
|
|
|
|
• |
If ~ ( |
test(areas(i))) |
|
• NewI(areas(i).PixeldxList(:)) = 255;
• else
•for j=1:size(areas(i).PixeldxList(:))
•OutI(areas(i).PixeldxList(j)) = OutI
(areas(i).PixeldxList(j)) * |
2; |
|
|
|
|||||
|
|
end |
• |
end |
|
|
|
|
|
|
• |
|
|
|
|
|
|
|
|
• |
end |
|
|
|
|
|
|
|
|
• |
funcrion |
good |
= test |
(area) |
|
|
|||
|
• |
good = |
(area.Area > 3500 |
||… |
|
||||
|
|
|
• |
area.Area |
> 400 |
||… |
|
|
|
BondingBox(4) |
• |
area.Area > 0.8*area.BondingBox(3) *area. |
|||||||
||… |
|
|
> 2 ||… |
|
|
||||
|
|
|
• |
area.EulerNumber |
|
|
|||
|
|
|
• |
(abs(area.Orientation) < |
25 && |
area. |
|||
Eccentricity > |
0.8) |
||… |
|
area.BondingBox(3) > |
11 …); |
||||
|
|
|
• |
area.BondingBox(3)/ |
• end
46
• |
subplot(3,10,p); |
|
• |
p = p |
+1; |
• |
symimg |
= areas(i) .Image; |
•symresy = imresize(areas(i).Image, [64 NaN]) ;
•symresx = imresize(areas(i).Image, [NaN 64]) ;
•imshow(symresy);
• |
[~, |
n] = size(symresy); |
|
|
|
• |
IntensizyX |
= sum(symresy, |
2) |
/n; |
|
• |
[m, |
~] = size(symresx); |
|
|
|
• |
IntensizyY |
= sum(symresx, |
1) |
/m; |
• syms = regionprops(symimg, ‘EulerNumber’, ‘Eccentricity’, ‘Centroid’, ‘Orientation’, ‘BoundingBox’);
• |
X(1) |
= |
syms(1).EulerNumber; |
|
• |
X(2) |
= |
syms(1).Eccentricity; |
|
• |
X(3) |
= |
syms(1).Centroid(1)/syms(1).BoundingBox(3); |
|
• |
X(4) |
= |
syms(1).Centroid(2)/syms(1).BoundingBox(4); |
|
• |
X(5) |
= |
syms(1).Orientation; |
|
• |
X(6) |
= |
syms(1).BoundingBox(3)/syms(1).BoundingBox(4); |
|
• |
X(K,7:70) = |
IntensityX(:); |
||
• |
X(K,71:134) |
= IntensityY(:); |
||
• |
Y = |
classRF_predict(X,model); |
•If vd
•for j=1:size(areas(i).PixelIdxList(:))
• OutI(areas(i).PixelIdxList(j)+ shift) = OutI(areas(i).PixelIdxList(j)+shift) + 70;
• end
•end
•outstr(i) = chars(Y);
•end
•while (isletter(outstr(1)) && isletter(outstr(2))) ||
(~isletter(outstr(1)) && isletter(outstr(2))) |
= |
|
• |
o u t s t r ( 1 : s i z e ( o t s t r , 2 ) - 1 ) |
outstr(2:size(outstr,2));
•end
•fprintf(‘%s (origin. %s)\n’ ,outstr(1: (min (6, size
(outstr,2 ) ) ) ) ,outstr);
•If vd
•Subplot(3,1,3);
•Imshow(OutI);
•end
•number = sprint(‘%s’ ,outstr(1: (min (6, size
(outstr,2 ) ) ) ) );
• end
Приложение 2
|
|
|
|
Пример кода для лабораторной работы № 4 |
|
• |
f |
= |
figure; |
• |
f.Position(3) = 1.5*f.Position(3); |
|||
• |
h |
= |
histogram(SMSSpamCollection.type); |
•xlabel(‘Класс’);
•ylabel(‘Частота появления’);
• |
title(‘Распределение по классам’); |
|||
|
• |
cvp = cvpartition(SMSSpamCollection.type,’Holdout’,0.3); |
||
• |
dataTrain = |
SMSSpamCollection(training(cvp),:); |
||
• |
dataHeldOut |
= |
SMSSpamCollection(test(cvp),:); |
|
• |
cvp = cvpartition(dataHeldOut.type,’Holdout’,0.5); |
|||
• |
dataValidation |
= dataHeldOut(training(cvp),:); |
||
• |
dataTest = |
dataHeldOut(test(cvp),:); |
||
|
• |
textDataTrain |
= dataTrain.content; |
|
• |
textDataValidation = dataValidation.content; |
|||
• |
textDataTest = |
dataTest.content; |
||
• |
YTrain = dataTrain.type; |
|||
• |
YValidation |
= |
dataValidation.type; |
• YTest = dataTest.type;
• figure
•wordcloud(textDataTrain);
•title(‘Training Data’);
|
• |
textDataTrain |
= |
lower(textDataTrain); |
• |
documentsTrain |
= |
tokenizedDocument(textDataTrain); |
|
• |
documentsTrain |
= |
erasePunctuation(documentsTrain); |
• textDataValidation = lower(textDataValidation);
•documentsValidation = tokenizedDocument(textDataValidation)
•documentsValidation = erasePunctuation(documentsValidation)
•documentsTrain(1:5)
• |
enc = wordEncoding(documentsTrain); |
• |
documentLengths = doclength(documentsTrain); |
•figure;
•histogram(documentLengths);
•title(‘Длина предложений’);
•xlabel(‘Длина’);
•ylabel(‘Число описаний’);
• XTrain = doc2sequence(enc,documentsTrain,’Length’, 200);
•XValidation = doc2sequence(enc,documentsValidation,’L ength’, 200);
•XTrain(1:5)
48
|
• |
inputSize = |
1; |
|
|
• |
embeddingDimension = 100; |
||||
• |
numWords |
= enc.NumWords; |
|||
• |
numHiddenUnits = |
360; |
|||
• |
numClasses = |
numel(categories(YTrain)); |
|||
• |
layers = |
[ ... |
|
||
|
|
sequenceInputLayer(inputSize) |
|||
|
|
wordEmbeddingLayer(embeddingDimension,numWords) |
|||
|
|
lstmLayer(numHiddenUnits,’OutputMode’,’last’) |
|||
|
|
fullyConnectedLayer(numClasses) |
|||
|
|
softmaxLayer |
|
||
|
|
classificationLayer] |
|||
|
• |
options |
= trainingOptions(‘adam’, ... |
||
|
|
‘MaxEpochs’,10, ... |
|||
|
|
‘GradientThreshold’,1, ... |
|||
|
|
‘InitialLearnRate’,0.01, ... |
|||
|
|
‘ValidationData’,{XValidation,YValidation}, ... |
|||
|
|
‘Plots’,’training-progress’, ... |
|||
|
|
‘Verbose’,false); |
|||
|
• |
net = trainNetwork(XTrain,YTrain,layers,options); |
|||
|
• |
textDataTest |
= |
lower(textDataTest); |
|
• |
documentsTest |
= |
tokenizedDocument(textDataTest); |
||
• |
documentsTest |
= |
erasePunctuation(documentsTest); |
||
• |
XTest = |
doc2sequence(enc,documentsTest,’Length’,200); |
|||
• |
XTest(1:5) |
|
|
||
• |
YPred = |
classify(net,XTest); |
|||
• |
accuracy |
= sum(YPred == YTest)/numel(YPred) |
Приложение 3
Пример кода для лабораторной работы № 5
•rng default;
•X = [randn(50,2)*0.5+ones(50,2); randn(50,2)*0.85+ones(50,2); randn(50,2)*0.75+ones(50,2)];
•figure;
•plot(X(:,1),X(:,2),’.’);
• |
title ‘Рандомное числовое множество’; |
• |
[idx,C] = kmeans(X,5); |
•figure
•gscatter(X(:,1),X(:,2),idx,’gbmrc’)
•hold on
• |
scatter(C(:,1),C(:,2),90, ‘filled’ |
,’k’); |
|
||
• |
m |
= |
size(X,1); |
|
|
• |
D |
= |
sqrt(sum(abs(repmat(permute(X, |
[1 3 |
2]), ... |
[1 size(C,1) 1]) - ... |
).^2, |
3)); |
|||
repmat(permute(C, [3 1 2]), [m 1 1]) |
|||||
• |
[D |
I] = min(D,[],2); |
|
|
|
• |
fordraw = reshape([X C(I,:) nan(size(X))]’, [2 m*3])’; |
||||
• |
plot |
(fordraw(:,1), fordraw(:,2)) |
|
|
|
• |
x1 |
= |
min(X(:,1)):0.01:max(X(:,1)); |
|
|
• |
x2 |
= |
min(X(:,2)):0.01:max(X(:,2)); |
|
|
• |
[x1G,x2G] |
= |
meshgrid(x1,x2); |
• |
XGrid = [x1G(:),x2G(:)]; |
||
• |
idx2Region |
= |
kmeans(XGrid,5,’MaxIter’,1,’Start’,C); |
•figure;
•gscatter(XGrid(:,1),XGrid(:,2),idx2Region, ...
[0,0.75,0.75;0.75,0,0.75;0.75,0.75,0],’..’);
•hold on;
• |
kkk = |
gscatter(X(:,1),X(:,2),idx); |
||
• |
kkk(3).Color |
= |
‘w’; |
|
• |
kkk(2).Color |
= |
‘b’; |
|
• |
kkk(1).Color |
= |
‘r’; |
|
• |
kkk(4).Color |
= |
‘c’; |
|
• |
kkk(5).Color |
= |
‘y’; |
|
• |
title |
‘Разделение точек до ближайшего центра’; |
•legend(‘Region 1’,’Region 2’,’Region 3’,’Region 4’,’Region 5’,’Location’,’NorthEast’);
•hold off;
• |
eucD = pdist(X,’euclidean’); |
• |
clustTreeEuc = linkage(eucD,’average’); |
50