From 2ca5f202bc4234ab476e4c352fedfc451404e7c8 Mon Sep 17 00:00:00 2001 From: Ludovic CASTIGLIA Date: Tue, 28 Jan 2025 21:27:00 +0100 Subject: [PATCH] =?UTF-8?q?algo=20de=20knn=20na=C3=AFf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3nar.py | 20 +++----------------- knn.py | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ point.py | 15 +++++++++++++++ 3 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 knn.py create mode 100644 point.py diff --git a/3nar.py b/3nar.py index 318619f..c33b45c 100644 --- a/3nar.py +++ b/3nar.py @@ -1,5 +1,6 @@ -import matplotlib.pyplot as plt import numpy as np + +from point import * from function import * class Nnnar: @@ -71,25 +72,10 @@ class Nnnar: coord = np.floor(coord).astype(int) return coord -class Point: - def __init__(self, coord, value): - self.coord = coord - self.value = value - - def setvalue(self, value): - self.value = value - - def getDist(self, point): - return np.linalg.norm(self.coord - point.coord) - - def getDistFromCoord(self, coord): - return np.linalg.norm(self.coord - coord) - - n = Nnnar(3, 0, 3, 2) n.addPoint(np.array([1, 0.8,1.5]), [0.2,0.5]) n.addPoint(np.array([0.2, 1.8,1.2]), [0.4,0.7]) -print(n.getValueOfPoint(np.array([1, 0.8, 1.5]), 1)) \ No newline at end of file +print(n.getValueOfPoint(np.array([1, 0.8, 1.5]), 2)) \ No newline at end of file diff --git a/knn.py b/knn.py new file mode 100644 index 0000000..329edbc --- /dev/null +++ b/knn.py @@ -0,0 +1,54 @@ +import numpy as np + +from point import * + + +class Knn: + def __init__(self): + self.space = np.array([]) + + def addPoint(self, coord, value): + self.space = np.append(self.space, Point(coord, value)) + + def getValueOfPoint(self, coord,nbNearest): + points, dists = self.getNNearest(coord, nbNearest) + ttPart = 1/(dists[0]+1) + value = [] + for i in points[0].value: + value.append(i * ttPart) + for idx in range(1,len(points)): + ttPart += 1/(dists[idx]+1) + tvalue = points[idx].value + for i in range(len(tvalue)): + value[i] += tvalue[i] * (1/(dists[idx]+1)) + for i in range(len(value)): + value[i] = value[i] / ttPart + return value + + def getNNearest(self, coord, nbNearest): + dist = np.copy(self.space) + dist = np.frompyfunc(lambda x: x.getDistFromCoord(coord), 1, 1)(dist) + if (nbNearest > len(dist)): + print("Error: not enough points") + return None, None + found = [] + distance = [] + for i in range(nbNearest): + found.append(self.space[i]) + distance.append(dist[i]) + maxDistIdx = np.argmax(distance) + for i in range(nbNearest, len(dist)): + if (dist[i] < distance[maxDistIdx]): + found[maxDistIdx] = self.space[i] + distance[maxDistIdx] = dist[i] + maxDistIdx = np.argmax(distance) + return found, distance + + + +k = Knn() + +k.addPoint(np.array([1, 0.8,1.5]), [0.2,0.5]) +k.addPoint(np.array([0.2, 1.8,1.2]), [0.4,0.7]) + +print(k.getValueOfPoint(np.array([1, 0.8, 1.5]), 2)) \ No newline at end of file diff --git a/point.py b/point.py new file mode 100644 index 0000000..3aa7245 --- /dev/null +++ b/point.py @@ -0,0 +1,15 @@ +import numpy as np + +class Point: + def __init__(self, coord, value): + self.coord = coord + self.value = value + + def setvalue(self, value): + self.value = value + + def getDist(self, point): + return np.linalg.norm(self.coord - point.coord) + + def getDistFromCoord(self, coord): + return np.linalg.norm(self.coord - coord)