对于线性回归,我想为n次多项式生成矩阵。
如果n为1
X=[x(:), ones(length(x),1)]
如果n为2
X=[x(:).^2 x(:) ones(length(x),1)]
...
如果n为5
X=[x(:).^5 x(:).^4 x(:).^3 x(:).^2 x(:) ones(length(x),1)]
如果我设置n = 6,我不知道如何使用matlab进行编码,它将自动生成所需的X矩阵。希望你能帮助我。
答案 0 :(得分:3)
这可以通过bsxfun
轻松完成:
X = bsxfun(@power, x(:), n:-1:0);
或者,在从R1016b开始的Matlab版本中,您可以使用implicit expansion:
X = x(:).^(n:-1:0);
答案 1 :(得分:0)
签出polyval功能。我相信这会满足您的需求。
要增加多项式以增加次数,可以使用循环来增加x = matrix(rnorm(1000*1000),ncol=1000)
microbenchmark::microbenchmark(.colSums(x,1000,1000), colSums(x),Rfast::colsums(x,parallel=0),
Rfast::colsums(x,parallel=1),times=1000)
Unit: microseconds
expr min lq mean median uq max neval
.colSums(x, 1000, 1000) 1313.268 1336.3600 1366.5152 1344.486 1355.1760 2468.310 1000
colSums(x) 1350.473 1366.2950 1401.0574 1374.420 1386.8210 2826.241 1000
Rfast::colsums(x, parallel = 0) 755.205 769.7440 801.5617 779.152 796.6850 1796.068 1000
Rfast::colsums(x, parallel = 1) 604.249 637.8185 680.3327 651.289 674.1675 1808.042 1000
x = matrix(rnorm(100000*100),ncol=100)
microbenchmark::microbenchmark(.colSums(x,100000,100), colSums(x),Rfast::colsums(x,parallel=0),
Rfast::colsums(x,parallel=1),times=1000)
Unit: milliseconds
expr min lq mean median uq max neval
.colSums(x, 1e+05, 100) 12.910733 12.971671 13.124897 13.011441 13.087346 26.914502 1000
colSums(x) 12.944944 13.012511 13.142074 13.058268 13.128400 14.879138 1000
Rfast::colsums(x, parallel = 0) 6.988414 7.009796 7.165310 7.068810 7.154765 16.826589 1000
Rfast::colsums(x, parallel = 1) 4.061679 4.251977 4.373995 4.296451 4.385827 7.610196 1000
参数的长度。
答案 2 :(得分:0)
如果您编写edit polyfit
,则可以看到MATLAB如何实现了polyfit
命令,该命令与您尝试执行的操作类似。在其中找到代码
% Construct the Vandermonde matrix V = [x.^n ... x.^2 x ones(size(x))]
V(:,n+1) = ones(length(x),1,class(x));
for j = n:-1:1
V(:,j) = x.*V(:,j+1);
end
这将构造您感兴趣的矩阵。此方法相对于bsxfun
的好处是您只计算x(:).^n
,然后保存中间结果。而不是将所有权力视为单独的问题,例如x(:)^(n-1)
作为x(:).^n
的另一个问题。