import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsRegressor from sklearn.metrics import euclidean_distances from .datasets import make_wave from .plot_helpers import cm3 def plot_knn_regression(n_neighbors=1): X, y = make_wave(n_samples=40) X_test = np.array([[-1.5], [0.9], [1.5]]) dist = euclidean_distances(X, X_test) closest = np.argsort(dist, axis=0) plt.figure(figsize=(10, 6)) reg = KNeighborsRegressor(n_neighbors=n_neighbors).fit(X, y) y_pred = reg.predict(X_test) for x, y_, neighbors in zip(X_test, y_pred, closest.T): for neighbor in neighbors[:n_neighbors]: plt.arrow(x[0], y_, X[neighbor, 0] - x[0], y[neighbor] - y_, head_width=0, fc='k', ec='k') train, = plt.plot(X, y, 'o', c=cm3(0)) test, = plt.plot(X_test, -3 * np.ones(len(X_test)), '*', c=cm3(2), markersize=20) pred, = plt.plot(X_test, y_pred, '*', c=cm3(0), markersize=20) plt.vlines(X_test, -3.1, 3.1, linestyle="--") plt.legend([train, test, pred], ["training data/target", "test data", "test prediction"], ncol=3, loc=(.1, 1.025)) plt.ylim(-3.1, 3.1) plt.xlabel("Feature") plt.ylabel("Target")