Simply said ,the K-Neighbors is going to find K nearest featuresets to the data you want to predict.And then we begin a vote.(The vote is about the classification of the featuresets)
if we have the most votes(classification ) in K.,Like K=5 ,and we have 3 featuresets are Class A. 2 featuresets are Class B.We defined the classsification of the data we want to predict is A, and the confidence would be 3/5.
import random
import numpy as np
import pandas as pd
from collections import Counter
import warnings
import math
def k_nearest_neighbors(data,predict,k=3):
if len(data) >=k:
warnings.warn('K is set to less than the groups')
distances = []
for group in data:
for features in data[group]:
euclidean_distance = np.linalg.norm(np.array(features)-np.array(predict))
distances.append([euclidean_distance,group])
votes = [i[1] for i in sorted(distances)[:k]]
print(Counter(votes).most_common(1))
vote_result = Counter(votes).most_common(1)[0][0]
return vote_result
df = pd.read_csv("breast-cancer-wisconsin.data.txt")
df.replace('?',-99999,inplace = True)
df.drop(['id'],1,inplace= True)
full_data=df.astype(float).values.tolist()
random.shuffle(full_data)
test_size = 0.2
train_set = {2:[],4:[]}
test_set= {2:[],4:[]}
train_data = full_data[:-int(test_size*len(full_data))]
test_data = full_data[-int(test_size*len(full_data)):]
for i in train_data:
train_set[i[-1]].append(i[:-1])
for i in test_data:
test_set[i[-1]].append(i[:-1])
correct = 0
total = 0
for group in test_set:
for data in test_set[group]:
vote = k_nearest_neighbors(train_set,data,k=5)
if group == vote:
correct += 1
total +=1
print('Accuracy: ',correct/total)