使用插入符号找到最近的邻居

时间:2019-07-19 04:15:12

标签: r machine-learning knn caret

我正在使用R的[:link {:rel "stylesheet" :href "https://unpkg.com/leaflet@1.5.1/dist/leaflet.css" :integrity "sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" :crossorigin ""}]] 包拟合k最近邻模型。

caret

我留下一个观察值作为测试数据,并使用训练数据拟合模型。

library(caret)

set.seed(0)
y = rnorm(20, 100, 15)
predictors = matrix(rnorm(80, 10, 5), ncol=4)
data = data.frame(cbind(y, predictors))
colnames(data)=c('Price', 'Distance', 'Cost', 'Tax', 'Transport')

当我显示id = sample(nrow(data)-1) train = data[id, ] test = data[-id,] knn.model = train(Price~., method='knn', train) predict(knn.model, test) 时,它告诉我它使用了knn.model。我想知道哪9个观察实际上是测试观察的“最近”。除了手动计算距离之外,还有没有更简单的方法来显示最近的邻居?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用knn时,将基于自变量创建点附近的聚类。通常,这是使用train(Price~., method='knn', train)完成的,因此该模型会根据某些标准(同时还要考虑因变量)选择最佳预测。考虑到我尚未检查R对象是否存储每个训练值的预测价格的事实,我只是使用训练过的模型来预测给定模型的预期价格(预期价格位于空间中)。

最后,因变量只是公共空间中所有其他变量的表示,在此假设关联的价格是相似的,因为您是基于接近性进行聚类的。 作为步骤的摘要,您需要计算以下内容:

  1. 获取每个训练数据点的距离。这是通过对它们进行预测来完成的。
  2. 计算训练数据与您感兴趣的观察之间的距离(以绝对值表示,因为您并不关心符号,而仅关心绝对距离)。
  3. 取N个较小索引的索引(例如N = 9)。您可以获得观测值并且与该较低距离相关。

    TestPred<-predict(knn.model, newdata = test)
    TrainPred<-predict(knn.model, train)
    
    Nearest9neighbors<-order(abs(TestPred-TrainPred))[1:9]
    
    train[Nearest9neighbors,]
         Price    Distance      Cost       Tax Transport
    15  95.51177 13.633754  9.725613 13.320678 12.981295
    7   86.07149 15.428847  2.181090  2.874508 14.984934
    19 106.53525 16.191521 -1.119501  5.439658 11.145098
    2   95.10650 11.886978 12.803730  9.944773 16.270416
    4  119.08644 14.020948  5.839784  9.420873  8.902422
    9   99.91349  3.577003 14.160236 11.242063 16.280094
    18  86.62118  7.852434  9.136882  9.411232 17.279942
    11 111.45390  8.821467 11.330687 10.095782 16.496562
    17 103.78335 14.960802 13.091216 10.718857  8.589131