Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИДЗ_Лебедь.docx
Скачиваний:
3
Добавлен:
04.09.2023
Размер:
225.78 Кб
Скачать

Приложение а

Код программы для работы с классификатором k ближайших соседей:

knn_data.Xtrain = [NR.train; ZHT.train; FZH.train]; knn_data.Xtest = [NR.test; ZHT.test; FZH.test]; knn_data.Ytrain = [zeros(15, 1) + 1; zeros(15, 1) + 2; zeros(15, 1) + 3]; knn_data.Ytest = [zeros(15, 1) + 1; zeros(15, 1) + 2; zeros(15, 1) + 3]; knn_data.labels = {'НР', 'ЖТ', 'ФЖ'}; [results.knn, plots.knn] = do_knn(knn_data); figure; tiledlayout(1, 1, 'TileSpacing', 'none', 'Padding', 'none'); nexttile; hold on; plot(plots.knn.accs_N.X, plots.knn.accs_N.Y, '-*', 'LineWidth', 2); plot(plots.knn.nr_sens_N.X, plots.knn.nr_sens_N.Y, '--o', 'LineWidth', 2); plot(plots.knn.zht_sens_N.X, plots.knn.zht_sens_N.Y, '--o', 'LineWidth', 2); plot(plots.knn.fzh_sens_N.X, plots.knn.fzh_sens_N.Y, '--o', 'LineWidth', 2); xlabel('Значение k'); ylabel('Показатель, %'); legend({'Точность', 'Чувствительность к НР', 'Чувствительность к ЖТ', 'Чувствительность к ФЖ'}, 'Location', 'northoutside'); ylim([0, 100]); grid on; saveas(gcf, 'knn N.png'); figure; tiledlayout(1, 1, 'TileSpacing', 'none', 'Padding', 'none'); nexttile; hold on; plot(plots.knn.accs_W.X, plots.knn.accs_W.Y, '-*', 'LineWidth', 2); plot(plots.knn.nr_sens_W.X, plots.knn.nr_sens_W.Y, '--o', 'LineWidth', 2); plot(plots.knn.zht_sens_W.X, plots.knn.zht_sens_W.Y, '--o', 'LineWidth', 2); plot(plots.knn.fzh_sens_W.X, plots.knn.fzh_sens_W.Y, '--o', 'LineWidth', 2); xlabel('Значение k'); ylabel('Показатель, %'); legend({'Точность', 'Чувствительность к НР', 'Чувствительность к ЖТ', 'Чувствительность к ФЖ'}, 'Location', 'northoutside'); ylim([0, 100]); grid on; saveas(gcf, 'knn W.png');

function [results, plots] = do_knn(data) k_vals = 3 : 10; results.k_vals = k_vals; L = length(k_vals); results.N = cell(1, L); results.W = cell(1, L); accs_N = zeros(1, L); nr_sens_N = zeros(1, L); zht_sens_N = zeros(1, L); fzh_sens_N = zeros(1, L); accs_W = zeros(1, L); nr_sens_W = zeros(1, L); zht_sens_W = zeros(1, L); fzh_sens_W = zeros(1, L); results.max_acc = 0; results.max_acc_k = 0; results.max_fzh_sens = 0; results.max_fzh_sens_k = 0; ind = 1; for k = k_vals [res_N.acc, res_N.cm, res_N.nr_sens, res_N.zht_sens, res_N.fzh_sens] = knn(data.Xtrain, data.Ytrain, data.Xtest, data.Ytest, k, 'N'); [res_W.acc, res_W.cm, res_W.nr_sens, res_W.zht_sens, res_W.fzh_sens] = knn(data.Xtrain, data.Ytrain, data.Xtest, data.Ytest, k, 'W'); accs_N(ind) = res_N.acc; nr_sens_N(ind) = res_N.nr_sens; zht_sens_N(ind) = res_N.zht_sens; fzh_sens_N(ind) = res_N.fzh_sens; accs_W(ind) = res_W.acc; nr_sens_W(ind) = res_W.nr_sens; zht_sens_W(ind) = res_W.zht_sens; fzh_sens_W(ind) = res_W.fzh_sens; if results.max_acc < res_W.acc results.max_acc = res_W.acc; results.max_acc_k = k; end if results.max_fzh_sens < res_W.fzh_sens results.max_fzh_sens = res_W.fzh_sens; results.max_fzh_sens_k = k; end res_N.k = k; res_W.k = k; results.N(ind) = { res_N }; results.W(ind) = { res_W }; ind = ind + 1; end plots.accs_N.Y = accs_N; plots.accs_N.X = k_vals; plots.accs_W.Y = accs_W; plots.accs_W.X = k_vals; plots.nr_sens_N.Y = nr_sens_N; plots.nr_sens_N.X = k_vals; plots.zht_sens_N.Y = zht_sens_N; plots.zht_sens_N.X = k_vals; plots.fzh_sens_N.Y = fzh_sens_N; plots.fzh_sens_N.X = k_vals; plots.nr_sens_W.Y = nr_sens_W; plots.nr_sens_W.X = k_vals; plots.zht_sens_W.Y = zht_sens_W; plots.zht_sens_W.X = k_vals; plots.fzh_sens_W.Y = fzh_sens_W; plots.fzh_sens_W.X = k_vals; end

function [acc, confmat, nr_sens, zht_sens, fzh_sens] = knn(Xtrain, Ytrain, Xtest, Ytest, k, method) dists = zeros(size(Ytest, 1), size(Ytrain, 1)); for train_ind = 1 : size(Xtrain, 1) for test_ind = 1 : size(Xtest, 1) dists(test_ind, train_ind) = norm(... Xtrain(train_ind, :) - Xtest(test_ind, :), ... 2); end end Ypred = zeros(size(Ytest)); for test_x_ind = 1 : size(Xtest, 1) dists_row = dists(test_x_ind, :); [dists_sorted, dist_inds] = sort(dists_row, 2); first_k_dist_inds = dist_inds(1 : k); first_k_class_labels = Ytrain(first_k_dist_inds); if strcmp(method, 'N') classes_scores = zeros(1, 3); for label_ind = 1 : k class_ind = first_k_class_labels(label_ind); classes_scores(class_ind) = classes_scores(class_ind) + 1; end elseif strcmp(method, 'W') first_k_dists = dists_sorted(1 : k); first_k_weights = 1 ./ first_k_dists; classes_scores = zeros(1, 3); for label_ind = 1 : k class_ind = first_k_class_labels(label_ind); classes_scores(class_ind) = classes_scores(class_ind) + ... first_k_weights(label_ind); end else assert(false, "method must be 'W' or 'N'"); end [~, I] = max(classes_scores); Ypred(test_x_ind) = I; end acc = sum(Ypred == Ytest) ./ length(Ytest) * 100; confmat = confusionmat(Ytest, Ypred); nr_sens = confmat(3, 3) ./ sum(confmat(3, :)) * 100; zht_sens = confmat(2, 2) ./ sum(confmat(2, :)) * 100; fzh_sens = confmat(1, 1) ./ sum(confmat(1, :)) * 100; end

Соседние файлы в предмете Технологии и системы принятия решений