-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathknn.py
36 lines (30 loc) · 1.16 KB
/
knn.py
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
import math, sys
def euclidianDistance(pointA, pointB):
set_of_keys = set(pointA.keys() + pointB.keys())
differences = pointA.get()
def addNeighbor(neighbors, distanceToAdd, neighborToAdd):
neighbors.pop()
if distanceToAdd >= neighbors[len(neighbors) - 1][0]:
neighbors.append((distanceToAdd, neighborToAdd))
return distanceToAdd
for index, (distance, neighbor) in enumerate(neighbors):
if distanceToAdd < distance:
neighbors.insert(index, (distanceToAdd, neighborToAdd))
return neighbors[len(neighbors) - 1][0]
def knn(data, k):
predictions = []
for toClassifyIndex, pointToClassify in enumerate(data):
nearestNeighbors = [(sys.maxsize, None)] * k
maxNeighbor = sys.maxsize
for index, dataPoint in enumerate(data):
if index != toClassifyIndex:
distance = euclidianDistance(pointToClassify, dataPoint)
if distance < maxNeighbor:
maxNeighbor = addNeighbor(nearestNeighbors, distance, dataPoint)
classifications = [neighbor['__AUTHOR__'] for _, neighbor in nearestNeighbors]
predictions.append(max(set(classifications), key=classifications.count))
return predictions
def main():
print('knn running')
if __name__ == '__main__':
main()