2012-01-28 2 views
3

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 я ДНТ знаю, почему он работает в бесконечный цикл .. Я буду благодарен, если кто-то может предоставить мне с какой-либо другой конструкции или модификации код.

+1

'(pi-pi)^2' - это не просто' 0'? –

+0

Нет его на самом деле (pi -pi_cap)^2..матичные термины .. не беспокойтесь об этом. – gks

+0

Мы код для функции 'split'? Когда вы это понимаете, мне кажется, что вам просто нужно сделать объединение (u) множеств (эквивалентно 'hashSet.addAll'. – Perception

ответ

0

я ДНТ знаю, почему она впадает в бесконечный цикл

Это легко выяснить, почему. Просто вставьте несколько операторов печати, чтобы узнать, что происходит (или используйте отладчик). Например,

if(ttest.tTest(tTstatistic, errors, 0.10)){ 
     System.out.printf("About to split %d .. %d .. %d%n", start, splitPoint, limit); 
     union(split(series1, start, splitPoint)); 
     union(split(series1, splitPoint+1, limit)); 
    } 
    else 
     System.out.printf("Not splitting %d .. %d%n", start, limit); 
0

Ваш εi всегда равен нулю! Таким образом, ваше утверждение if после εi = (pi - pi)^2 всегда будет истинным!

Смежные вопросы