Как найти строку в кадре данных, которая наиболее близко напоминает данный вектор - PullRequest
0 голосов
/ 12 мая 2019

Скажем, у меня есть кадр данных, который выглядит следующим образом:

Feature 1     Feature 2     Feature 3     Feature 4     Target
    1             1             1             1            a
    0             1             0             0            a 
    0             1             1             1            b

И вектор, который выглядит так:

0, 1, 1, 1

Как мне найти индексы ближайших совпадающих строк к вектору? Например, если бы я хотел найти 2 самые близкие строки, я бы ввел вектор и фрейм данных (возможно, с удаленным целевым столбцом), и я бы получил индексы 1 и 3 в качестве возврата из функции, поскольку эти строки наиболее близко напоминают вектор "0, 1, 1, 1".

Я попытался использовать пакет "caret" из R с командой:

intrain <- createDataPartition(y = data$Target, p= 0.7, list = FALSE)
training <- data[intrain,]
testing <- data[-intrain,]

trctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 3)
knn_fit <- train(Target~., data = training, method = "knn", trControl = trctrl, preProcess = c("center", "scale"), tuneLength = 10)
test_pred <- predict(knn_fit, newdata = testing)
print(test_pred)

Однако, это не возвращает индекс соответствующих строк. Он просто возвращает прогнозы для цели, функции которой наиболее точно соответствуют тестовому набору данных.

Я хотел бы найти модель / команду / функцию, которая может работать аналогично модели KDtrees из sklearn в python, но вместо этого в R (KDtrees может вернуть список из n ближайших индексов). Кроме того, хотя это и не обязательно, я бы хотел, чтобы указанная модель работала с категориальными значениями для объектов (например, ИСТИНА / ЛОЖЬ), чтобы мне не приходилось создавать фиктивные переменные, как я делал здесь со своими 1 и 0.

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Согласен с 42 комментарием.С простой метрикой расстояния строка 1 в равной степени отличается от вектора как 2.

# your data
featureframe <- data.frame(Feature1 = c(1,0,0), Feature2 = c(1,1,1), 
                           Feature3 = c(1,0,1), Feature4 = c(1,1,1), 
                           Target = c("a","a","b"))
vec <- c(0,1,1,1)

distances <- apply(featureframe[,1:4], 1, function(x) sum((x - vec)^2))
distances
# [1] 1 1 0

Редактирует в соответствии с комментариями:

Чтобы измерить категорически, что вы похоживместо этого можно количественно определить метрику сходства, где чем ближе сумма к длине вектора, тем ближе эти два вектора:

similarity <- apply(featureframe[,1:4], 1, function(x) sum(x == vec))

Если вы хотите взвесить определенные элементыболее того, вы можете умножить вектор подобия внутри функции на весовой вектор равной длины.

similarity <- apply(featureframe[,1:4], 1, function(x) sum((x == vec) * c(1,2,1,1)))

0 голосов
/ 12 мая 2019

Чтобы найти наименьшее расстояние между векторами, вы можете создать матрицу расстояний:

mat <- matrix(c(1,1,1,1
                0,1,0,0,
                0,1,1,1,
                0,1,1,1), 
              ncol = 4, byrow = T)
#the following will find the euclidean distance between each row vector
dist(mat, method = "euclidean")
         1        2        3
2 1.732051                  
3 1.000000 1.414214         
4 1.000000 1.414214 0.000000

Очевидно, что минимум находится здесь между строками 3 и 4, поскольку они идентичны

...