2013-09-09 7 views
1

Я пытался создать эту программу или узнать, как получить доступ к тому, что делает KKNN для получения своих результатов. Я использую функцию и пакет KKNN, чтобы помочь предсказать будущую статистику бейсбола. Он принимает 11 переменных предиктора (предыдущие 3 года статистики, PA и уровень, а также возраст и другой предиктор). Прогнозы работают отлично, но я надеюсь, что когда я предскажу только одного игрока (так как это было бы смешно, если предсказывать 100 игроков), я хотел бы видеть, возможно, 3 ближайших соседей к игроку, о котором идет речь, и их предыдущие статистика с тем, что они произвели в следующем году. Меня больше всего интересует имя ближайших соседей, поскольку знание того, кто из игроков ближе всего, даст контекст предсказанию, которое он делает.Найти имена ближайших соседей из пакета KKNN

Я в порядке с попыткой редактировать фактический код функции, если это единственный способ получить от них. Даже обнаружение индексов было бы полезно, поскольку я мог бы вернуться оттуда, чтобы получить имена. Большое вам спасибо за вашу помощь!

Ниже приведен пример кода, который должен помочь:

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

Вот слегка измененная версия вашего примера:

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) 

Это предсказывает облигации иметь 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 и Уокер.

+0

Интересно, спасибо, что нашли время ответить! В моем полном наборе данных я использую «оптимальное» ядро ​​для kknn. Есть ли способ заставить FNN использовать тот же самый ядро, что и kknn, чтобы гарантировать, что они используют одни и те же соседи? Это похоже на отличный ответ, хотя так спасибо! Целью познания, которые являются ближайшими соседями, является предоставление контекста предсказанию. Кроме того, я мог бы использовать 40 ближайших соседей и их тренды, чтобы придумать какой-то прорыв/сбой/улучшение/процент регрессии на основе их статистики, если это имеет смысл! – BaseballR

+0

Это то, что я на самом деле вызываю в своей реальной функции, поскольку мне нужно попытаться построить get.knnx, чтобы соответствовать этому, как бы я это сделал? kknn (RVPA ~ (lag1 * lag1LVL * lag1PA) + (lag2 * lag2LVL * lag2PA) + (lag3 * lag3LVL * lag3PA) + Age1 + PAsize, RV.learn, RV.valid, k = 86, distance = 1, kernel = "оптимальный") – BaseballR