分类与回归的区别:分类是判断对应类别而回归的输出是一个具体值。
KNN基本算法思路:一个样本在特征空间中k个最相似(最邻近)的样本大多数属于同一个类别。(物以类聚)
距离选取:euclidean,manhattan,minkonwski
K值可以基于方根误差(RMSE)确定,启发式的找到一个最优近邻数K。
R中的实用包(FNN)
实现案例
KNN回归在R中可以使用FNN::knn.reg实现,下面通过一个简单的例子说明,图中的黑色实心点表示样本观测值,红、天蓝、紫和蓝色曲线分别表示KNN(k=1,k=100,k=10)以及线性回归,经计算K=10时的RMSE为0.1035,而线性回归的RMSE为0.1055,因此KNN回归略优于线性回归,且从图中可以看出,KNN的拟合曲线更加灵活,能够包含更多的样本信息。
install.packages("FNN")
library(FNN)
x = runif(100,0,pi)#随机生成服从正态分布的100个随机数
e = rnorm(100,0,0.1)#随机生成100个随机数,均值是0,方差是0.1
y = sin(x)+e
grid2=data.frame(x)
knn1 = knn.reg(train = x, test = grid2, y = y, k = 1)
knn10 = knn.reg(train = x, test = grid2, y = y, k = 10)
knn100 = knn.reg(train = x, test = grid2, y = y, k = 100)
plot(x,y,type = 'n')
points(x,y,pch=16,col='black')
ORD = order(grid2$x)
lines(grid2$x[ORD],knn1$pred[ORD],lwd=2,col=5)
lines(grid2$x[ORD],knn100$pred[ORD],lwd=2,col=6)
lines(grid2$x[ORD],knn10$pred[ORD],lwd=2,col=2)
coe=coef(lm(y~x+I(x^2)))
lines(x[ORD],coe[1]+coe[2]*x[ORD]+coe[3]*x[ORD]^2,
lwd=2,col=4)
legend('topright',c('KNN回归(K=1)','KNN回归(K=100)',
'KNN回归(K=10)','线性回归'),bty='n',
lty=1,lwd=2,col=c(2,5,6,4))
结果图片如下:
来源:公众号 数萃大数据