-
Notifications
You must be signed in to change notification settings - Fork 0
/
k-Nearest_Neighbors
105 lines (94 loc) · 3.49 KB
/
k-Nearest_Neighbors
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Feito por: Bruno Mascioli de Souza e Lucas Pereira dos Santos
import math
from random import choice
def ler_exemplares():
matriz = []
arquivo = open('iris.data.csv', 'r')
for linha in arquivo:
dados = linha.strip().split(',')
matriz.append(dados)
arquivo.close()
return matriz[1:]
def ler_sem_classificacao(nome_arquivo):
matriz = []
arquivo = open(nome_arquivo, 'r')
for linha in arquivo:
dados = linha.strip().split(',')
matriz.append(dados)
arquivo.close()
return matriz
def distancia_euclidiana(exemplo, nao_classificados):
distancia = math.sqrt(((exemplo[0]) - (nao_classificados[0]))**2 +
((exemplo[1]) - (nao_classificados[1]))**2 +
((exemplo[2]) - (nao_classificados[2]))**2 +
((exemplo[3]) - (nao_classificados[3]))**2)
return distancia
def calculo_distancias(matriz_exemplares, matriz_sem_classificacao, k):
matriz = []
for nao_classificados in matriz_sem_classificacao:
distancias = []
nao_classificados = list(map(float, nao_classificados))
for exemplo in matriz_exemplares:
especie = exemplo[4]
exemplo = list(map(float, exemplo[:-1]))
distancia = distancia_euclidiana(exemplo, nao_classificados)
distancias.append([distancia, especie, nao_classificados])
distancias_ordenadas = sorted(distancias)
matriz.append(distancias_ordenadas[:k])
return matriz
def determina_classe(matriz):
arquivo = open('iris.data.csv', 'a')
for especie_sem_classificacao in matriz:
setosa, versicolor, virginica = 0, 0, 0
for pontos in especie_sem_classificacao:
if pontos[1] == 'setosa':
setosa += 1
elif pontos[1] == 'versicolor':
versicolor += 1
else:
virginica += 1
arquivo.write('\n')
for elem in especie_sem_classificacao[0][2]:
elem = str(elem)
arquivo.write(elem)
arquivo.write(',')
#Casos em que existe um valor maior
if setosa > versicolor and setosa > virginica:
arquivo.write('setosa')
print(especie_sem_classificacao[0][2], 'setosa')
elif versicolor > setosa and versicolor > virginica:
arquivo.write('versicolor')
print(especie_sem_classificacao[0][2], 'versicolor')
elif virginica > setosa and virginica > versicolor:
arquivo.write('virginica')
print(especie_sem_classificacao[0][2], 'virginica')
#Casos de valores iguais
#todas iguais
elif virginica == versicolor == setosa:
sorteio = choice(['virginica','setosa', 'versicolor'])
arquivo.write(sorteio)
print(especie_sem_classificacao[0][2], sorteio)
#virginica = versicolor
elif virginica == versicolor > setosa:
sorteio = choice(['virginica','versicolor'])
arquivo.write(sorteio)
print(especie_sem_classificacao[0][2], sorteio)
#virginica = setosa
elif virginica == setosa > versicolor:
sorteio = choice(['virginica','setosa'])
arquivo.write(sorteio)
print(especie_sem_classificacao[0][2], sorteio)
#setosa = versicolor
else:
sorteio = choice(['setosa', 'versicolor'])
arquivo.write(sorteio)
print(especie_sem_classificacao[0][2], sorteio)
arquivo.close()
def main():
k = int(input('K: '))
nome_arquivo = input('Nome do arquivo de dados não classificados: ')
matriz_exemplares = ler_exemplares()
matriz_sem_classificacao = ler_sem_classificacao(nome_arquivo)
matriz = calculo_distancias(matriz_exemplares, matriz_sem_classificacao, k)
determina_classe(matriz)
main()