Salve a tutti! Ho questo progetto e l'ho strutturato in questo modo, vorrei sapere da voi se è giusto. Thanks!!
Testo:
Sia dato il dataset ”Opdigits” che rappresenta un dataset di immagini di digit (cifre da ’0’ a ’9’) scritti a mano. Il dataset si presenta gi´a sotto forma di misurazioni numeriche estratte da ogni singola immagine che rappresenta un digit, per un totale di 5620 digit divisi su due dataset, training e test. Tale dataset viene fornito tramite il file digits.zip che contiene una descrizione pi´u dettagliata dei dati (readme.txt).
Dato il training set T opportunamente estratto dal file ”optdigits.tra”, si richiede di implementare in Matlab un classificatore k-vicini che utilizzi T e la distanza euclidea per riconoscere i digit memorizzati nel dataset ”optdigits.tes”. Si visualizzino tramite grafico ad istogramma le accuratezze di classificazione su ogni singolo digit, e il valore medio calcolato su tutti i digit. Tali accuratezze devono essere calcolate su diverse scelte del numero k dei vicini, per k=1,..,21 a passo intero dispari.
CODICE:
codice:
%%
clear all
train_set_completo=importdata('optdigits.tra');
test_set=importdata('optdigits.tes');
training=train_set_completo(:, 1:end-1);
training_L=train_set_completo(:, end);
test=test_set(:, 1:end-1);
test_L=test_set(:, end);
%% K vicini metodo senza fitcknn
acc=zeros(11,1);
%Calcolo della distranza euclidea
for L=1:11
k=L*2-1;
[~,~,accuratezza] = k_vicini(k, training, training_L, test, test_L);
acc(L,1)=accuratezza;
end
%% Grafici
in=(1:11)*2-1;
figure2=figure
bar(in,acc*100)
set(gca,'ylim', [min(acc*100)-0.5 max(acc*100)+0.5])
hold on
mu = mean(acc*100);
hline = refline([0 mu]);
hline.Color = 'r';
title('Accuratezza col metodo dei K vicini utilizzando la distanza euclidea');
xlabel('\bf K') ;
ylabel('\bf Percentuale accuratezza');
legend('Accuratezze per ogni K', 'Media delle accuratezze')
saveas(figure2,'Risultati.jpg') ;
CODICE FUNZIONI
codice:
function [predizione,nn_index,accuratezza] = k_vicini(k, training, training_L, test, test_L)
predizione=zeros(size(test,1),1);
distanza_euclidea=zeros(size(test,1),size(training,1)); %matrice (MxN) della distanza euclidea
ind=zeros(size(test,1),size(training,1)); %indici della matrice(MxN)
k_nn=zeros(size(test,1),k); %matrice dei k vicini (Mxk)
%Calcolo della distanza euclidea
for test_point=1:size(test,1)
for train_point=1:size(training,1)
distanza_euclidea(test_point,train_point)=sqrt(sum((test(test_point,:)-training(train_point,:)).^2));
end
[distanza_euclidea(test_point,:),ind(test_point,:)]=sort(distanza_euclidea(test_point,:));
%il comando sort serve a ordinare gli elementi della matrice e dà in
%uscita il valore, nel nostro caso la distanza e l'indice della matrice
%nel quale è conservato quel valore
end
%trova i k vicini
k_nn=ind(:,1:k);
nn_index=k_nn(:,1);
%predizione
for i=1:size(k_nn,1)
options=unique(training_L(k_nn(i,:)'));
%il comando unique prende gli stessi dati della matrice a cui si
%applica però togliendo i valori ripetuti
max_count=0;
max_label=0;
for j=1:length(options)
L=length(find(training_L(k_nn(i,:)')==options(j)));
if L>max_count
max_label=options(j);
max_count=L;
end
end
predizione(i)=max_label;
end
%accuratezza
if isempty(test_L)==0
accuratezza=length(find(predizione==test_L))/size(test,1);
end
end