def _median(x, inplace): assert(x.ndim == 1) n = x.shape[0] if n > 3: k = n >> 1 s = select(x, k, inplace=inplace) if n & 1: return s[k] else: return 0.5*(s[k]+s[:k].max()) elif n == 0: return np.nan elif n == 2: return 0.5*(x[0]+x[1]) else: # n == 3 s = select(x, 1, inplace=inplace) return s[1]
def pred_knn(self, sample): distances = [euclidean(x, sample) for x in self.X_train] tmp_dst = distances[:] k_smallest = q.select(tmp_dst, 0, len(tmp_dst) - 1, self.k) labels = [ self.Y_train[i] for i, dist in enumerate(distances) if dist < k_smallest ] return max(set(labels), key=labels.count)
def predict(self, X_test): predictions = [] for sample in X_test: distances = [euclidean(x, sample) for x in self.X_train] # indices = np.array(distances).argsort()[:self.k] # labels = [Y_train[index] for index in indices] tmp_dst = distances[:] k_smallest = q.select(tmp_dst, 0, len(tmp_dst) - 1, self.k) labels = [ self.Y_train[i] for i, dist in enumerate(distances) if dist < k_smallest ] predictions.append(max(set(labels), key=labels.count)) return predictions
def partition(self, points, start, end, cutdim, minx, miny, maxx, maxy): n = kdnode(); n.st = start; n.end = end; n.minx = minx; n.miny = miny; n.width = maxx-minx; n.height = maxy-miny; if ( cutdim >= 2 ): cutdim = 0; if ( (end-start) > self.maxbinsz ): med = select(points, int( (start+end)/2 )-start, cutdim, start, end-1); n.dim = cutdim; n.val = med; ## Plotting ## s = [minx, miny]; e = [maxx, maxy]; s[n.dim] = n.val[n.dim]; e[n.dim] = n.val[n.dim]; plt.plot([s[0], e[0]], [s[1], e[1]]); self.fig.canvas.draw(); self.fig.canvas.flush_events(); plt.show(); if self.stepmode: a = input("Press Enter to step or c to continue:") if a == 'c': self.stepmode = False print("finishing...") else: time.sleep(self.timer); ## -------- ## mid = int( (start+end)/2 ); if (cutdim == 0): n.lessChild = self.partition(points, start, mid, cutdim+1, minx, miny, e[0], maxy); n.greaterChild = self.partition(points, mid, end, cutdim+1, s[0], miny, maxx, maxy); elif (cutdim == 1): n.lessChild = self.partition(points, start, mid, cutdim+1, minx, miny, maxx, e[1]); n.greaterChild = self.partition(points, mid, end, cutdim+1, minx, s[1], maxx, maxy); return n;