如何实现测试对象与所有训练对象的距离计算及批量自动存储?
嘿,我来帮你把这段代码扩展成能自动处理所有测试样本并存储结果的版本!
测试样本与训练样本的批量距离计算方案
首先先拆解下你现有的代码:你这段代码是针对wdbc_test的第一行数据,计算它和wdbc_train每一行的欧氏距离平方,结果存在矩阵n里:
n <- matrix( ) for (i in 1:nrow(wdbc_train)) { n[i] <- sum(abs(wdbc_train[i,]-wdbc_test[1,])^2) }
接下来我给你两种实用方案,帮你自动遍历所有测试样本并存储结果:
方法1:向量化操作(高效推荐)
R的矩阵运算天生支持向量化,不用写嵌套循环也能快速生成完整的距离矩阵:
# 生成距离矩阵:行=测试样本,列=训练样本,值为对应两者的欧氏距离平方 distance_matrix <- t(apply(wdbc_test, 1, function(test_row) { rowSums((wdbc_train - test_row)^2) })) # 结果说明:distance_matrix[1, ]就是你原来代码计算的结果,distance_matrix[i, j]代表第i个测试样本和第j个训练样本的距离平方
方法2:嵌套循环(逻辑直观)
如果你更习惯用循环的方式理解逻辑,嵌套循环可以清晰遍历每个测试样本:
# 先初始化空矩阵,行数对应测试样本数,列数对应训练样本数 distance_matrix <- matrix(nrow = nrow(wdbc_test), ncol = nrow(wdbc_train)) # 外层循环遍历每个测试样本 for (test_idx in 1:nrow(wdbc_test)) { # 内层循环遍历每个训练样本 for (train_idx in 1:nrow(wdbc_train)) { # 计算欧氏距离平方并存储 distance_matrix[test_idx, train_idx] <- sum((wdbc_train[train_idx, ] - wdbc_test[test_idx, ])^2) } }
额外小提示:
- 欧氏距离平方和欧氏距离的排序结果完全一致,如果是用于KNN这类只需要排序的算法,完全可以不用开平方,能节省不少计算资源
- 如果需要计算曼哈顿距离,只需要把代码里的
sum((...)^2)改成sum(abs(...))就可以啦
内容的提问来源于stack exchange,提问作者jeza
相关产品推荐
相关产品推荐

