Я пытаюсь написать свою собственную функцию KNN. Я не использую встроенную функцию в R, потому что я хочу использовать разные расстояния (нормы, такие как L_0.1) вместо евклидова расстояния. Кроме того, я хотел бы использовать LOOCV для разделения набора данных. Ранее я разделял свои данные, как показано в приведенном ниже коде, и все идет хорошо. Но мне нужно использовать LOOCV.
wdbc<- read.table("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data",sep=",",stringsAsFactors = FALSE)
wdbc<-wdbc[-1]
normalize <- function(x) {
return ((x-min(x)) / (max(x) - min(x)))}
wdbc_n <- as.data.frame(lapply(wdbc[2:31], normalize))
wdbc_train<-wdbc_n[1:568,]
wdbc_test<-wdbc_n[569:569,]
Я также попытался написать код LOOCV.
LOOOCV_training=list()
for(i in 1:nrow(wdbc_n)){
LOOOCV_training[[i]]=wdbc_n[-i,]}
View(LOOOCV_training)
LOOOCV_testing=list()
for(i in 1:nrow(wdbc_n)){
LOOOCV_testing[[i]]=wdbc_n[i,]}
Мои вопросы
Как поставить разделение LOOCV вместо разделения, которое я делал раньше?
Другими словами, я использовал некоторые коды, такие как Dist=matrix(0,nrow=nrow(wdbc_train),ncol=nrow(wdbc_test))
Было легко справиться с первым разделением, которое я делал раньше, но теперь я не уверен из-за LOOCV, обучите модель на всех тренировочных наборах, кроме одного тестового набора, и повторите этот процесс n раз. Размер моих данных - 569 32, что означает непростое выполнение процесса один за другим.
Кроме того, как рассчитать матрицу смешения с LOOCV, так как LOOCV повторял процесс много раз, что означает, что у меня будет много матриц смешения !!
EDIT
Для большей ясности предположим, что вместо этого я хочу использовать LOOCV split в следующем коде (предыдущие коды).
Dist=matrix(0,nrow=nrow(wdbc_train),ncol=nrow(wdbc_test))
Dist2=array(0,nrow(wdbc_test))
for (i in 1:nrow(wdbc_train)){
for (j in 1:nrow(wdbc_test)){
Dist[i,j]=norm(as.matrix(wdbc_train[i,]-wdbc_test[j,]),type="i")}}