@@ -49,6 +49,7 @@ def _knn_flann(X, num_neighbors, dist_type, order):
49
49
# do not allow it
50
50
if dist_type == 'max_dist' :
51
51
raise ValueError ('FLANN and max_dist is not supported' )
52
+
52
53
pfl = _import_pfl ()
53
54
pfl .set_distance_type (dist_type , order = order )
54
55
flann = pfl .FLANN ()
@@ -58,6 +59,8 @@ def _knn_flann(X, num_neighbors, dist_type, order):
58
59
# seems to work best).
59
60
NN , D = flann .nn (X , X , num_neighbors = (num_neighbors + 1 ),
60
61
algorithm = 'kdtree' )
62
+ if dist_type == 'euclidean' : # flann returns squared distances
63
+ return NN , np .sqrt (D )
61
64
return NN , D
62
65
63
66
def _radius_sp_kdtree (X , epsilon , dist_type , order = 0 ):
@@ -86,8 +89,9 @@ def _radius_sp_pdist(X, epsilon, dist_type, order):
86
89
NN = []
87
90
for k in range (N ):
88
91
v = pd [k , pdf [k , :]]
92
+ d = pd [k , :].argsort ()
89
93
# use the same conventions as in scipy.distance.kdtree
90
- NN .append (v . argsort () )
94
+ NN .append (d [ 0 : len ( v )] )
91
95
D .append (np .sort (v ))
92
96
93
97
return NN , D
@@ -98,21 +102,32 @@ def _radius_flann(X, epsilon, dist_type, order=0):
98
102
# do not allow it
99
103
if dist_type == 'max_dist' :
100
104
raise ValueError ('FLANN and max_dist is not supported' )
101
-
102
105
pfl = _import_pfl ()
106
+
103
107
pfl .set_distance_type (dist_type , order = order )
104
108
flann = pfl .FLANN ()
105
109
flann .build_index (X )
106
110
107
111
D = []
108
112
NN = []
109
113
for k in range (N ):
110
- nn , d = flann .nn_radius (X [k , :], epsilon )
114
+ nn , d = flann .nn_radius (X [k , :], epsilon * epsilon )
111
115
D .append (d )
112
116
NN .append (nn )
113
117
flann .delete_index ()
118
+ if dist_type == 'euclidean' : # flann returns squared distances
119
+ return NN , np .sqrt (D )
114
120
return NN , D
115
121
122
+ def center_input (X , N ):
123
+ return X - np .kron (np .ones ((N , 1 )), np .mean (X , axis = 0 ))
124
+
125
+ def rescale_input (X , N , d ):
126
+ bounding_radius = 0.5 * np .linalg .norm (np .amax (X , axis = 0 ) -
127
+ np .amin (X , axis = 0 ), 2 )
128
+ scale = np .power (N , 1. / float (min (d , 3 ))) / 10.
129
+ return X * scale / bounding_radius
130
+
116
131
class NNGraph (Graph ):
117
132
r"""Nearest-neighbor graph from given point cloud.
118
133
@@ -207,14 +222,10 @@ def __init__(self, Xin, NNtype='knn', backend='scipy-kdtree', center=True,
207
222
Xout = self .Xin
208
223
209
224
if self .center :
210
- Xout = self .Xin - np .kron (np .ones ((N , 1 )),
211
- np .mean (self .Xin , axis = 0 ))
225
+ Xout = center_input (Xout , N )
212
226
213
227
if self .rescale :
214
- bounding_radius = 0.5 * np .linalg .norm (np .amax (Xout , axis = 0 ) -
215
- np .amin (Xout , axis = 0 ), 2 )
216
- scale = np .power (N , 1. / float (min (d , 3 ))) / 10.
217
- Xout *= scale / bounding_radius
228
+ Xout = rescale_input (Xout , N , d )
218
229
219
230
220
231
0 commit comments