 
        
        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
