# Implementação kNN em python # Dataset https://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival # Dataset de pessoas que realizaram cirurgia para combate ao Cancer # Classe 1 para pessoas que sobreviram 5 anos apos a cirurgia # Classe 2 para pessoas que não sobreviram 5 anos apos a cirurgia # Lista de amostras amostras = [] with open('haberman.data', 'r') as f: for linha in f.readlines(): atrib = linha.replace('\n', '').split(',') amostras.append([int(atrib[0]), int(atrib[1]), int(atrib[2]), int(atrib[3])]) # print(len(amostras)) # Informações importantes def infos_dataset(amostras, verbose=True): if verbose: print('Total de amostras %d' % len(amostras)) classe1, classe2 = 0, 0 for amostra in amostras: if amostra[-1] == 1: classe1 += 1 else: classe2 += 1 if verbose: print('Total Classe 1: %d' % classe1) print('Total Classe 2: %d' % classe2) return [len(amostras), classe1, classe2] print('--------- Informações de Dataset --------') infos_dataset(amostras) # Porcentagem para testes p = 0.7 _, classe1, classe2 = infos_dataset(amostras, verbose=False) treinamento, teste = [], [] max_classe1, max_classe2 = int(p * classe1), int(p * classe2) # print('Porcentagem de classe 1 e 2 para amostra de Treinamento') # print('Classe 1: %d' % max_classe1) # print('Classe 2: %d' % max_classe2) total_classe1, total_classe2 = 0, 0 for amostra in amostras: if(total_classe1 + total_classe2) < (max_classe1 + max_classe2): treinamento.append(amostra) if amostra[-1] == 1 and total_classe1 < max_classe1: total_classe1 += 1 else: total_classe2 += 1 else: teste.append(amostra) print('-------------- Treinamento --------------') infos_dataset(treinamento) print('---------------- Teste ------------------') infos_dataset(teste) import math def dist_euclidiana(v1, v2): dim, soma = len(v1), 0 for i in range(dim -1): soma += math.pow(v1[i] - v2[i], 2) return math.sqrt(soma) # Teste distancia # v1 = [5, 5, 3] # v2 = [6, 2, 3] # print(dist_euclidiana(v1, v2)) def algo_knn(treinamento, nova_amostra, K): dists, tam_treino = {}, len(treinamento) # Calculando distancia euclidiana da amostra de teste for i in range(tam_treino): d = dist_euclidiana(treinamento[i], nova_amostra) dists[i] = d # Indices do k-vizinhos mais proximos k_vizinhos = sorted(dists, key=dists.get)[:K] # Votacao majoritaria q_classe1, q_classe2 = 0, 0 for indice in k_vizinhos: if treinamento[indice][-1] == 1: q_classe1 += 1 else: q_classe2 += 1 if q_classe1 > q_classe2: return 1 else: return 2 print('Teste individual de posicao [i] de amostra de teste') print(teste[10]) print(algo_knn(treinamento, teste[10], K=5)) acertos, K = 0, 5 for amostra in teste: classe = algo_knn(treinamento, amostra, K) if amostra[-1] == classe: acertos += 1 # print('-------------------- Teste Final --------------------') # print('Total de treinamento: %d' % len(treinamento)) # print('Total de testes: %d' % len(teste)) # print('Total de acertos: %d' % acertos) # print('Porcentagem de acertos: %.2f%%' % (100 * acertos / len(teste)))
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question