Python lambda表达式教程:简洁创建函数

需积分: 50 23 下载量 68 浏览量 更新于2024-08-09 收藏 808KB PDF 举报
"Lambda形式在《Lambda形式-数字高程模型教程(第二版)》一书中是Python编程中的一个重要概念,它允许在运行时创建并返回新的函数对象。在Python中,lambda表达式是一种简洁的、匿名的函数定义方式,特别适用于需要临时或一次性使用的简单功能。在第16章中,作者汤国安、李发源和刘学军详细介绍了lambda语句的用法。 在代码示例中,作者通过`make_repeater(n)`函数展示了如何使用lambda来创建重复器函数,比如将一个字符串乘以指定的次数。在这一段中,`lambda s: s*n`就是一个lambda表达式,它接受一个参数`s`,并返回`s`与`n`相乘的结果。使用lambda的好处在于代码紧凑,特别是在函数定义较为简单的场景下。 然而,尽管lambda形式在某些情况下能简化代码,作者还是建议避免过度依赖,尤其是在处理复杂的逻辑或需要维护性的情况下,保持清晰的代码结构和缩进显得更为重要。此外,如果语句块只包含一行代码,虽然可以直接写在条件语句或循环体内,但这并不意味着它是一个良好的编程实践,因为它限制了代码的扩展性和可读性。 Python3.0版本的《A Byte of Python》这本书,由Swaroop C.H.编写,提供了深入浅出的Python学习指南。它强调了Python语言的特点,如简洁、易读和动态类型系统,并对比了Python与其他语言如Perl和Ruby的区别。书中还涵盖了Python的安装、交互式环境、编辑器选择、源文件使用以及获取帮助等内容,为初学者提供了全面的学习路径。 Lambda形式是Python编程中一个实用的特性,但它应当被明智地使用,确保代码的清晰和可维护性。《Lambda形式-数字高程模型教程》这本书不仅教授基本语法,还提倡良好编程习惯,有助于读者逐步掌握Python语言的高级特性。"

请在以下R代码基础上:# ①建立50×30的随机数据和30个变量 set.seed(123) X <- matrix(rnorm(50*30), ncol=30) y <- rnorm(50) # ②生成三组不同系数的线性模型 beta1 <- rnorm(30, mean=1, sd=0.5) beta2 <- rnorm(30, mean=2, sd=0.5) beta3 <- rnorm(30, mean=3, sd=0.5) # 定义一个函数用于计算线性回归的CV值 cv_linear <- function(X, y, k=10, lambda=NULL) { n <- nrow(X) if (is.null(lambda)) { lambda <- seq(0, 1, length.out=100) } mse <- rep(0, length(lambda)) folds <- sample(rep(1:k, length.out=n)) for (i in 1:k) { X_train <- X[folds!=i, ] y_train <- y[folds!=i] X_test <- X[folds==i, ] y_test <- y[folds==i] for (j in 1:length(lambda)) { fit <- glmnet(X_train, y_train, alpha=0, lambda=lambda[j]) y_pred <- predict(fit, newx=X_test) mse[j] <- mse[j] + mean((y_test - y_pred)^2) } } mse <- mse / k return(mse) } # ③(线性回归中)分别计算这三组的CV值 lambda <- seq(0, 1, length.out=100) mse1 <- cv_linear(X, y, lambda=lambda) mse2 <- cv_linear(X, y, lambda=lambda) mse3 <- cv_linear(X, y, lambda=lambda) # ④(岭回归中)分别画出这三组的两张图,每组两张图均以lambda为横坐标: library(glmnet) par(mfrow=c(2,3)) # 画Beta1的CV error图 plot(lambda, mse1, type="l", xlab="lambda", ylab="CV error", main="Beta1 CV error") # 画Beta1的Prediction error图 fit1 <- glmnet(X, y, alpha=0, lambda=lambda[which.min(mse1)]) y_pred1 <- as.vector(predict(fit1, newx=X)) pred_error1 <- mean((y - y_pred1)^2) lambda <- as.vector(lambda) pred_error1 <- as.vector(pred_error1) if (length(lambda) != length(pred_error1)) { if (length(lambda) > length(pred_error1)) { pred_error1 <- rep(pred_error1, length.out = length(lambda)) } else { lambda <- rep(lambda, length.out = length(pred_error1)) } } plot(lambda, pred_error1, type="l", xlab="lambda", ylab="Prediction error", main="Beta1 Prediction error") # 画Beta2的CV error图 plot(lambda, mse2, type="l", xlab="lambda", ylab="CV error", main="Beta2 CV error") # 画Beta2的Prediction error图 fit2 <- glmnet(X, y, alpha=0, lambda=lambda[which.min(mse2)]) y_pred2 <- predict(fit2, newx=X) pred_error2 <- mean((y - y_pred2)^2) plot(lambda, pred_error2, type="l", xlab="lambda", ylab="Prediction error", main="Beta2 Prediction error") # 画Beta3的CV error图 plot(lambda, mse3, type="l", xlab="lambda", ylab="CV error", main="Beta3 CV error") # 画Beta3的Prediction error图 fit3 <- glmnet(X, y, alpha=0, lambda=lambda[which.min(mse3)]) y_pred3 <- predict(fit3, newx=X) pred_error3 <- mean((y - y_pred3)^2) plot(lambda, pred_error3, type="l", xlab="lambda", ylab="Prediction error", main="Beta3 Prediction error")。对每组数据绘制纵坐标为Prediction error的图的代码进行修改

2023-05-31 上传