#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 16 19:14:11 2021
Implementação do k-NN com skLearn
@author: Vinicius
https://www.monolitonimbus.com.br/classificacao-usando-knn/
"""


import sys
from sklearn.neighbors import KNeighborsClassifier

# Inicialização da lista de amostras separada em entrada e classes
entradas, classes = [], []

# Carregar dados de arquivo CSV com amostras
with open('iris.data2', 'r') as f:
	#ler arquivo linha por linha
	for linha in f.readlines():
		# obter os atributos da amostra
		atrib = linha.replace('\n','').split(',')
		entradas.append([float(atrib[0]), float(atrib[1]), float(atrib[2]), float(atrib[3])])
		classes.append(atrib[4])  #classes
# Separar 60% dos dados para treinamento e o restante fica para testar
p = 0.6
limite = int(p * len(entradas))

# Chamar a função do skLearn para aplicar o k-NN com K = 13
knn = KNeighborsClassifier(n_neighbors=13)
# Ajustar o modelo usando "entradas" como dados de treinamento e "classes" como valores-alvo
# treinamento == entradas[:limite]
knn.fit(entradas[:limite], classes[:limite])  #dados e classes de treinamento
# Previsão dos rótulos das classes para o restante da base de dados
# Executa o knn com o conjunto de testes
rotulos_previstos = knn.predict(entradas[limite:]) #testes==entradas[limite:]

# Contabilizar acertos para os dados de teste
acertos, indice_rotulo = 0, 0
for i in range(limite, len(entradas)):
	if rotulos_previstos[indice_rotulo] == classes[i]:
		acertos += 1
	indice_rotulo += 1

print('Total de treinamento: %d' % limite)
print('Total de testes: %d' % (len(entradas) - limite))
print('Total de acertos: %d' % acertos)
print('Porcentagem de acertos: %.2f%%' % (100 * acertos / (len(entradas) - limite)))