从KKNN包中查找最近的邻居名称

时间:2013-09-09 17:48:17

标签: r regression nearest-neighbor indices

我一直在尝试构建这个程序,或者找出如何访问KKNN所做的事情以产生结果。我正在使用KKNN功能和包来帮助预测未来的棒球统计数据。它包含11个预测变量(前3年的统计数据,PA和水平,以及年龄和另一个预测变量)。预测效果很好,但我希望做的是当我只预测一名球员时(因为这对于预测100名球员来说这将是荒谬的),我希望看到可能与该球员最近的3个邻居以及他们之前的球员他们明年生产的数据。我最关心的是最近邻居的名字,因为知道哪个玩家最接近会给出它所做出的预测的背景。

我可以尝试编辑实际代码到函数中,如果这是获取这些代码的唯一方法。即使找到指数也会有所帮助,因为我可以从那里反向得到名称。非常感谢你的帮助!

以下是一些应该有用的示例代码:

name=c("McGwire,Mark","Bonds,Barry","Helton,Todd","Walker,Larry","Pujols,Albert","Pedroia,Dustin")
z
lag1=c(100,90,75,89,95,70)
lag2=c(120,80,95,79,92,90)
Runs=c(65,120,105,99,65,100)
full=cbind(name,lag1,lag2,Runs)
full=data.frame(full)
learn=full
learn
learn$lag1=as.numeric(as.character(learn$lag1))
learn$lag2=as.numeric(as.character(learn$lag2))
learn$Runs=as.numeric(as.character(learn$Runs))
valid=learn[5,]
learn=learn[-5,]
valid

k=kknn(Runs~lag1+lag2,learn,valid,k=2,distance=1)
summary(k)
fit=fitted(k)
fit

这是我实际调用的函数,如果这可以帮助您定制解决方法的解决方法!

kknn(RVPA~(lag1*lag1LVL*lag1PA)+(lag2*lag2LVL*lag2PA)+(lag3*lag3LVL*lag3PA)+Age1‌​+PAsize, RV.learn, RV.valid,k=86, distance = 1,kernel = "optimal") 

1 个答案:

答案 0 :(得分:1)

以下是您示例的略微修改版本:

full= data.frame(
name=c("McGwire,Mark","Bonds,Barry","Helton,Todd","Walker,Larry","Pujols,Albert","Pedroia,Dustin"),
lag1=c(100,90,75,89,95,70),
lag2=c(120,80,95,79,92,90),
Runs=c(65,120,105,99,65,100)
)

library(kknn)
train=full[full$name!="Bonds,Barry",]
test=full[full$name=="Bonds,Barry",]
k=kknn(Runs~lag1+lag2,train=train, test=test,k=2,distance=1)

预计Bonds将有80.2次运行。 Runs变量就像一个类标签,如果你调用k$CL,你将得到65和99(对应于两个最近邻居的运行次数)。有两名球员(McGwire,Pujols)有65次跑步,一次有99次,所以你无法直接判断邻居是谁。似乎kknn的输出不包括测试集的最近邻居列表(尽管您可以从各种输出中将其退出)。

然而,FNN包会让您以您希望的方式对您的培训数据进行查询:

library(FNN)
get.knnx(data=train[,c("lag1","lag2")], query=test[,c("lag1","lag2")],k=2)
$nn.index
 [,1] [,2]
[1,]    3    4

$nn.dist
     [,1] [,2]
[1,] 1.414214   13

train[c(3,4),"name"]
[1] Walker,Larry  Pujols,Albert

所以最接近邦德的邻居是Pujols和Walker。