In [11]:
from sklearn.datasets import fetch_olivetti_faces
from pylab import *
from plotly import tools
faces = fetch_olivetti_faces()
#Quantidade
print "\nQuantidade Total de Dados: "
print faces.target.shape
É amplamente utilizado em problemas de classificação de dados. A proposta é armazenar todos os casos disponíveis e classificar novos casos por maioria de votos de seus vizinhos k. O caso que está sendo atribuído à classe é mais comum entre os seus K vizinhos mais próximos medidos por uma função de distância. Neste caso estamos utilizando a distância euclidiana.
In [12]:
from scipy.spatial import distance
from sklearn import tree
from sklearn import datasets
from sklearn.datasets import fetch_olivetti_faces
from sklearn.cross_validation import train_test_split
#Funcao da distancia Euclidiana
def euc(a,b):
return distance.euclidean(a,b)
class ScrappyKNN():
#Faz o treinamento
#Entradas: elementos e labels
def fit(self,X_train,y_train):
self.X_train = X_train
self.y_train = y_train
#Faz a previsao
#Entrada: elementos dos dados de teste
#Saida: Previsao para os labels
def predict(self,X_test):
predictions = []
for row in X_test:
#Encontra o ponto de treinamento mais proximo do ponto de teste
label = self.closest(row)
predictions.append(label)
return predictions
def closest(self,row):
#Calcula a distancia do teste ao primeiro ponto de treinamento
best_dist = euc(row,self.X_train[0])
#Guarda o index da melhor distancia
best_index = 0
for i in range(1, len(self.X_train)):
dist = euc(row,self.X_train[i])
#Quando encontrar um ponto de distancia menor atualizar os valores
if(dist<best_dist):
#Guarda a menor distancia
best_dist = dist
#Guarda o indice da menor distancia
best_index = i
return self.y_train[best_index]
#utilizando
face = fetch_olivetti_faces()
X = face.data
y = face.target
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=.5)
my_classifier = ScrappyKNN()
my_classifier.fit(X_train,y_train)
predictions = my_classifier.predict(X_test)
#print predictions
from sklearn.metrics import accuracy_score
print accuracy_score(y_test,predictions)
#Resultado Faces 0.80