<jupyter_start><jupyter_text>EXERCÍCIOS NO FIM DO NOTEBOOK!!  Carregando os dadosUsaremos o data set do Iris para fazer nossas predições<jupyter_code>iris = []

with open('iris.csv', 'r') as f:
    for line in f:
        if line.replace("\n", ""):
            iris.append(line.replace('\n', '').split(','))

iris<jupyter_output><empty_output><jupyter_text>Separando em features e labels<jupyter_code>data = []
label = []

for line in iris:
    data.append([float(x) for x in line[:-1]])
    label.append(line[-1])

label<jupyter_output><empty_output><jupyter_text>Transformando em Numpy<jupyter_code>import numpy as np
data
data = np.array(data)
label = np.array(label)
query = np.array([5, 2.8, 1.8, 2])<jupyter_output><empty_output><jupyter_text>Calculando a distância entre a query e todos os outros pontos<jupyter_code># Função de distância euclidiana

from math import sqrt

def eucli(a, b):
    return sqrt(sum((a - b) ** 2))
dists = np.array([eucli(point, query) for point in data])
dists
np.sum(((data - query) ** 2), axis = 1) ** (1/2)<jupyter_output><empty_output><jupyter_text>Pontos mais próximos<jupyter_code>indx = np.argsort(dists)[:3]
label[indx]<jupyter_output><empty_output><jupyter_text>Vendo a classe mais próxima<jupyter_code>from collections import Counter
Counter(label[indx]).most_common(1)[0][0]<jupyter_output><empty_output><jupyter_text>Criando uma função que faz a classificação<jupyter_code>def knn(data, query, k=3):
    dists = np.sum(((data - query) ** 2), axis = 1)
    indx = np.argsort(dists)[:k]
    return Counter(label[indx]).most_common(1)[0][0]
knn(data, query, k=3)<jupyter_output><empty_output><jupyter_text>Sugestões de exercícios para casa!  1) Entenda porque não precisamos da raiz no cálculo da função euclidiana;  Implemente uma generalização da distância euclidiana, a [distância minkswoki](https://en.wikipedia.org/wiki/Minkowski_distance).  Teste se o resultado muda para valores diferentes de "p".  DICA: Use o np.inf para verificar se precisamos do máximo/mínimo<jupyter_code>def minkowski_distance(a, b, p=2):
    # Code here<jupyter_output><empty_output><jupyter_text>2) Transforme a nossa função knn para aceitar mais de 1 query (isto é, para testar vários casos de teste).DICA: Faça o máximo modularizado possível! Da uma olhada [aqui](https://github.com/BrunoGomesCoelho/small-bang/blob/master/knn/knn.pyL55) se precisar.<jupyter_code>def knn_extended(data, queries, k=3):
    # Your code here<jupyter_output><empty_output><jupyter_text>3)Implemente a versão ponderada pelo peso para o K-NN. Isto é, em vez de só pegar o voto majoritário, leve em consideração a distância de cada exemplo na hora de fazer a votação.DICA: Se precisar, leia mais sobre [aqui](http://www.data-machine.com/nmtutorial/distanceweightedknnalgorithm.htm) e se precisar se inspire [nesse código](https://github.com/FlonairLenz/weighted-knn/blob/master/knn_algorithm.py).<jupyter_code>def knn_weighted(data, queries, k=3):
    # Your code here<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.12454212454212454, 'fraction_numerical': 0.01098901098901099, 'mean_word_length': 5.811791383219955, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 0, '>': 41, 'https://': 3, 'lorem ipsum': 0, 'www.': 1, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '504113', 'license': 'MIT', 'n_tokens_mistral': 1174, 'n_tokens_neox': 1146, 'n_words': 272, 'path': 'Aula02/KNN_licao.ipynb', 'repo_name': 'MatheusSanchez/DataScience', 'size': '3003'}