【问题标题】:Vectorize method for N period moving slopeN周期移动斜率的矢量化方法
【发布时间】:2016-10-06 08:42:27
【问题描述】:

谁能帮我矢量化移动斜率计算。我试图消除 for 循环,但我不知道该怎么做。

>> pv = [18 19 20 20.5 20.75 21 21.05 21.07 21.07]'; %% price vector 

>> slen = 3; %% slope length

function [slope] = slope(pv , slen)
svec = (1:1:slen)';
coef = [];
slope = zeros(size(pv));

for i = slen+1 : size(pv,1)
      X = [ones(slen,1) svec];
      y = pv( (i - (slen-1)) : i );
      a = X\y;
      slope(i,1) = a(2); 
end

>> slp = slope(pv,3)

slp =
        0
        0
        0
     0.75
    0.375
     0.25
     0.15
    0.035
     0.01

谢谢

【问题讨论】:

  • 是的,抱歉,它是 slen(坡度长度)。我在发布之前重命名了变量并错过了它。我会编辑它。 tks

标签: matlab regression vectorization


【解决方案1】:

编辑:完全改变答案以使其可扩展

function [slope] = calculate_slope(pv , slen)  %% Note: bad practice to give a function and variable the same name

svec = (1:1:slen)';
X = [ones(slen,1) svec];

%% the following two lines basically create the all the sliding windows of length slen (as a submatrix of a larger matrix)
c = repmat ( flipud(pv), 1, length(pv))
d = flipud(reshape(c(1:end-1), length(pv)-1, length(pv) + 1));

%% then run MATLAB solver with all windows simultaneously
least_sq_result = X\d( end - slen + 1:end, (slen+1):end);
slope = [zeros(slen-1, 1); least_sq_result(2,:)'];  %% padding with zeros is optional

编辑:固定交换索引

【讨论】:

  • 谢谢 gariepy。你说得对,我想从组中的最高索引开始索引。这种方法是否适用于 slen 的其他值?我正在尝试 slen = 5 两种方法不一致。
  • 我意识到有一个错误,我忘了概括第二个pv 表达式中的下标。你是对的,对于更高的 slen 值,你不会得到完全匹配。您有一个超定系统,MATLAB 执行最小二乘回归以产生“平均”斜率,而我的方法依赖于旧的 rise/run 斜率公式。
  • 感谢您的帮助。
  • 这个例子让我学到了很多东西。谢谢你。我确实注意到需要在最后一行中进行此更改 slope = [zeros(slen-1, 1);最小平方结果(:,2)'];应该是斜率 = [zeros(slen-1, 1);最小平方结果(2,:)'];只是在 least_sq_result 矩阵上反转的行和列
  • @TBoggs:您对索引交换的看法是正确的...我已经编辑了解决该问题的答案。感谢您指出这一点!
【解决方案2】:

使用最小二乘回归在滑动窗口中查找斜率等效于一阶 Savitzy-Golay 滤波(使用微分滤波器)。 SG 滤波的概念是在滑动窗口中执行局部多项式拟合,然后使用局部模型对信号进行平滑处理或计算其导数。当数据点的时间间隔相等时(就像这里一样),通过预先计算一组滤波器系数,然后将它们与数据进行卷积,可以非常有效地运行计算。这应该比构建一个巨大的矩阵并对其进行回归要快得多。

这是一种非常标准的技术,而且肯定有现成的 matlab 代码在流传。搜索“Savitzky-Golay 分化”之类的内容。请注意,SG 过滤器也可以执行平滑处理(matlab 内置的 SG 过滤函数可以执行此操作),但您需要执行微分的版本。

Savitzky and Golay (1964)。用简化最小二乘法对数据进行平滑和微分

【讨论】:

  • 谢谢,我会查一下这个方法。上面概述的方法适用于大型数据集。谢谢。我会看看我是否可以通过 SG 过滤获得一些东西并回发。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多