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

Rispondi quotando
