basierend auf Ihre Kommentare aktualisiert
Ich sehe keine Funktion, die die Indizes der nächsten Nachbarn in den Zugdaten bezüglich des DPREP-Pakets zurückgibt (hoffentlich verpasse ich nichts). Sie können jedoch zuerst eine Entfernungsmatrix mit der Entfernungsmatrix berechnen (FD Paket) und diese Matrix dann an eine k-nächste-Nachbarn-Funktion übergeben (das KernelKnn Paket akzeptiert eine Abstandsmatrix als Eingabe). Wenn Sie sich für die Verwendung des KernelKnn-Pakets entscheiden, installieren Sie zuerst die neueste Version mit devtools :: install_github ('mlampros/KernelKnn').
# train-data [ "col3" is the response variable, 'stringsAsFactors' by default ]
df1 <- data.frame(col1 = c("a","d","f"), col2 = c(1,3,2), col3 = c("T","F","T"), stringsAsFactors = T)
# test-data
tst1 <- data.frame(col1 = c("f"), col2 = c(2), stringsAsFactors = T)
# rbind train and test data (remove the response variable from df1)
df_all = rbind(df1[, -3], tst1)
# calculate distance matrix
dist_gower = as.matrix(FD::gowdis(df_all))
# use the dist_gower distance matrix as input to the 'distMat.knn.index.dist' function
# additionaly specify which row-index is the test-data observation from the previously 'df_all' data.frame using the 'TEST_indices' parameter
idxs = KernelKnn::distMat.knn.index.dist(dist_gower, TEST_indices = c(4), k = 2, threads = 1, minimize = T)
idxs $ test_knn_idx gibt die k-nearest-Nachbarn der Testdaten Beobachtung in den Zugdaten
print(idxs)
$test_knn_idx
[,1] [,2]
[1,] 3 1
$test_knn_dist
[,1] [,2]
[1,] 0 0.75
, wenn Sie auch die Wahrscheinlichkeit für die Klasse Etiketten wollen, dann konvertieren zuerst Zahlen- und dann verwenden, um die distMat.KernelKnn Funktion
y_numeric = as.numeric(df1$col3)
labels = KernelKnn::distMat.KernelKnn(dist_gower, TEST_indices = c(4), y = y_numeric, k = 2, regression = F, threads = 1, Levels = sort(unique(y_numeric)), minimize = T)
print(labels)
class_1 class_2
[1,] 0 1
# class_2 corresponds to "T" from col3 (df1 data.frame)
Sie Alternativ einen Blick auf die dprep nehmen könnte :: knngow und vor allem den zweiten Teil der Funktion, die tatsächlich ist das, was Sie interessiert sind,
> print(dprep::knngow)
....
else {
for (i in 1:ntest) {
tempo = order(StatMatch::gower.dist(test[i, -p], train[, -p]))[1:k]
classes[i] = moda(train[tempo, p])[1]
}
}
.....
Bitte helfen Sie mir. Ich brauche die Antwort auf diese Frage – maria