R 如何在数据帧中找到与给定向量最相似的行

R 如何在数据帧中找到与给定向量最相似的行,r,machine-learning,r-caret,nearest-neighbor,R,Machine Learning,R Caret,Nearest Neighbor,假设我有一个如下所示的数据帧: Feature 1 Feature 2 Feature 3 Feature 4 Target 1 1 1 1 a 0 1 0 0 a 0 1 1 1

假设我有一个如下所示的数据帧:

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
一个向量如下所示:

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最为相似

我已尝试使用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)
但是,这不会返回匹配行的索引。它只返回与测试数据集最匹配的特征的目标预测


我想找到一个模型/命令/函数,它可以在python中执行类似于sklearn中的KDtrees模型,但在R中,KDtrees可以返回n个最近索引的列表。此外,虽然不是必需的,但我希望所述模型能够处理诸如TRUE/FALSE等特性的分类值,这样我就不必像这里使用1和0那样创建虚拟变量。

同意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
根据评论进行编辑:

为了对相似性进行分类测量,您可以量化相似性度量,其中总和越接近向量的长度,两个向量就越接近:


相似性要找到向量之间的最小距离,可以制作一个距离矩阵:

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行之间,因为它们是相同的

定义最接近的。在本例中,只有第三行与编号特征的模式匹配。此外,在列名中使用空格表示您尚未进行任何实际的数据输入。baby R程序员的第一步。我有一个完整的数据集,但为了简单起见,我不想把它复制到这里。我的数据集有400个特性。这也是我在列名中加空格的原因。最好是通过某种带有默认或预定义限制的距离度量,但我不确定如何将其应用于诸如TRUE或FALSE之类的分类值。我希望更有经验的程序员能提供一些有见地的建议。这似乎适得其反。如果你不能构建一个新的模型,那么花点时间编写代码似乎是不值得的。我希望我给出的示例为我的目标提供了足够的上下文,因为我的实际数据集只是我给出的示例的一个更大的版本。我愿意回答更多的问题。这个例子中目标栏的意义是什么?我已经编辑了我的例子,使它更准确。我希望我给出的示例为我的目标提供了足够的上下文,因为我的实际数据集只是我给出的示例的一个更大的版本。我愿意回答更多的问题。你能给我一些关于向量计算距离哪里不符合你需要的信息吗?再想想,这非常接近我需要的。我将尝试解决我在使用代码时遇到的一个问题:如果我的目标是0,0,0,1,并且数据帧中有一行有1,0,0,0,该怎么办?您的代码会将这两个计算为相同的,尽管它们完全不同。这是一个非常公平的问题:从这个意义上说,我们可能希望使用相等值的计数,而不是使用距离。其中4等于完美匹配。距离