问题
令 K >= 2 且 d >= 3。我有一个维度为 的 3 维数组c(K,K-1,d)。
例如,如果 K = d = 3,
A <- array(1:18,dim = c(3,2,3))。
现在我想通过选择沿第一维的索引来获得 (K-1) xd 矩阵,例如
M <- A[1,,]。
如果 K > 2 则工作正常。但如果 K = 2,则第二个维度为 1,R 的默认行为是删除它。因此,以下代码将返回长度为 d 的向量而不是矩阵。
K <- 2
d <- 3
A <- array(1:6,dim = c(K,K-1,d))
A[1,,]
Run Code Online (Sandbox Code Playgroud)
我需要一个矩阵,因为我想做一个矩阵乘积。
我尝试过的
通过使用该选项,可以强制 R 不删除维度drop。
M <- A[1,,,drop = FALSE]
dim(M)
Run Code Online (Sandbox Code Playgroud)
但这会返回一个 3 维数组,因为第一个维度也没有被删除。
我也尝试使用as.matrix。
M <- as.matrix(A[1,,]) …Run Code Online (Sandbox Code Playgroud) 我想对 LASSO 算法执行惩罚选择并使用 预测结果tidymodels。我将使用波士顿住房数据集来说明这个问题。
library(tidymodels)
library(tidyverse)
library(mlbench)
data("BostonHousing")
dt <- BostonHousing
Run Code Online (Sandbox Code Playgroud)
我首先将数据集分成训练/测试子集。
dt_split <- initial_split(dt)
dt_train <- training(dt_split)
dt_test <- testing(dt_split)
Run Code Online (Sandbox Code Playgroud)
使用recipe包定义预处理。
rec <- recipe(medv ~ ., data = dt_train) %>%
step_center(all_predictors(), -all_nominal()) %>%
step_dummy(all_nominal()) %>%
prep()
Run Code Online (Sandbox Code Playgroud)
模型和工作流程的初始化。我用的是glmnet发动机。mixture = 1意味着我选择 LASSO 惩罚,并且penalty = tune()意味着我稍后将使用交叉验证来选择最佳惩罚参数lambda。
lasso_mod <- linear_reg(mode = "regression",
penalty = tune(),
mixture = 1) %>%
set_engine("glmnet")
wf <- workflow() %>%
add_model(lasso_mod) %>%
add_recipe(rec)
Run Code Online (Sandbox Code Playgroud)
准备分层5折交叉验证和惩罚网格:
folds <- rsample::vfold_cv(dt_train, …Run Code Online (Sandbox Code Playgroud)