【问题标题】:Sparse matrix subsetting with row names带有行名的稀疏矩阵子集
【发布时间】:2018-08-21 08:37:35
【问题描述】:

我正在使用 glmnet 进行多项式和交叉验证的特征选择。一切都很好,但是只有不到 400 个预测变量和 4 个级别,输出变得有点混乱

X <- matrix(rnorm(350000),nrow=1000,ncol=350)
colnames(X) <- sample(LETTERS,350,TRUE)
Y <- factor(sample(LETTERS[1:5],1000,TRUE),levels =LETTERS[1:5])
out.cvfit <- cv.glmnet(x=X ,y=Y,standardize=TRUE,family="multinomial",parallel = TRUE,type.measure = "class")

然后我得到这样的输出:

coef.cv.glmnet(out.cvfit,"lambda.1se")
...
$D
351 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept) 0.06770556
F           .         
L           .         
B           .         
W           .         
V           .         
W           .         
G           .         
X           .         
G           .         
A           .         
G           .         
V           .         
Q           .         
T           .      
...

一个有点做作的例子,因为一切都是零,因为没有结构,但你明白了。

好的,跨多个级别查看并汇总提取的预测变量会变得非常麻烦。那么,有没有办法从稀疏矩阵中只提取非零预测变量?

【问题讨论】:

  • 你知道稀疏矩阵实际上只存储非零条目吗?

标签: r subset sparse-matrix glmnet


【解决方案1】:

我已将相关输出保存为a。然后,您可以使用[] 进行子集化。注意dgCMatrix中的.被识别为0

a <- coef.cv.glmnet(out.cvfit,"lambda.1se")$D
a[a[,1]!=0,]

使用的数据(您的示例的较小版本)。

set.seed(2018)
X <- matrix(rnorm(35000),nrow=1000,ncol=35)
colnames(X) <- sample(LETTERS,35,TRUE)
Y <- factor(sample(LETTERS[1:5],1000,TRUE),levels =LETTERS[1:5])
out.cvfit <- cv.glmnet(x=X ,y=Y,standardize=TRUE,family="multinomial",parallel = TRUE,type.measure = "class")

a <- coef.cv.glmnet(out.cvfit,"lambda.1se")$D
a[a[,1]!=0,]

 (Intercept)            R            G            R            T            Q            L            Z 
 0.017394446 -0.055170396 -0.006943011  0.006151795  0.017039835 -0.009432169 -0.047730565  0.065618965 

【讨论】:

  • 太棒了。正是我需要的。我使用as.data.frame() 转换输出以使我的400 个特征数据集具有可读性,但您的解决方案正是我需要找到的解决方案。谢谢!
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2018-01-19
  • 2012-09-23
  • 1970-01-01
  • 2014-03-06
  • 2021-02-23
相关资源
最近更新 更多