Brute Force Nearest-Neighbor Kernel
\(X \sim U[0, 1]\)
\(\epsilon \sim N(0, 1/3)\)
\(Y = \sin(4X) + \epsilon\)
# X ~ U[0, 1]
X <- runif(100, min = 0, max = 1)
# eps ~ N(0, 1/3)
eps <- rnorm(100, mean = 0, sd = sqrt(1/3))
# Y random variable
f <- function(X, eps) {
sin(4*X) + eps
}
Y <- f(X, eps)
plot(X, Y, pch=19, col="blue")

\(f_{knn}\) Approximation to \(f\) with Nearest-Neighbor Running-Mean Smoother
# Example elementwise substraction
# > X <- c(1, 2, 3, 4)
# > x <- 2
# > X - x
distances <- function(x, X) {
return(abs(X - x))
}
# Example for sort index.return
# > u <- c(3, 5, 2, 7, 1, 8)
# > sort(u, index.return = TRUE)$ix
# [1] 5 3 1 2 4 6
# > sort(u, index.return = TRUE)$ix[1:3]
# [1] 5 3 1
k_smallest_elements <- function(d, k) {
return(sort(d, index.return = TRUE)$ix[1:k])
}
# kNN
k_nearest_neighbors_indices <- function(x, k, X) {
return(k_smallest_elements(distances(x, X), k))
}
f_knn <- function(x, k, X, Y) {
Y_knn <- numeric(length=length(x))
for (i in 1:length(x)) {
knn_idxs <- k_nearest_neighbors_indices(x[i], k, X)
Y_knn[i] <- mean(Y[knn_idxs])
}
return(Y_knn)
}
x <- seq(0, 1, by = 0.01)
k <- 30
plot(X, Y, col="blue", pch=19)
lines(x, f_knn(x, k, X, Y), col="green", lwd=2)

LS0tCnRpdGxlOiAiTWFjaGluZSBMZWFybmluZyBLZXJuZWxzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiAiQ3Jpc3RhIE1vcmVubyIKLS0tCgojIyBCcnV0ZSBGb3JjZSBOZWFyZXN0LU5laWdoYm9yIEtlcm5lbCAKCi0tLS0tLS0tLS0tLS0tLS0tLQoKPCEtLSBQYWdlIDE5MiBvZiAqVGhlIEVsZW1lbnRzIG9mIFN0YXRpc3RpY2FsIExlYXJuaW5nKiAgLS0+CgokWCBcc2ltIFVbMCwgMV0kCgokXGVwc2lsb24gXHNpbSBOKDAsIDEvMykkCgokWSA9IFxzaW4oNFgpICsgXGVwc2lsb24kCgpgYGB7ciwgZWNobz1UUlVFIH0KIyBYIH4gVVswLCAxXQpYIDwtIHJ1bmlmKDEwMCwgbWluID0gMCwgbWF4ID0gMSkKCiMgZXBzIH4gTigwLCAxLzMpCmVwcyA8LSBybm9ybSgxMDAsIG1lYW4gPSAwLCBzZCA9IHNxcnQoMS8zKSkKICAKIyBZIHJhbmRvbSB2YXJpYWJsZQpmIDwtIGZ1bmN0aW9uKFgsIGVwcykgewogIHNpbig0KlgpICsgZXBzCn0KYGBgCgpgYGB7cn0KWSA8LSBmKFgsIGVwcykKcGxvdChYLCBZLCBwY2g9MTksIGNvbD0iYmx1ZSIpCmBgYAoKCiRmX3trbm59JCBBcHByb3hpbWF0aW9uIHRvICRmJCB3aXRoIE5lYXJlc3QtTmVpZ2hib3IgUnVubmluZy1NZWFuIFNtb290aGVyCgpgYGB7cn0KIyBFeGFtcGxlIGVsZW1lbnR3aXNlIHN1YnN0cmFjdGlvbgojID4gWCA8LSBjKDEsIDIsIDMsIDQpCiMgPiB4IDwtIDIKIyA+IFggLSB4CmRpc3RhbmNlcyA8LSBmdW5jdGlvbih4LCBYKSB7CiAgcmV0dXJuKGFicyhYIC0geCkpCn0KCiMgRXhhbXBsZSBmb3Igc29ydCBpbmRleC5yZXR1cm4KIyA+IHUgPC0gYygzLCA1LCAyLCA3LCAxLCA4KQojID4gc29ydCh1LCBpbmRleC5yZXR1cm4gPSBUUlVFKSRpeAojIFsxXSA1IDMgMSAyIDQgNgojID4gc29ydCh1LCBpbmRleC5yZXR1cm4gPSBUUlVFKSRpeFsxOjNdCiMgWzFdIDUgMyAxCmtfc21hbGxlc3RfZWxlbWVudHMgPC0gZnVuY3Rpb24oZCwgaykgewogIHJldHVybihzb3J0KGQsIGluZGV4LnJldHVybiA9IFRSVUUpJGl4WzE6a10pCn0KCiMga05OIAprX25lYXJlc3RfbmVpZ2hib3JzX2luZGljZXMgPC0gZnVuY3Rpb24oeCwgaywgWCkgewogIHJldHVybihrX3NtYWxsZXN0X2VsZW1lbnRzKGRpc3RhbmNlcyh4LCBYKSwgaykpCn0KCmZfa25uIDwtIGZ1bmN0aW9uKHgsIGssIFgsIFkpIHsKICBZX2tubiA8LSBudW1lcmljKGxlbmd0aD1sZW5ndGgoeCkpCiAgZm9yIChpIGluIDE6bGVuZ3RoKHgpKSB7CiAgICBrbm5faWR4cyA8LSBrX25lYXJlc3RfbmVpZ2hib3JzX2luZGljZXMoeFtpXSwgaywgWCkKICAgIFlfa25uW2ldIDwtIG1lYW4oWVtrbm5faWR4c10pCiAgfQogIHJldHVybihZX2tubikKfQoKeCA8LSBzZXEoMCwgMSwgYnkgPSAwLjAxKQprIDwtIDMwCnBsb3QoWCwgWSwgY29sPSJibHVlIiwgcGNoPTE5KQpsaW5lcyh4LCBmX2tubih4LCBrLCBYLCBZKSwgY29sPSJncmVlbiIsIGx3ZD0yKQpgYGAK