如何在数据框中找到最接近给定向量的行

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

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

如何找到与该向量最匹配的行的索引?例如,如果我想找到最接近的两行,我会输入向量和数据框(可能去掉目标列),然后函数会返回索引1和3,因为这两行最接近向量“0, 1, 1, 1”。

我尝试使用R语言的“caret”包,命令如下:

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行一样大。

# 你的数据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)))

Related Posts

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注