TIF_E41201549/ModelKnn.m

128 lines
4.4 KiB
Matlab

% Direktori gambar
folderTembakau = 'F:\SKRIPSI\MATLAB\Matlab Batik\Data Latih_1\Tembakau\';
folderKopi = 'F:\SKRIPSI\MATLAB\Matlab Batik\Data Latih_1\Kopi\';
% Membaca daftar gambar
imagesTembakau = dir(fullfile(folderTembakau, '*.jpg'));
imagesKopi = dir(fullfile(folderKopi, '*.jpg'));
% Inisialisasi variabel untuk menyimpan fitur dan label
features = [];
labels = [];
% Ukuran resize
resizeSize = [300, 300];
% Ekstraksi fitur dari gambar motif batik tembakau
for i = 1:length(imagesTembakau)
img = imread(fullfile(folderTembakau, imagesTembakau(i).name));
% Resize gambar
imgResized = imresize(img, resizeSize);
% Ubah menjadi grayscale
imgGray = rgb2gray(imgResized);
glcm = graycomatrix(imgGray, 'Offset', [0 1; -1 1; -1 0; -1 -1]);
stats = graycoprops(glcm);
% Menghitung entropi untuk setiap arah
entropy_vals = zeros(1, 4);
for j = 1:4
P = glcm(:, :, j) / sum(glcm(:, :, j), 'all');
entropy_vals(j) = -sum(P(:) .* log2(P(:) + eps)); % menambahkan eps untuk menghindari log(0)
end
featureVector = [mean(stats.Contrast), mean(stats.Correlation), mean(stats.Energy), mean(stats.Homogeneity), mean(entropy_vals)];
features = [features; featureVector];
labels = [labels; 1]; % Label untuk batik tembakau
end
% Ekstraksi fitur dari gambar motif batik kopi
for i = 1:length(imagesKopi)
img = imread(fullfile(folderKopi, imagesKopi(i).name));
% Resize gambar
imgResized = imresize(img, resizeSize);
% Ubah menjadi grayscale
imgGray = rgb2gray(imgResized);
glcm = graycomatrix(imgGray, 'Offset', [0 1; -1 1; -1 0; -1 -1]);
stats = graycoprops(glcm);
% Menghitung entropi untuk setiap arah
entropy_vals = zeros(1, 4);
for j = 1:4
P = glcm(:, :, j) / sum(glcm(:, :, j), 'all');
entropy_vals(j) = -sum(P(:) .* log2(P(:) + eps)); % menambahkan eps untuk menghindari log(0)
end
featureVector = [mean(stats.Contrast), mean(stats.Correlation), mean(stats.Energy), mean(stats.Homogeneity), mean(entropy_vals)];
features = [features; featureVector];
labels = [labels; 2]; % Label untuk batik kopi
end
% Persentase pembagian data latih dan data uji
splitRatios = [0.9, 0.8, 0.7, 0.6, 0.5];
kValues = [7, 9, 11, 13, 15];
for splitRatio = splitRatios
fprintf('Pembagian data latih dan data uji: %.0f:%.0f\n', splitRatio*100, (1-splitRatio)*100);
% Bagi data menjadi data latih dan data uji
cv = cvpartition(labels, 'HoldOut', 1 - splitRatio);
XTrain = features(training(cv), :);
YTrain = labels(training(cv), :);
XTest = features(test(cv), :);
YTest = labels(test(cv), :);
accuracies = zeros(length(kValues), 1);
for idx = 1:length(kValues)
k = kValues(idx);
% Latih model KNN
knnModel = fitcknn(XTrain, YTrain, 'NumNeighbors', k);
% Prediksi dan evaluasi
YPred = predict(knnModel, XTest);
% Hitung akurasi
accuracy = sum(YPred == YTest) / length(YTest);
accuracies(idx) = accuracy * 100;
% Menampilkan hasil
fprintf('Akurasi model dengan k=%d: %.2f%%\n', k, accuracy * 100);
% Menampilkan confusion matrix
confMat = confusionmat(YTest, YPred);
disp(['Confusion Matrix untuk k=' num2str(k) ':']);
disp(confMat);
% Visualisasi confusion matrix
figure;
confusionchart(YTest, YPred);
title(['Confusion Matrix untuk k=' num2str(k) ' dengan pembagian data ' num2str(splitRatio*100) ':' num2str((1-splitRatio)*100)]);
% Visualisasi hasil prediksi dengan grafik scatter
figure;
gscatter(XTest(:,1), XTest(:,2), YTest, 'rb', 'ox');
hold on;
gscatter(XTest(:,1), XTest(:,2), YPred, 'gb', 'x*');
xlabel('Fitur 1');
ylabel('Fitur 2');
title(['Grafik Titik Label KNN dengan k=' num2str(k) ' dan pembagian data ' num2str(splitRatio*100) ':' num2str((1-splitRatio)*100)]);
legend('Label Asli: Tembakau', 'Label Asli: Kopi', 'Prediksi: Tembakau', 'Prediksi: Kopi');
hold off;
end
% Plot akurasi untuk pembagian data saat ini
figure;
plot(kValues, accuracies, '-o');
xlabel('Nilai k');
ylabel('Akurasi (%)');
title(['Akurasi KNN untuk Berbagai Nilai k dengan pembagian data ' num2str(splitRatio*100) ':' num2str((1-splitRatio)*100)]);
grid on;
end