我有一个大约30000行15列的矩阵,以及一个大小为1x 15的向量。我想用矩阵中的每一行作为因变量,向量作为预测变量来拟合样条曲线。对于每个样条曲线,我想用一个x值进行预测,并将所有预测添加到向量中。
有没有什么方法可以跳过for循环来解决这个问题并降低时间复杂度?
以下是一些示例数据:
基质:
载体:
0.000 5689.072 11915.687 19188.547 27796.767 37742.035 49564.349 64430.295 84381.754 111870.835 149611.382 221043.651 362982.876 583956.304 1120546.126
我目前的解决方案是循环遍历矩阵的行,将每行和向量附加到一个临时数据框中,拟合样条并进行预测。我还尝试了sapply,时间复杂度的改进非常有限。
for循环解决方案:
library(splines)
beta = function(matrix, vector){
predictions = c()
for (i in 1:nrow(matrix)){
# Temporary data frame
temp_df = data.frame(y = matrix[i,], x = vector)
# Fit a spline for each observation
spline = lm(y ~ ns(x, df = 7), data = temp_df)
# Predict a value and add to vector
predictions = c(predictions, predict(spline, data.frame(x = 10000)))
}
return(predictions)
}
system.time(beta(matrix, vector)) # user 62.89
sapply解决方案:
fun = function(i){
predictions = c()
temp_df = data.frame(y = matrix[i, ], x = vector)
predictions = c(predictions, predict(lm(y ~ ns(x, df = 7), data = temp_df), data.frame(x = 10000)))
return(predictions)
}
system.time(sapply(1:nrow(matrix), fun)) # user: 53.42
样条的类型对我的解决方案来说并不重要,使用的包也不重要。我曾试图同时直接为矩阵的所有行拟合样条,但没有成功。
我需要能够扩大矩阵约1 500 000 x 15,并做几个不同的预测在短时间内通知.会真的很感激一些帮助.
先谢谢你了!
1条答案
按热度按时间9ceoxa921#
你可以将你的30000 x15矩阵转置到15 x30000,然后对它进行多变量线性模型,然后预测将全部发生在一条线上。
创建于2023-04-01使用reprex v2.0.2
在我的机器(MacBook Pro,M1 Max)上,对于一个30 k x 15的值矩阵,for循环大约需要27秒,多元线性模型大约需要15秒。
另一种替代方案是只进行矩阵乘法以得到系数,然后从系数生成预测。
对我来说,
matfun(mat, vet)
对于一个30 k x 15的矩阵只花了0.007秒,比其他任何一种方法都快。所有三种解决方案都产生相互关联的预测值为1。如果你想要的只是预测值,那么矩阵函数是最快的。