Im делает анализ временных рядов, на фондовом рынке данных и пытаемся реализовать алгоритм кусочно-линейной сегментацию, которая заключается в следующем:Рекурсивного время алгоритм сегментации серии
split(T [ta, tb ]) – split a time series T of length
n from time ta to time tb where 0 ≤ a < b ≤ n
1: Ttemp = ∅
2: εmin = ∞;
3: εtotal = 0;
4: for i = a to b do
5:εi = (pi − pi)^2 ;
6:if εmin > εi then
7: εmin = εi ;
8: tk = ti ;
9:end if
10:εtotal = εtotal + εi ;
11: end for
12: ε = εtotal /(tb − ta);
13: if t-test.reject(ε) then
14:Ttemp = Ttemp ∪ split(T [ta , tk ]);
15:Ttemp = Ttemp ∪ split(T [tk , tb ]);
16: end if
17: return Ttemp ;
Мой класс время серия следующим образом:
class MySeries{
ArrayList<Date> time;
Double[] value;
}
В приведенном выше алгоритме Ttemp является еще одним экземпляром таймсеров. Расчеты из строк 4-12 предназначены для вычисления ошибки.
Проблема заключается в том, что Im не в состоянии реализовать рекурсию и части соединения выше (строки 14 и 15). Не ясно, как рекурсировать и создать объединение объектов MySeries.
** * ** * ** * ***EDIT* ** * ** * ** * ** * ** * **
class Segmentation{
static MySeries series1 = new MySeries(); //contains the complete time series
static HashSet<MySeries> series_set = new HashSet<MySeries>();
public static MySeries split(MySeries series, int start, int limit) throws ParseException{
if(limit-start < 3){ //get min of 3 readings atleast
return null;
}
tTemp = MySeries.createSegment(series1, start, limit);
double emin = 999999999, e,etotal=0, p, pcap;
DescriptiveStatistics errors = new DescriptiveStatistics();
for(int i=start;i<limit;i++){
p = series1.y[i];
pcap = series1.regress.predict(series1.x[i]);
e = (p-pcap)*(p-pcap);
errors.addValue(e);
if(emin > e){
emin = e;
splitPoint = i;
}
etotal = etotal + e;
}
e = etotal/(limit-start);
double std_dev_error = errors.getStandardDeviation();
double tTstatistic = e/(std_dev_error/Math.sqrt(errors.getN()));
if(ttest.tTest(tTstatistic, errors, 0.10)){
union(split(series1, start, splitPoint));
union(split(series1, splitPoint+1, limit));
}
return tTemp;
}
static void union(MySeries ms){
series_set.add(ms);
}
}
Я написал код выше для данного algorithm..but я ДНТ знаю, почему он работает в бесконечный цикл .. Я буду благодарен, если кто-то может предоставить мне с какой-либо другой конструкции или модификации код.
'(pi-pi)^2' - это не просто' 0'? –
Нет его на самом деле (pi -pi_cap)^2..матичные термины .. не беспокойтесь об этом. – gks
Мы код для функции 'split'? Когда вы это понимаете, мне кажется, что вам просто нужно сделать объединение (u) множеств (эквивалентно 'hashSet.addAll'. – Perception