2016-03-28 5 views
1

Я реализовал скрытые марковские модели 1-го, 2-го и 3-го порядка, используя HashMaps, в отличие от матрицы перехода. Я использую эти HMM для подсчета количества вхождений музыкальных нот (смоделированных как целые числа 0-128) после 1 примечания/2 примечания/3 примечания, в зависимости от заказа.Многоуровневая реализация HashMap Nth Order HMM

Например, реализация для 2-го порядка:

public void updateWeigths(ArrayList<Note> notes, HashMap<Integer, HashMap<Integer, HashMap<Integer, Double>>> hm) { 
    for (int i=0; i<notes.size()-2; i++) { 
     int prevPitch1 = notes.get(i).getPitch(); 
     int prevPitch2 = notes.get(i+1).getPitch(); 
     int nextPitch = notes.get(i+2).getPitch(); 
     if (prevPitch1 > 0 && prevPitch2 > 0 && nextPitch > 0) { 
      if (hm.containsKey(prevPitch1)) { 
       HashMap<Integer, HashMap<Integer, Double>> nextMapping1 = hm.get(prevPitch1); 
       if (nextMapping1.containsKey(prevPitch2)){ 
        HashMap<Integer, Double> nextMapping2 = nextMapping1.get(prevPitch2); 
        if (nextMapping2.containsKey(nextPitch)) { 
         double prob = nextMapping2.get(nextPitch); 
         nextMapping2.put(nextPitch, prob+1); 
        } 
        else { 
         nextMapping2.put(nextPitch, 1.0); 
        } 
       } 
       else { 
        nextMapping1.put(prevPitch2, new HashMap<Integer, Double>()); 
       } 
      } 
      else { 
       hm.put(prevPitch1, new HashMap<Integer,HashMap<Integer,Double>>()); 
      } 
     } 
    } 
} 

Я хочу осуществить произвольный СММ порядка, используя один и тот же шаблон. Я пытался использовать полиморфизм, но каждый раз получаю ClassCastException. Не совсем уверен, как использовать Generics для этого. Трюк, я думаю, должен знать, когда вы на последнем HashMap, чтобы вы могли обновить значение Double.

Любые предложения были бы замечательными!

ответ

0

Мне удалось решить проблему с использованием наследования объектов и рекурсии. Весы теперь обновляются путем повторения нот из данных обучения и вызова этой функции на каждую ноту.

К функции, которую вы передаете в экземпляр HashMap<HashMap<Integer, Object>, который представляет собой структуру данных, которая содержит вероятности перехода, порядок HMM и индекс примечания из массива учебных заметок.

public void updateTransitionProb(Object mapping, int ord, int noteIndex) { 
    int note = notesList.get(noteIndex).getPitch(); 
    HashMap<Integer, Object> hm = (HashMap<Integer, Object>) mapping; 

    if (ord == 0) { 
     hm.put(note, (hm.get(note) != null) ? ((Double) hm.get(note)) + 1.0 : new Double(1.0)); 
    } 
    else { 
     if (hm.containsKey(note)) { 
      this.updateTransitionProb(hm.get(note), --ord, ++noteIndex); 
     } 
     else { 
      hm.put(note, new HashMap<Integer, Object>()); 
      this.updateTransitionProb(hm.get(note), --ord, ++noteIndex); 
     } 
    } 
} 

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

  • Нет связанных вопросов^_^