You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中构建大维度对角矩阵W内存不足,求Fischer Scoring替代方案

问题:大型数据集下构造Fisher Scoring所需的X^TWX时内存耗尽

我有一个包含67856个元素的大型数据集,想要构造X^TWX,但尝试构建维度为67856×67856的对角矩阵W时,出现错误:vector memory exhausted (limit reached?)。请问有没有替代方法构造该对角矩阵W,以支持Fisher Scoring算法运行?

代码如下:

initial_model1=(lm(ClaimNb~VehValue+VehAge+DrivAge,data=final_data))
r=coef(summary(mleNB))[1,1]
beta0=initial_model1$coefficients[1]
beta1=initial_model1$coefficients[2]
beta2=initial_model1$coefficients[3]
beta3=initial_model1$coefficients[4]
y=c(final_data$ClaimNb)
xi1=c(final_data$VehValue)
xi2=c(final_data$VehAge)
xi3=c(final_data$DrivAge)

##Column vector of regressors
regressors=matrix(c(beta0,beta1,beta2,beta3),ncol=1)
n=nrow(final_data)
beta0=regressors[1]
beta1=regressors[2]
beta2=regressors[3]
beta3=regressors[4]
intercept=rep(1,nrow(final_data))
X=matrix(c(intercept,xi1,xi2,xi3),ncol=4)
XT=t(X)
W=matrix(rep(0),n,n)
# Error: vector memory exhausted (limit reached?)
解决办法

问题根源在于显式构造67856×67856的矩阵需要约36GB内存(按双精度浮点数计算),远超出常规内存限制。完全不需要构造完整的W矩阵,利用对角矩阵的运算性质,用向量替代矩阵即可完成计算:

  • 用向量存储W的对角元素
    对角矩阵W的核心信息就是其对角线上的n个元素,直接用长度为n的向量w_vec存储即可,内存需求仅约527KB,完全可控。
    针对你的负二项模型Fisher Scoring场景,W的对角元素为μ_i*(1+μ_i/r),其中μ_i = exp(Xβ),计算代码如下:

    mu = exp(X %*% regressors)
    w_vec = mu * (1 + mu / r)
    
  • 利用向量运算替代矩阵乘法
    计算X^TWX时,无需构造W矩阵,直接通过行加权后的X矩阵与X的转置相乘即可。在R中用sweep函数实现行加权:

    # 对X的每一行乘以对应的w_vec元素
    X_weighted = sweep(X, 1, w_vec, `*`)
    # 计算X^TWX
    XTWX = t(X) %*% X_weighted
    
  • 完整修改后的代码片段
    替换原代码中构造W的部分,整合后的关键代码如下:

    initial_model1=(lm(ClaimNb~VehValue+VehAge+DrivAge,data=final_data))
    r=coef(summary(mleNB))[1,1]
    regressors=initial_model1$coefficients
    # 转成列向量
    regressors=matrix(regressors, ncol=1)
    y=final_data$ClaimNb
    # 简化X矩阵构造
    X=cbind(1, final_data$VehValue, final_data$VehAge, final_data$DrivAge)
    n=nrow(final_data)
    
    # 计算W的对角元素向量
    mu = exp(X %*% regressors)
    w_vec = mu * (1 + mu / r)
    
    # 计算X^TWX
    X_weighted = sweep(X, 1, w_vec, `*`)
    XTWX = t(X) %*% X_weighted
    

这样既避免了内存耗尽的问题,又完全符合Fisher Scoring算法的计算要求。

内容的提问来源于stack exchange,提问作者mikaelaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:25:20