当前位置: 首页 > news >正文

再生核希尔伯特空间(RKHS)上的分位回归

1. 基本定义和理论基础

1.1 再生核希尔伯特空间(RKHS)

给定一个非空集合 X \mathcal{X} X,一个希尔伯特空间 H \mathcal{H} H 称为再生核希尔伯特空间,如果存在一个函数 K : X × X → R K: \mathcal{X} \times \mathcal{X} \rightarrow \mathbb{R} K:X×XR,满足:

  1. 再生性质:对于任意 x ∈ X x \in \mathcal{X} xX K ( x , ⋅ ) ∈ H K(x,\cdot) \in \mathcal{H} K(x,)H

  2. 对于任意 f ∈ H f \in \mathcal{H} fH 和任意 x ∈ X x \in \mathcal{X} xX,有:
    f ( x ) = ⟨ f , K ( x , ⋅ ) ⟩ H f(x) = \langle f, K(x,\cdot) \rangle_{\mathcal{H}} f(x)=f,K(x,)H

这里的 K K K 称为再生核函数。

1.2 分位数回归损失函数

对于给定的分位数水平 τ ∈ ( 0 , 1 ) \tau \in (0,1) τ(0,1),分位数回归的检验函数定义为:
ρ τ ( u ) = u ( τ − I ( u < 0 ) ) \rho_\tau(u) = u(\tau - I(u < 0)) ρτ(u)=u(τI(u<0))
其中 I ( ⋅ ) I(\cdot) I() 是示性函数。这个损失函数具有以下性质:
∂ ρ τ ( u ) ∂ u = { τ , u > 0 τ − 1 , u < 0 \frac{\partial \rho_\tau(u)}{\partial u} = \begin{cases} \tau, & u > 0 \\ \tau - 1, & u < 0 \end{cases} uρτ(u)={τ,τ1,u>0u<0

2. 优化问题的形式化

2.1 原始问题

给定数据集 { ( x i , y i ) } i = 1 n \{(x_i, y_i)\}_{i=1}^n {(xi,yi)}i=1n,其中 ( x i , y i ) ∈ X × R (x_i, y_i) \in \mathcal{X} \times \mathbb{R} (xi,yi)X×R,我们的目标是在RKHS H K \mathcal{H}_K HK 中估计条件 τ \tau τ 分位数函数。优化问题可以表示为:

min ⁡ f ∈ H K 1 n ∑ i = 1 n ρ τ ( y i − f ( x i ) ) + λ ∥ f ∥ H K 2 \min_{f \in \mathcal{H}_K} \frac{1}{n}\sum_{i=1}^n \rho_\tau(y_i - f(x_i)) + \lambda \|f\|^2_{\mathcal{H}_K} fHKminn1i=1nρτ(yif(xi))+λfHK2

这里:

  • 第一项是经验风险,度量预测值与观测值之间的分位数损失
  • 第二项是正则化项,控制函数的复杂度
  • λ > 0 \lambda > 0 λ>0 是正则化参数,平衡这两项的权重

2.2 表示定理

根据RKHS的表示定理,最优解必然具有以下形式:
f ( x ) = ∑ i = 1 n α i K ( x , x i ) f(x) = \sum_{i=1}^n \alpha_i K(x, x_i) f(x)=i=1nαiK(x,xi)

其中 α = ( α 1 , … , α n ) T \alpha = (\alpha_1,\ldots,\alpha_n)^T α=(α1,,αn)T 是待估计的系数向量。

3. 计算求解

3.1 等价二次规划问题

利用表示定理并引入松弛变量,原问题可以转化为以下二次规划问题:

min ⁡ α , ξ , η ∑ i = 1 n ( τ ξ i + ( 1 − τ ) η i ) + λ α T K α s.t. y i = ∑ j = 1 n α j K ( x i , x j ) + ξ i − η i , i = 1 , … , n ξ i , η i ≥ 0 , i = 1 , … , n \begin{aligned} \min_{\alpha,\xi,\eta} & \sum_{i=1}^n (\tau\xi_i + (1-\tau)\eta_i) + \lambda \alpha^T K \alpha \\ \text{s.t.} & \quad y_i = \sum_{j=1}^n \alpha_j K(x_i,x_j) + \xi_i - \eta_i, \quad i=1,\ldots,n \\ & \quad \xi_i, \eta_i \geq 0, \quad i=1,\ldots,n \end{aligned} α,ξ,ηmins.t.i=1n(τξi+(1τ)ηi)+λαTKαyi=j=1nαjK(xi,xj)+ξiηi,i=1,,nξi,ηi0,i=1,,n

其中:

  • K ∈ R n × n K \in \mathbb{R}^{n \times n} KRn×n 是核矩阵, K i j = K ( x i , x j ) K_{ij} = K(x_i,x_j) Kij=K(xi,xj)
  • ξ i , η i \xi_i, \eta_i ξi,ηi 分别表示正向和负向的偏差
  • 矩阵形式可写为: y = K α + ξ − η y = K\alpha + \xi - \eta y=Kα+ξη

3.2 核函数选择

常用的核函数包括:

  1. 高斯核(RBF核):
    K ( x , y ) = exp ⁡ ( − ( x − y ) 2 2 σ 2 ) K(x,y) = \exp\left(-\frac{(x-y)^2}{2\sigma^2}\right) K(x,y)=exp(2σ2(xy)2)
    参数 σ > 0 \sigma > 0 σ>0 控制核的带宽

  2. 多项式核:
    K ( x , y ) = ( x y + c ) d K(x,y) = (xy + c)^d K(x,y)=(xy+c)d
    参数 d ∈ N d \in \mathbb{N} dN 是多项式的阶数, c ≥ 0 c \geq 0 c0 是偏置项

  3. 线性核:
    K ( x , y ) = x y + c K(x,y) = xy + c K(x,y)=xy+c
    这是多项式核在 d = 1 d=1 d=1 时的特例

  4. 拉普拉斯核:
    K ( x , y ) = exp ⁡ ( − ∣ x − y ∣ σ ) K(x,y) = \exp\left(-\frac{|x-y|}{\sigma}\right) K(x,y)=exp(σxy)
    类似于高斯核,但使用L1距离

  5. Sigmoid核:
    K ( x , y ) = tanh ⁡ ( α x y + c ) K(x,y) = \tanh(\alpha xy + c) K(x,y)=tanh(αxy+c)
    参数 α > 0 \alpha > 0 α>0 控制斜率, c ≥ 0 c \geq 0 c0 控制截距

4. 模型选择与参数估计

4.1 交叉验证(CV)

使用K折交叉验证来选择最优的超参数组合 ( λ , θ ) (\lambda, \theta) (λ,θ),其中 θ \theta θ 表示核函数的参数。交叉验证误差定义为:

CV ( λ , θ ) = 1 K ∑ k = 1 K 1 ∣ I k ∣ ∑ i ∈ I k ρ τ ( y i − f ^ λ , θ ( − k ) ( x i ) ) \text{CV}(\lambda,\theta) = \frac{1}{K}\sum_{k=1}^K \frac{1}{|I_k|}\sum_{i\in I_k} \rho_\tau(y_i - \hat{f}_{\lambda,\theta}^{(-k)}(x_i)) CV(λ,θ)=K1k=1KIk1iIkρτ(yif^λ,θ(k)(xi))

其中:

  • I k I_k Ik 是第k折的测试集索引集合
  • ∣ I k ∣ |I_k| Ik 是测试集的样本量
  • f ^ λ , θ ( − k ) \hat{f}_{\lambda,\theta}^{(-k)} f^λ,θ(k) 是在除第k折外的数据上训练得到的估计函数

该方法使用了并行计算来加速.

4.2 广义交叉验证(GCV)(待完善)

大规模数据集下的 CV 效率仍然较低

4.3 预测(组外)

对于新的输入点 x new x_{\text{new}} xnew,其预测值为:
f ^ ( x new ) = ∑ i = 1 n α ^ i K ( x new , x i ) \hat{f}(x_{\text{new}}) = \sum_{i=1}^n \hat{\alpha}_i K(x_{\text{new}}, x_i) f^(xnew)=i=1nα^iK(xnew,xi)

其中 α ^ \hat{\alpha} α^ 是使用最优超参数在全部训练数据上估计得到的系数向量。

4.4 置信区间(待完善)

5. 理论性质(待完善)

5.1 一致性

在适当的条件下,当样本量 n → ∞ n \rightarrow \infty n 时,估计的分位数函数将收敛到真实的条件分位数函数:
sup ⁡ x ∈ X ∣ f ^ n ( x ) − f τ ( x ) ∣ → 0 a.s. \sup_{x \in \mathcal{X}} |\hat{f}_n(x) - f_\tau(x)| \rightarrow 0 \quad \text{a.s.} xXsupf^n(x)fτ(x)0a.s.

其中 f τ ( x ) f_\tau(x) fτ(x) 是真实的条件 τ \tau τ 分位数函数。

5.2 收敛率

在光滑性假设下,收敛率为:
∥ f ^ n − f τ ∥ ∞ = O p ( ( log ⁡ n n ) s 2 s + d ) \|\hat{f}_n - f_\tau\|_{\infty} = O_p\left(\left(\frac{\log n}{n}\right)^{\frac{s}{2s+d}}\right) f^nfτ=Op((nlogn)2s+ds)

其中 s s s 是真实函数的光滑度, d d d 是输入空间的维数。

这个方法结合了分位数回归的鲁棒性和核方法的非线性建模能力,为条件分位数函数的估计提供了一个灵活而有效的框架。通过选择合适的核函数和参数,可以捕捉数据中的非线性关系,而正则化项则有助于控制过拟合,提高模型的泛化能力。

代码(R with 4.4.3, 待完善)

library(CVXR)
library(ggplot2)
library(progress)
library(pbmcapply)
library(patchwork)
library(viridis)# 生成示例数据
set.seed(123)  # 为了结果的可重复性
n = 300
x <- seq(-5, 5, length.out = n)  # 生成50个x值
y_true <- 2 * sin(x) + 3  # 真实的线性关系
y <- y_true + rnorm(n, 0, 1)  # 带有噪声的观测值# 分位损失
compute.quantile.loss <- function(y.true, y.pred, tau) {residuals <- y.true - y.predsum(residuals * (tau - (residuals < 0)))
}# 核函数
kernels <- function(kernel.type = "radial", kernel.params = list()) {# 定义高斯(径向基)核函数radial <- function(x, y, sigma = 1) {exp(-((x - y)^2)/(2 * sigma^2))}# 定义线性核函数linear <- function(x, y, c = 0) {x * y + c}# 定义多项式核函数polynomial <- function(x, y, degree = 2, c = 1) {(x * y + c)^degree}# 定义拉普拉斯核函数laplacian <- function(x, y, sigma = 1) {exp(-abs(x - y)/sigma)}# 定义sigmoid核函数sigmoid <- function(x, y, alpha = 1, c = 0) {tanh(alpha * x * y + c)}# 返回指定的核函数switch(kernel.type,"radial" = function(x, y) {radial(x, y, sigma = kernel.params$sigma %||% 1)},"linear" = function(x, y) {linear(x, y, c = kernel.params$c %||% 0)},"polynomial" = function(x, y) {polynomial(x, y, degree = kernel.params$degree %||% 2,c = kernel.params$c %||% 1)},"laplacian" = function(x, y) {laplacian(x, y, sigma = kernel.params$sigma %||% 1)},"sigmoid" = function(x, y) {sigmoid(x, y, alpha = kernel.params$alpha %||% 1,c = kernel.params$c %||% 0)},stop("Unsupported kernel type"))
}kernel.matrix <- function(x, kernel.func) {n <- length(x)K.reg <- matrix(nrow = n, ncol = n)for (i in 1:n) {for (j in 1:n) {K.reg[i, j] <- kernel.func(x[i], x[j])}}return(K.reg)
}# 主函数
solve.rkhs.quantile.regression <- function(x, y, tau, kernel.type = "radial",kernel.params = list(),lambda) {n <- length(y)alpha <- Variable(n)xi <- Variable(n, nonneg = TRUE)eta <- Variable(n, nonneg = TRUE)kernel.func <- kernels(kernel.type, kernel.params)K.reg <- kernel.matrix(x, kernel.func)# 构建优化问题objective <- Minimize(sum(tau * xi + (1 - tau) * eta) + lambda * quad_form(alpha, K.reg))constraints <- list(y == K.reg %*% alpha + xi - eta)# 求解优化问题problem <- Problem(objective, constraints)solution <- solve(problem)# 获取拟合值alpha.hat <- solution$getValue(alpha)fitted.values <- K.reg %*% alpha.hat# 计算残差residuals <- y - fitted.values# 计算有效自由度A <- K.reg %*% solve(K.reg + lambda * diag(n)) %*% t(K.reg)df <- sum(diag(A))# 计算诊断统计量mse <- mean(residuals^2)mae <- mean(abs(residuals))quantile.loss <- mean(tau * pmax(residuals, 0) + (tau - 1) * pmin(residuals, 0))return(list(# 模型参数alpha = alpha.hat,kernel.type = kernel.type,kernel.params = kernel.params,lambda = lambda,tau = tau,x.train = x,# 拟合结果fitted.values = fitted.values,residuals = residuals,# 诊断统计量df = df,mse = mse,mae = mae,quantile.loss = quantile.loss,# 优化信息convergence = solution$status,objective = solution$value,# 核矩阵信息Kmat = K.reg))
}select.params.cv <- function(x, y, tau, kernel.type = "radial",kernel.params.grid = list(sigma = c(0.1, 0.5, 1, 2)  # 默认为高斯核的参数网格),lambda.grid = 10^seq(-3, 0, by = 0.5),K = 5,parallel = FALSE) {# 初始化基本参数n <- length(y)fold.indices <- sample(rep(1:K, length.out = n))# 根据核函数类型创建参数网格param.grid <- switch(kernel.type,"radial" = expand.grid(sigma = kernel.params.grid$sigma,lambda = lambda.grid),"polynomial" = expand.grid(degree = kernel.params.grid$degree %||% c(2, 3),c = kernel.params.grid$c %||% c(0, 1),lambda = lambda.grid),"linear" = expand.grid(c = kernel.params.grid$c %||% 0,lambda = lambda.grid),"laplacian" = expand.grid(sigma = kernel.params.grid$sigma,lambda = lambda.grid),"sigmoid" = expand.grid(alpha = kernel.params.grid$alpha %||% c(0.5, 1),c = kernel.params.grid$c %||% c(0, 1),lambda = lambda.grid))# 定义用于计算单个参数组合交叉验证误差的函数compute.cv.error <- function(param.idx) {# 获取当前参数组合current.params <- param.grid[param.idx, ]current.lambda <- current.params$lambda# 提取核函数参数(去除lambda列)kernel.params <- as.list(current.params[names(current.params) != "lambda"])# 创建当前参数组合的核函数current.kernel <- kernels(kernel.type = kernel.type,kernel.params = kernel.params)cv.error <- 0fold.results <- list()# 对每个折叠进行交叉验证for (k in 1:K) {test.idx <- which(fold.indices == k)train.idx <- which(fold.indices != k)x.train <- x[train.idx]y.train <- y[train.idx]x.test <- x[test.idx]y.test <- y[test.idx]# 尝试拟合模型fit <- try({solve.rkhs.quantile.regression(x.train, y.train, tau = tau,kernel.type = kernel.type,kernel.params = kernel.params,lambda = current.lambda)}, silent = TRUE)if (!inherits(fit, "try-error")) {# 构建测试集的核矩阵K.test <- matrix(nrow = length(x.test), ncol = length(x.train))for (t in seq_along(x.test)) {for (s in seq_along(x.train)) {K.test[t, s] <- current.kernel(x.test[t], x.train[s])}}# 计算预测值和误差y.pred <- K.test %*% fit$alphafold.error <- compute.quantile.loss(y.test, y.pred, tau)cv.error <- cv.error + fold.errorfold.results[[k]] <- list(error = fold.error,predictions = y.pred,actual = y.test,convergence = fit$convergence)} else {cv.error <- Inffold.results[[k]] <- list(error = Inf,convergence = "failed")break}}list(mean.error = cv.error / K,fold.results = fold.results,kernel.params = kernel.params,lambda = current.lambda)}# 根据parallel参数选择计算方式if (parallel) {cv.results <- pbmclapply(1:nrow(param.grid), compute.cv.error,mc.cores = parallel::detectCores() - 1)} else {pb <- progress_bar$new(format = "  Computing [:bar] :percent eta: :eta",total = nrow(param.grid),clear = FALSE,width = 60)cv.results <- list()for (i in 1:nrow(param.grid)) {cv.results[[i]] <- compute.cv.error(i)pb$tick()}}# 提取交叉验证误差并重塑为矩阵形式n.kernel.params <- nrow(param.grid) / length(lambda.grid)cv.errors <- matrix(sapply(cv.results, function(x) x$mean.error),nrow = n.kernel.params,ncol = length(lambda.grid),byrow = TRUE)# 找到最优参数组合best.idx <- which(cv.errors == min(cv.errors), arr.ind = TRUE)best.params.idx <- (best.idx[1] - 1) * length(lambda.grid) + best.idx[2]best.params <- param.grid[best.params.idx, ]best.lambda <- best.params$lambdabest.kernel.params <- as.list(best.params[names(best.params) != "lambda"])# 使用最优参数进行最终拟合best.fit <- solve.rkhs.quantile.regression(x, y,tau = tau,kernel.type = kernel.type,kernel.params = best.kernel.params,lambda = best.lambda)# 计算诊断统计量cv.stats <- list(mean.cv.error = mean(cv.errors[is.finite(cv.errors)]),sd.cv.error = sd(cv.errors[is.finite(cv.errors)]),min.cv.error = min(cv.errors),max.cv.error = max(cv.errors[is.finite(cv.errors)]),convergence.rate = mean(!is.infinite(as.vector(cv.errors))),best.kernel.params = best.kernel.params,best.lambda = best.lambda)# 返回完整结果structure(list(# 最优参数kernel.type = kernel.type,best.kernel.params = best.kernel.params,best.lambda = best.lambda,# 交叉验证结果cv.errors = cv.errors,cv.results = cv.results,param.grid = param.grid,  # 保存完整的参数网格lambda.grid = lambda.grid,# 最优模型best.fit = best.fit,# 诊断信息cv.diagnostics = cv.stats,# 原始数据x = x,y = y,tau = tau,# 计算设置K = K,parallel = parallel,timestamp = Sys.time()), class = "rkhs.quantile.fit")
}# 预测函数:用于对新数据点进行预测
predict.rkhs.quantile <- function(object, newx) {# 使用已训练模型的参数对新数据进行预测# 参数:# object: 训练好的模型对象,包含训练数据和模型参数# newx: 需要预测的新数据点# 获取核函数类型和参数kernel.func <- kernels(kernel.type = object$kernel.type,kernel.params = object$kernel.params)# 构建新数据点与训练数据之间的核矩阵K.new <- matrix(nrow = length(newx), ncol = length(object$x.train))for (i in seq_along(newx)) {for (j in seq_along(object$x.train)) {K.new[i, j] <- kernel.func(newx[i], object$x.train[j])}}# 计算预测值y.pred <- K.new %*% object$alphareturn(y.pred)
}# 绘制模型诊断图
plot.rkhs.quantile <- function(fit) {# 创建一个包含四个诊断图的面板布局old.par <- par(mfrow = c(2, 2))on.exit(par(old.par))  # 确保在函数退出时恢复原始参数设置# 残差与拟合值的关系图plot(fit$fitted.values, fit$residuals,xlab = "Fitted Values", ylab = "Residuals",main = "Residuals vs Fitted",pch = 20)abline(h = 0, lty = 2, col = "gray")# 残差的正态Q-Q图qqnorm(fit$residuals, main = "Normal Q-Q Plot",pch = 20)qqline(fit$residuals, col = "red")# 残差的密度分布图res.density <- density(fit$residuals)plot(res.density,main = "Residuals Density",xlab = "Residuals",ylab = "Density")polygon(res.density, col = "lightgray", border = "gray")# Scale-Location图(标准化残差的平方根)plot(fit$fitted.values, sqrt(abs(fit$residuals)),xlab = "Fitted Values",ylab = expression(sqrt("|Residuals|")),main = "Scale-Location",pch = 20)# 添加平滑线以帮助识别趋势if(requireNamespace("stats", quietly = TRUE)) {try({smooth <- loess.smooth(fit$fitted.values, sqrt(abs(fit$residuals)))lines(smooth$x, smooth$y, col = "red", lwd = 2)}, silent = TRUE)}
}# 创建可视化函数
plot.cv.results <- function(fit) {# 获取核函数参数(除了lambda)kernel.param <- names(fit$param.grid)[1]  # 第一列应该是核函数参数# 准备数据cv.errors.df <- data.frame(param = rep(fit$param.grid[[kernel.param]][!duplicated(fit$param.grid[[kernel.param]])], each = length(fit$lambda.grid)),lambda = rep(fit$lambda.grid, times = length(unique(fit$param.grid[[kernel.param]]))),error = as.vector(fit$cv.errors))# 处理 Inf 值为 NAcv.errors.df$error[is.infinite(cv.errors.df$error)] <- NA# 创建热图# 首先在geom_tile()之前加上映射p1 = ggplot(cv.errors.df, aes(x = lambda, y = param)) +geom_tile(aes(fill = error)) +  # 在这里指定fill映射scale_fill_viridis_c(na.value = "grey90") +geom_point(data = data.frame(lambda = fit$best.lambda,param = unlist(fit$best.kernel.params)[1]),color = "red",size = 3) +labs(title = paste("Cross-validation Error Heatmap for", fit$kernel.type, "kernel"),x = "Lambda",y = kernel.param) +theme_minimal() +theme(panel.grid = element_blank())# 参数效应图p2 <- ggplot(cv.errors.df[!is.na(cv.errors.df$error), ], aes(x = lambda, y = error, color = factor(param))) +geom_line() +scale_x_log10() +labs(x = "Lambda (log scale)",y = "CV Error",color = kernel.param  # 使用实际的参数名) +theme_minimal()# 组合图形if (requireNamespace("patchwork", quietly = TRUE)) {p1 / p2} else {p1}
}cv.param <- select.params.cv(x, y, tau = 0.5,kernel.type = "radial",kernel.params.grid = list(sigma = c(0.1, 0.5, 1, 1.5, 2, 2.5, 3)),lambda.grid = seq(0, 5, 0.5),parallel = TRUE
)plot.cv.results(cv.param)# 查看诊断信息
print(cv.param$cv.diagnostics)
# 预测新数据
newx <- seq(min(x), max(x), length.out = 100)
predict.rkhs.quantile(cv.param$best.fit, newx)# 绘制诊断图
plot.rkhs.quantile(cv.param$best.fit)# 使用选择的参数进行拟合
tau_levels <- c(0.25, 0.5, 0.75)
data.rq <- data.frame()
for (tau in tau_levels) {fit.rq <- solve.rkhs.quantile.regression(x, y, tau = tau,kernel.type = 'radial',kernel.params = list(cv.param$best.kernel.params),lambda = cv.param$best.lambda)res = data.frame(x = x, y = fit.rq$fitted.values, tau = tau)data.rq <- rbind(data.rq, res)
}fit.ols = solve.rkhs.regression(x, y,kernel.type = "radial",kernel.params = list(sigma = 1),lambda = 0.2)data.ols = data.frame(x = x, y = fit.ols$fitted.values)
data.ols$type = "OLS"  # 添加类型标识
data.rq$type = paste0("tau= ", data.rq$tau)  # 为每个分位数添加描述性标签
data_points = data.frame(x = x, y = y)ggplot() +geom_point(data = data_points, aes(x = x, y = y),alpha = 0.5,color = "gray50") +# OLS回归线geom_line(data = data.ols,aes(x = x, y = y, color = "OLS"),    # 将OLS作为一个特殊的类别linetype = "dashed",   size = 1) +# 分位数回归线geom_line(data = data.rq,aes(x = x, y = y, color = type),    size = 1) +theme(legend.position = "bottom",legend.title = element_text(size = 12),legend.text = element_text(size = 10),plot.title = element_text(size = 14, face = "bold"),axis.title = element_text(size = 12),axis.text = element_text(size = 10),panel.grid.major = element_line(color = "gray90"),panel.grid.minor = element_blank()) +# 根据实际的类别名称设置颜色scale_color_manual(name = "Regression",values = c("OLS" = "black","tau= 0.25" = "#E41A1C","tau= 0.5" = "#4DAF4A","tau= 0.75" = "#377EB8")) +# 设置图例guides(color = guide_legend(title = "Regression",nrow = 1,override.aes = list(linetype = c("dashed", "solid", "solid", "solid")  # 对应四种类型)))

运行结果
在这里插入图片描述

相关文章:

再生核希尔伯特空间(RKHS)上的分位回归

1. 基本定义和理论基础 1.1 再生核希尔伯特空间(RKHS) 给定一个非空集合 X \mathcal{X} X&#xff0c;一个希尔伯特空间 H \mathcal{H} H 称为再生核希尔伯特空间&#xff0c;如果存在一个函数 K : X X → R K: \mathcal{X} \times \mathcal{X} \rightarrow \mathbb{R} K…...

结构方程模型【SEM】:非线性、非正态、交互作用及分类变量分析

利用结构方程模型建模往往遇到很多‘特殊’情况&#xff1a;1&#xff09;变量间为非直线关系&#xff1b;2&#xff09;变量间存在交互作用&#xff1b;3&#xff09;数据不满足正态分布&#xff1b;4&#xff09;变量为非正态类型的数值变量&#xff0c;如0&#xff0c;1数据…...

不安全物联网的轻量级加密:综述

Abstract 本文综述了针对物联网&#xff08;IoT&#xff09;的轻量级加密解决方案。这项综述全面覆盖了从轻量级加密方案到不同类型分组密码的比较等多个方面。同时&#xff0c;还对硬件与软件解决方案之间的比较进行了讨论&#xff0c;并分析了当前最受信赖且研究最深入的分组…...

DeepSpeed 使用 LoRA 训练后文件结构详解

DeepSpeed 使用 LoRA 训练后文件结构详解 在大语言模型&#xff08;LLM&#xff09;的训练过程中&#xff0c;DeepSpeed 提供了强大的分布式训练能力&#xff0c;而 LoRA&#xff08;Low-Rank Adaptation&#xff09;通过参数高效微调技术显著减少了资源占用。完成训练后&…...

Mysql数据 新增、修改和删除操作时,这些变化如何被转换为Kafka消息?

Mysql数据 新增、修改和删除操作时,这些变化如何被转换为Kafka消息? 为了在FlinkCDC中配置MySQL同步到Kafka,并采用debezium-json数据格式,我们需要了解当执行新增、修改和删除操作时,这些变化如何被转换为Kafka消息。下面我们将详细介绍这些变化情况,并提供具体的数据样…...

高等数学 8.1向量及其线性运算

8.1 向量及其线性运算 文章目录 8.1 向量及其线性运算一、向量的概念向量的线性运算1.向量的加减法2.向量与数的乘法 三、空间直角坐标系四、利用坐标作向量的线性运算五、向量的模、方向角、投影1.向量的模与两点间的距离公式2.方向角与方向余弦3.向量在轴上的投影 一、向量的…...

向bash shell脚本传参

例子&#xff1a; ~ script % touch parameter.sh ~ script % chmod 755 parameter.sh ~ % vim parameter.shparameter.sh: #!/usr/bin/env bashecho the name of current script is $0echo the first parameter is $1echo the second parameter is $2echo all parameters: $…...

高精度算法:加减乘除 (学习笔记)

加法&#xff1a; 现有vector<int>a,b;并且已经输入了内容且倒置 vector<int> plus(vector<int>a,vector<int> b){ int as a.size(); int bs b.size(); vector<int>total; int carry 0; int ar 0, br 0; //读取位数 while (ar < as &am…...

JVM 主要组成部分与内存区域

一、JVM 主要组成部分&#xff1a; JVM的主要包含两个组件和两个子系统&#xff0c;分别为&#xff1a; &#xff08;1&#xff09;本地库接口(Native Interface)&#xff1a;与native lib(本地方法库)交互&#xff0c;融合其他编程语言为Java所用&#xff0c;是与其它编程语言…...

10分钟掌握项目管理核心工具:WBS、甘特图、关键路径法全解析

一、引言 在项目管理的广阔天地里&#xff0c;犹如一场精心编排的交响乐演奏&#xff0c;每个乐器、每个音符都需精准配合才能奏响美妙乐章。而 WBS&#xff08;工作分解结构&#xff09;、甘特图、关键路径法无疑是这场交响乐中的关键乐章&#xff0c;它们从不同维度为项目管…...

python语音机器人(青云客免费api)

强调&#xff1a;不用登录注册&#xff0c;直接使用就好 青云客智能聊天机器人API python代码&#xff0c;直接可以运行&#xff1a; 1、安装库&#xff1a; pip install requests pyttsx3 SpeechRecognition sounddevice numpy scipy2、完整代码&#xff1a; import request…...

策略模式以及优化

使用场景 在一个条件语句中又包含了多个条件语句 具体策略类会过多 把抽象策略和具体策略放在一个枚举类里。 方法 exe() 相当于抽象策略&#xff0c;而A和B就相当于实现了抽象策略的具体策略 这样就只需要一个枚举类就可以解决具体策略类过多的问题 public enum Strategy {A{O…...

解决tomcat双击startup.bat乱码的几种方法

新环境&#xff0c;win10&#xff0c;今天下载了tomcat9.0.98&#xff0c;是压缩绿色版的&#xff0c;解压缩安装到了&#xff1a; D:\java\apache-tomcat-9.0.98 可以通过‪D:\java\apache-tomcat-9.0.98\bin\startup.bat双击来启动tomcat。 但是日志显示乱码。 后来找到了几种…...

计算机网络 (12)物理层下面的传输媒体

前言 计算机网络物理层下面的传输媒体是计算机网络设备之间的物理通路&#xff0c;也称为传输介质或传输媒介&#xff0c;并不包含在计算机网络体系结构中&#xff0c;而是处于物理层之下。 一、传输媒体的分类 导向型媒体&#xff1a;电磁波被导引沿着固体媒体传播。常见的导向…...

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS&#xff0c;但是中间结果可以存放在内存中&#xff1b;调度可以使用 Spark 内置的&#xff0c;也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈&#xff1a; Spark Core&#xff1a;实现了…...

如何计算相位差

如何计算相位差 假设我们有两个同频率的正弦信号&#xff1a; 这里两个信号的角频率w2πf是相同的&#xff0c;根据同频正弦信号相位差的计算方法&#xff0c;直接用两个信号的相位相减。 再来看利用波形图计算相位差的例子&#xff1a; 另一种计算方式&#xff1a;...

Bash Shell知识合集

1. chmod命令 创建一个bash shell脚本 hello.sh ~script $ touch hello.sh脚本创建完成后并不能直接执行&#xff0c;我们要用chmod命令授予它可执行的权限&#xff1a; ~script $ chmod 755 hello.sh授权后的脚本可以直接执行&#xff1a; ~script $ ./hello.sh2.指定运行…...

《信管通低代码信息管理系统开发平台》Windows环境安装说明

1 简介 《信管通低代码信息管理系统应用平台》提供多环境软件产品开发服务&#xff0c;包括单机、局域网和互联网。我们专注于适用国产硬件和操作系统应用软件开发应用。为事业单位和企业提供行业软件定制开发&#xff0c;满足其独特需求。无论是简单的应用还是复杂的系统&…...

如何查看服务器内存占用情况?

如何查看服务器的内存占用情况&#xff1f;你知道内存使用情况对服务器性能的重要性吗&#xff1f;内存是服务器运行的核心资源之一&#xff0c;了解内存的占用情况可以帮助你优化系统性能。 要查看服务器的内存占用情况&#xff0c;首先需要确定你使用的是哪种操作系统。不同…...

【源码】Sharding-JDBC源码分析之SQL中影子库ShadowSQLRouter路由的原理

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…...

代码随想录五刷day6

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣144. 二叉树的前序遍历(递归)二、力扣144. 二叉树的前序遍历(迭代)三、力扣145. 二叉树的后序遍历(递归)四、力扣145. 二叉树的后序遍历(迭代)五、力扣…...

【自信息、信息熵、联合熵、条件熵、互信息】

文章目录 一、自信息 I(X)二、信息熵&#xff1a;衡量系统的混乱程度信息熵 H(X)联合熵 H(X,Y) 三、条件熵H(Y|X) 联合熵H(X,Y) - 信息熵H(X)四、互信息 I(X,Y)五、总结References 一、自信息 I(X) 自信息(Self-information) 是由香农提出的&#xff0c;用来衡量单一事件发生…...

我的秋招总结

我的秋招总结 个人背景 双非本&#xff0c;985硕&#xff0c;科班 准备情况 以求职为目的学习Java的时间大概一年。 八股&#xff0c;一开始主要是看B站黑马的八股文课程&#xff0c;背JavaGuide和小林coding还有面试鸭。 算法&#xff0c;250&#xff0c;刷了3遍左右 项目&…...

page_ref_freeze浅析

最近在研究struct page的引用计数refcount&#xff0c;看到有个page_ref_freeze()特性很有意思。用这篇博客记录一下。 本文分析基于linux4.19.195 static inline int page_ref_freeze(struct page *page, int count) {int ret likely(atomic_cmpxchg(&page->_refcoun…...

Python毕业设计选题:基于python的酒店推荐系统_django+hadoop

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 酒店客房管理 客房类型管理 客房预定管理 用户…...

选择 SquashFS 作为启动分区的文件系统格式:详细教程

SquashFS 是一种高压缩率的只读文件系统,广泛用于嵌入式系统、Linux 发行版以及其他需要节省存储空间的场景。它特别适合用于启动分区、只读根文件系统(rootfs)等应用,因为它通过压缩技术极大地节省了存储空间。在本博客中,我们将详细介绍如何在 RK3568 等嵌入式设备上使用…...

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…...

【C语言】指针数组、数组指针、函数指针、指针函数、函数指针数组、回调函数

【C语言】函数指针与指针函数 文章目录 [TOC](文章目录) 前言一、指针数组二、数组指针三、函数指针四、指针函数五、函数指针数组六、回调函数七、参考资料总结 前言 使用工具&#xff1a; 1.DEVC 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、…...

EasyExcel 模板+公式填充

使用 CellWriteHandler 的实现类来实现公式写入 Data NoArgsConstructor public class CustomCellWriteHandler implements CellWriteHandler {private int maxRowNum 2000;// 动态传入列表数量public CustomCellWriteHandler(int maxRowNum) {this.maxRowNum maxRowNum;}Ov…...

vue最新源码探索分析

我在github上fork了最新版本vue3.5版本的源码并做了大幅删除&#xff0c;保留最核心的代码&#xff0c;有兴趣的可以看看&#xff0c;欢迎大家提出PR 仓库地址 https://github.com/greatanimalion/core 本项目vue版本3.5.13 为了方便查看与分析&#xff0c;减少心智负担 已…...

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…...

深入解析MVCC中Undo Log版本底层存储读取逻辑

一、引言 多版本并发控制&#xff08;MVCC&#xff0c;Multi-Version Concurrency Control&#xff09;是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本&#xff0c;使得在事务并发执行时&#xff0c;每个事务都能看到数据的一致性视图。在MVC…...

【生产问题记录-Mysql分区】

描述 月报是根据日报的数据统计出来的&#xff0c;但是今天早上发现月报没有数据&#xff0c;日报是有数据的&#xff0c;那么为什么会导致这个结果呢&#xff1f; 问题解决 设计 因为日报table_day每天的数据量都在60w&#xff0c;所以我们采用了分区的形式&#xff0c;进…...

大型语言模型(LLMs)演化树 Large Language Models

大型语言模型&#xff08;LLMs&#xff09;演化树 Large Language Models flyfish 下面的图来自论文地址 Transformer 模型&#xff08;如 BERT 和 GPT-3&#xff09;已经给自然语言处理&#xff08;NLP&#xff09;领域带来了革命性的变化。这得益于它们具备并行化能力&…...

【LeetCode: 3159. 查询数组中元素的出现位置 + 统计下标】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

git自动压缩提交的脚本

可以将当前未提交的代码自动执行 git addgit commitgit squash Git 命令安装指南 1. 创建脚本目录 如果目录不存在&#xff0c;创建它&#xff1a; mkdir -p ~/.local/bin2. 创建脚本文件 vim ~/.local/bin/git-squash将完整的脚本代码复制到此文件中。 3. 设置脚本权限…...

uniapp中Nvue白屏问题 ReferenceError: require is not defined

uniapp控制台输出如下 exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught ReferenceError: require is not defined 或者 exception function:createInstanceContext, exception:white s…...

Centos8安装图形化界面

由于Centos8已经停止维护&#xff0c;所以在使用的时候会遇到yum元数据找不到的情况 1、更新yum数据源 进入目录&#xff1a; cd /etc/yum.repos.d/ 修改文件&#xff1a; sed -i s/mirrorlist/#mirrorlist/g /etc/yum.repos.d/CentOS-* sed -i s|#baseurlhttp://mirror.cent…...

2023年厦门市第30届小学生C++信息学竞赛复赛上机操作题(三、2023C. 太空旅行(travel))

#include <bits/stdc.h>using namespace std;struct Ship {int u; // 从地球到火星的时间int v; // 从火星到天王星的时间 };// 自定义比较函数 bool cmp(const Ship &a, const Ship &b) {return a.u max(a.v, b.u) b.v < b.u max(b.v, a.u) a.v; }int ma…...

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…...

【RAG实战】语言模型基础

语言模型赋予了计算机理解和生成人类语言的能力。它结合了统计学原理和深度神经网络技术&#xff0c;通过对大量的样本数据进行复杂的概率分布分析来学习语言结构的内在模式和相关性。具体地&#xff0c;语言模型可根据上下文中已出现的词序列&#xff0c;使用概率推断来预测接…...

探索 .idea 文件夹:Java Maven 工程的隐形守护者

一、.idea文件夹深度解析&#xff1a;IntelliJ IDEA项目配置的核心 在Java Maven工程的开发环境中&#xff0c;.idea文件夹扮演着举足轻重的角色。这是IntelliJ IDEA项目特有的一个配置文件夹&#xff0c;它包含了项目所需的各种配置信息&#xff0c;以确保项目能够在不同的开…...

JAVA代理模式和适配器模式

文章目录 Java 代理模式和适配器模式代理模式&#xff08;Proxy Pattern&#xff09;适配器模式&#xff08;Adapter Pattern&#xff09;代理模式和适配器模式的区别 代理模式的使用举例静态代理实现:用代理模式记录方法调用日志动态代理实现:使用 Java 动态代理记录方法调用日…...

Python大数据可视化:基于python大数据的电脑硬件推荐系统_flask+Hadoop+spider

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 价格区间界面 用户信息界面 品牌管理 笔记本管理 电脑主机…...

【YOLOv3】源码(train.py)

概述 主要模块分析 参数解析与初始化 功能&#xff1a;解析命令行参数&#xff0c;设置训练配置项目经理制定详细的施工计划和资源分配日志记录与监控 功能&#xff1a;初始化日志记录器&#xff0c;配置监控系统项目经理使用监控和记录工具&#xff0c;实时跟踪施工进度和质量…...

一维、线性卡尔曼滤波的例程(MATLAB)

这段 MATLAB 代码实现了一维线性卡尔曼滤波器的基本功能&#xff0c;用于估计在存在噪声的情况下目标状态的真实值 文章目录 一维线性卡尔曼滤波代码运行代码介绍1. **初始化部分**2. **数据生成**3. **卡尔曼滤波器实现**4. **结果可视化**5. **统计输出** 源代码 总结 一维线…...

【Rust自学】6.2. Option枚举

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 6.2.1. 什么是Option枚举 它定义于标准库中&#xff0c;在Prelude&#xff08;预导入模块&#xff09;中&#xff0c;负责描述这样的场景…...

unity学习1:第1个template的项目platformer 学习

目录 0 教训&#xff0c;不要学生思路&#xff1a;路径依赖 1 从unity的编辑器里直接下载一个template 2 第一个下马威&#xff1a;下载到本地的这个模板项目第一次运行就报错, 其次关了重进就好了 2.1 报错 2.2 解决 2.3 解决 3 第2个拦路虎&#xff1a; 项目的声音大小…...

初识 Conda:一站式包管理和环境管理工具

文章目录 1. 什么是 Conda&#xff1f;2. 为什么选择 Conda&#xff1f;3. Conda 的安装3.1 安装步骤&#xff08;以 Miniconda 为例&#xff09; 4. Conda 的核心功能4.1 包管理4.2 环境管理4.3 Conda Forge4.4 设置国内镜像 5. 常见使用场景5.1 数据科学项目5.2 离线安装5.3 …...