在R中如何将测试数据投影到已训练的NMF模型获取分量?
在R的NMF包中投影测试数据到已训练模型
你可以直接使用NMF包的predict()函数完成测试数据的投影,也可以通过手动固定训练得到的基分量来求解,以下是具体实现步骤:
方法1:使用predict()函数(推荐)
NMF包内置的predict.nmf()方法可以直接将新数据投影到已训练模型上,自动匹配训练时的基分量并求解测试数据对应的系数/基矩阵。
基于你的代码,添加投影测试数据的步骤:
library(NMF) set.seed(123) # 生成合成数据 train_data <- matrix(runif(1000, 0, 1), nrow = 50, ncol = 20) # 50样本×20特征 test_data <- matrix(runif(400, 0, 1), nrow = 20, ncol = 20) # 20样本×20特征 # 训练NMF模型 rank <- 3 res_nmf_train <- NMF::nmf(train_data + 0.0001, rank, nrun = 10, seed = 123456) # 提取训练集的基分量(W)和系数矩阵(H) W_train <- basis(res_nmf_train) H_train <- coef(res_nmf_train) # 投影测试数据,获取测试样本对应的W分量(样本×rank) W_test <- predict(res_nmf_train, newdata = test_data, type = "W")
参数说明
type = "W":表示固定训练得到的H矩阵,求解测试数据对应的W分量(即你需要的测试集基值);如果需要固定W求解测试数据的H,可以设置type = "H"(需注意数据维度匹配)。
方法2:手动求解非负最小二乘
如果需要更灵活的控制,可以固定训练得到的H矩阵,通过非负最小二乘求解测试数据的W分量:
# 手动投影:固定H_train,仅求解测试数据的W res_nmf_test <- nmf(test_data, rank = rank, init = list(H = H_train), method = "ls-nn", nrun = 1) W_test_manual <- basis(res_nmf_test)
这里使用method = "ls-nn"指定非负最小二乘算法,init = list(H = H_train)固定训练得到的H矩阵,确保求解的W_test和训练模型的空间一致。
后续分类验证步骤
基于你的目标,用训练集的W_train训练分类器,再用W_test预测类别,示例如下(以随机森林为例):
# 生成训练集类别标签(实际场景替换为真实标签) train_labels <- sample(c("Class1", "Class2"), nrow(train_data), replace = TRUE) # 加载分类器包 library(randomForest) # 用W_train训练分类器 rf_classifier <- randomForest(x = W_train, y = train_labels, ntree = 100) # 用W_test预测测试集类别 test_predictions <- predict(rf_classifier, newdata = W_test) # 查看预测结果 print(test_predictions)
注意事项
- 确保测试数据的特征数与训练数据完全一致,否则无法完成投影;
- 如果训练前对数据做了非负预处理(如归一化),测试数据必须执行相同的预处理步骤;
- NMF要求输入数据非负,若测试数据存在负值,需先做转换(如加偏移量,像你训练时的
train_data + 0.0001)。
内容的提问来源于stack exchange,提问作者Myriad
相关产品推荐
相关产品推荐

