刚学习R 不懂如何将mathlab 代码 转换为 R 代码,请朋友帮忙转换,谢谢!
<br />
x=random_walk(1000,1);<br />
bottom_up(x, 20, 1)</p>
<p>
<br />
function data = random_walk(length_of_ts,number_of_ts)<br />
% Creates some test data.<br />
data = [];</p>
<p>for i = 1 : number_of_ts<br />
x = 0;<br />
for j = 2 : length_of_ts<br />
x(j) = x(j-1) + randn;<br />
end;<br />
data = [data x'];<br />
end;</p>
<p>
</p>
<br />
function segment = bottom_up(data,num_segments,forceplot)<br />
% This function approximates a time series by a sequence of piecewise linear segments.<br />
% This version is uncommented, email the author for details.</p>
<p>left_x = [1 : 2 : size(data,1)-1];<br />
right_x = left_x + 1;<br />
right_x(end) = size(data,1);<br />
number_of_segments = length(left_x );</p>
<p>for i = 1 : number_of_segments<br />
segment(i).lx = left_x(i);<br />
segment(i).rx = right_x(i);<br />
segment(i).mc = inf;<br />
end;</p>
<p>for i = 1 : number_of_segments - 1<br />
coef = polyfit([segment(i).lx :segment(i+1).rx]',data(segment(i).lx :segment(i+1).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i+1).rx]' ))+coef(2);<br />
segment(i).mc = sum((data([segment(i).lx :segment(i+1).rx]')-best).^2);<br />
end;</p>
<p>while length(segment) > num_segments<br />
[value, i ] = min([segment(:).mc]);</p>
<p> if i > 1 & i < length(segment) -1<br />
coef = polyfit([segment(i).lx :segment(i+2).rx]',data(segment(i).lx :segment(i+2).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i+2).rx]' ))+coef(2);<br />
segment(i).mc = sum((data([segment(i).lx :segment(i+2).rx]')-best).^2);<br />
segment(i).rx = segment(i+1).rx;<br />
segment(i+1) = [];<br />
i = i - 1;<br />
coef = polyfit([segment(i).lx :segment(i+1).rx]',data(segment(i).lx :segment(i+1).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i+1).rx]' ))+coef(2);<br />
segment(i).mc = sum((data([segment(i).lx :segment(i+1).rx]')-best).^2);<br />
elseif i == 1<br />
coef = polyfit([segment(i).lx :segment(i+2).rx]',data(segment(i).lx :segment(i+2).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i+2).rx]' ))+coef(2);<br />
segment(i).mc = sum((data([segment(i).lx :segment(i+2).rx]')-best).^2);<br />
segment(i).rx = segment(i+1).rx;<br />
segment(i+1) = [];<br />
else<br />
segment(i).rx = segment(i+1).rx;<br />
segment(i).mc = inf;<br />
segment(i+1) = [];<br />
i = i - 1;<br />
coef = polyfit([segment(i).lx :segment(i+1).rx]',data(segment(i).lx :segment(i+1).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i+1).rx]' ))+coef(2);<br />
segment(i).mc = sum((data([segment(i).lx :segment(i+1).rx]')-best).^2);<br />
end;<br />
end;</p>
<p>%----------------------------------------------</p>
<p>residuals=[];</p>
<p>for i = 1 : length(segment)<br />
coef = polyfit([segment(i).lx :segment(i).rx]',data(segment(i).lx :segment(i).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i).rx]' ))+coef(2);<br />
residuals = [ residuals ; sum((data([segment(i).lx :segment(i).rx]')-best).^2)];<br />
end;</p>
<p>if nargin > 2<br />
hold on;<br />
plot(data,'r');<br />
end; </p>
<p> temp = [];<br />
for i = 1 : length(segment)<br />
coef = polyfit([segment(i).lx :segment(i).rx]',data(segment(i).lx :segment(i).rx),1);<br />
best = (coef(1)*( [segment(i).lx :segment(i).rx]' ))+coef(2);<br />
segment(i).ly = best(1);<br />
segment(i).ry = best(end);<br />
segment(i).mc = [];<br />
if nargin > 2<br />
plot([segment(i).lx :segment(i).rx]', best,'b');<br />
end;<br />
temp = [temp; [segment(i).ly segment(i).ry]];<br />
end;</p>
<p>if nargin > 2<br />
for i = 1 : length(segment) - 1<br />
plot([segment(i).rx :segment(i+1).lx]', [ temp(i,2) temp(i+1,1) ],'g');<br />
end;<br />
end;</p>
<p>
</p>
原文地址:http://www.bearcave.com/software/market_trading/intraday_trading/Segmenting%20Time%20Series.html