Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# -*- coding: utf-8 -*- 

2""" 

3@file 

4@brief Implements classic k-nn. 

5""" 

6import numpy 

7import numpy.linalg 

8from scipy.spatial.distance import euclidean 

9 

10 

11class NuagePoints: 

12 """ 

13 Définit une classe de nuage de points. 

14 On suppose qu'ils sont définis par une matrice, 

15 chaque ligne est un élément. 

16 """ 

17 

18 def __init__(self): 

19 """ 

20 constructeur 

21 """ 

22 pass 

23 

24 def fit(self, X, y=None): 

25 """ 

26 Follows sklearn API. 

27 

28 @param X training set 

29 @param y labels 

30 """ 

31 self.nuage = X 

32 self.labels = y 

33 

34 def kneighbors(self, X, n_neighbors=1, return_distance=True): 

35 """ 

36 Return the k nearest neighbors. 

37 

38 @param X test set 

39 @param n_neighbors number of neighbors 

40 @param return_distance return distance as well 

41 @return array (dist), array (indices) 

42 """ 

43 if n_neighbors != 1: 

44 raise NotImplementedError( # pragma: no cover 

45 "Not implemented when n_neighbors != 1.") 

46 if not return_distance: 

47 raise NotImplementedError( # pragma: no cover 

48 "Not implemented when return_distance is False.") 

49 

50 dist = numpy.zeros(X.shape[0]) 

51 ind = numpy.zeros(X.shape[0], dtype=numpy.int64) 

52 

53 for i in range(X.shape[0]): 

54 row = X[i, :] 

55 row.resize((1, X.shape[1])) 

56 r = self.ppv(row) 

57 dist[i], ind[i] = r 

58 return dist, ind 

59 

60 @property 

61 def shape(self): 

62 """ 

63 Retourne la dimension du nuage. 

64 """ 

65 return self.nuage.shape 

66 

67 def distance(self, obj1, obj2): 

68 """ 

69 Retourne une distance entre deux éléments. 

70 

71 @param obj1 object 1 

72 @param obj2 object 2 

73 @return distance 

74 """ 

75 return euclidean(obj1, obj2) 

76 

77 def label(self, i): 

78 """ 

79 Retourne le label de l'object d'indice ``i``. 

80 

81 @param i indice 

82 @return label or None if there is no label 

83 """ 

84 return self.label[i] if self.label is not None else None 

85 

86 def ppv(self, obj): 

87 """ 

88 Retourne l'élément le plus proche de obj et sa distance avec obj. 

89 

90 @param obj object 

91 @return ``tuple(dist, index)`` 

92 """ 

93 ones = numpy.ones((self.nuage.shape[0], 1)) 

94 mat = ones @ obj 

95 if len(mat.shape) == 1: 

96 mat.resize((mat.shape[0], 1)) 

97 delta = self.nuage - mat 

98 norm = numpy.linalg.norm(delta, axis=1) 

99 i = numpy.argmin(norm) 

100 return norm[i], i