我已经从理论上了解了损失函数,并且还学习了如何在R语言中基于这些损失函数构建回归模型。
我可以应用基于不同损失函数的所有回归模型进行R编程,除了对数双曲余弦损失函数之外。
例如,我想在DATA数据集的5折子集上构建一个线性回归模型,然后提取系数并计算个体和聚合的方差,如下所示。
data = read.csv("train.csv") # "critical_temp" 是因变量。 data_nom_df=as.data.frame(scale(data))#标准化 #交叉验证set.seed(12345)k = 5 folds <- createFolds(data_nom_df$critical_temp, k = k, list = TRUE, returnTrain = TRUE)## 普通最小二乘回归#block Alm = list()for (i in 1:k) { lm[[i]] = lm(critical_temp~ ., data = data_nom_df[folds[[i]],])}#block Blm_coef = list()lm_coef_var = list()for(j in 1:(lm[[1]]$coefficients %>% length())){ for(i in 1:k){ lm_coef[[i]] = lm[[i]]$coefficients[j] lm_coef_var[[j]] = lm_coef %>% unlist() %>% var() } }#block Clm_var = unlist(lm_coef_var)lm_df = cbind(coefficients = lm[[1]]$coefficients %>% names() %>% as.data.frame() , variance = lm_var %>% as.data.frame()) colnames(lm_df) = c("coefficients", "variance_lm")lm_df#block Dlm_var_sum = sum(lm_var)lm_var_sum
对于其他回归模型也是如此。然而,我没有找到任何代码或包来在R中应用基于对数双曲余弦损失函数的回归模型。
您能否指导我找到任何可以帮助我解决这个问题的资源?
回答:
这可以从基本原理开始做。还要注意limma包中存在logcosh
函数,如果您遇到数值困难,可以用它代替log(cosh(.))
。
f <- function(b) with(cars, sum(log(cosh(dist - b[1] - b[2] * speed))))fm0 <- lm(dist ~ speed, cars)res <- optim(coef(fm0), f, method = "BFGS")str(res)## List of 5## $ par : Named num [1:2] -12.82 3.47## ..- attr(*, "names")= chr [1:2] "(Intercept)" "speed"## $ value : num 532## $ counts : Named int [1:2] 28 10## ..- attr(*, "names")= chr [1:2] "function" "gradient"## $ convergence: int 0## $ message : NULL
图形
# 黑线是普通最小二乘回归线,红线是对数双曲余弦回归线plot(cars)abline(fm0)yfit <- res$par[1] + res$par[2] * cars$speedlines(cars$speed, yfit, col = "red")
补充
请注意,优化也可以这样写,如果您有许多独立变量,这可能会有用。
fm0 <- lm(dist ~ speed, cars)X <- model.matrix(fm0)f <- function(b) with(cars, sum(log(cosh(dist - X %*% b))))res <- optim(coef(fm0), f, method = "BFGS")res
结果如下:
$par(Intercept) speed -12.816190 3.469536 $value[1] 531.5872$countsfunction gradient 28 10 $convergence[1] 0$messageNULL