human
1. Hidden Markov Model (10 poin)
Soal 1.1 (8 poin)
Anda diberikan kelas Hidden Markov Model yang harus Anda lengkapi bagian-bagian di dalamnya. Dalam mengisi bagian-bagian tersebut, Anda tidak diperkenankan mengubah kerangka yang sudah diberikan.
Implementasikan metode/fungsi:
1. gamma (2 poin)
2. normalised_gamma (2 poin)
3. log_probability (2 poin)
4. fit (2 poin)
Untuk memudahkan, dalam implementasi di bawah ini variabel a adalah α dan variabel b adalah β.
assistant
#Here is the Python program you requested.
from tqdm.notebook import trange

class HMM:
    def __init__(self, p_start, p_trans, p_emit, p_stop=None):
        assert p_trans.shape[0] == p_emit.shape[0]
        self.p_start = p_start
        self.p_trans = p_trans
        self.p_emit = p_emit
        if p_stop is not None:
            self.p_stop = p_stop
        else:
            self.p_stop = np.ones(self.p_trans.shape[0]) # mengisi dengan 1 untuk probabilitas berhenti
    
    def forward(self, sequence: list):
        a = []
        for i, x in enumerate(sequence):
            if i == 0:
                a.append((self.p_start * self.p_emit[x]).values)
            else:
                a.append(
                    a[i-1].dot(
                        self.p_trans.dot(np.diag(self.p_emit[x]))
                    )
                )
        self.a = np.array(a)
        return self
    
    def backward(self, sequence: list):
        b = []
        prev_x = sequence[-1]
        for i, x in enumerate(sequence[::-1]): # membaca observasi dari belakang ke depan
            if i == 0:
                b.append(self.p_stop)
            else:
                b.append(
                    b[i-1].dot(
                        np.diag(self.p_emit[prev_x]).dot(
                            self.p_trans.T
                        )
                    )
                )
            prev_x = x
        self.b = np.array(b[::-1]) # mengembalikan urutan β
        return self
    
    def forward_backward(self, sequence: list):
        return self.forward(sequence).backward(sequence).normalised_gamma
    
    @property
    def gamma(self):
        """γ = α * β
        Mengembalikan nilai γ di setiap state.
        """
        pass
    
    @property
    def normalised_gamma(self):
        """Normalisasi γ agar mendapatkan probabilitas.
        Total semua nilai dalam satu baris = 1.
        """
        pass
    
    def log_probability(self, seq: list) -> float:
        """Menjalankan forward-backward agar mendapatkan nilai γ.
        Mengembalikan nilai log dari jumlah...