質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

1回答

3000閲覧

Pythonでビタビアルゴリズムを行いたい

mayoyo

総合スコア2

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/09/24 20:09

前提・実現したいこと

Pythonで隠れマルコフモデルを用いたプログラムを試しています。
以下のサイトを参考に試していたのですが、IndexErrorが出てしまい自力では解決できませんでした。
対処につき、ご教授お願い致します。
<参考サイト>
http://www.blackarbs.com/blog/introduction-hidden-markov-models-python-networkx-sklearn/2/9/2017
https://github.com/alexsosn/MarslandMLAlgo/blob/master/Ch16/HMM.py

発生している問題・エラーメッセージ

Traceback (most recent call last): File "~~割愛~~", line , in <module> path,delta,phi = viterbi(pi, a, b, obs) File "~~割愛~~", line , in viterbi path[t] = phi[path[t + 1], t + 1] IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

該当のソースコード

python

1def viterbi(pi, a, b, obs): 2 nStates = np.shape(b)[0] 3 T = np.shape(obs)[0] 4 5 # init blank path 6 path = np.zeros(T) 7 # delta --> highest probability of any path that reaches state i 8 delta = np.zeros((nStates, T)) 9 # phi --> argmax by time step for each state 10 phi = np.zeros((nStates, T)) 11 12 # init delta and phi 13 delta[:, 0] = pi * b[:, obs[0]] 14 phi[:, 0] = 0 15 16 print('\nStart Walk Forward\n') 17 # the forward algorithm extension 18 for t in range(1, T): 19 for s in range(nStates): 20 delta[s, t] = np.max(delta[:, t - 1] * a[:, s]) * b[s, obs[t]] 21 phi[s, t] = np.argmax(delta[:, t - 1] * a[:, s]) 22 print('s={s} and t={t}: phi[{s}, {t}] = {phi}'.format(s=s, t=t, phi=phi[s, t])) 23 24 # find optimal path 25 print('-' * 50) 26 print('Start Backtrace\n') 27 path[T - 1] = np.argmax(delta[:, T - 1]) 28 # p('init path\n t={} path[{}-1]={}\n'.format(T-1, T, path[T-1])) 29 for t in range(T-2, -1, -1): 30 path[t] = phi[path[t + 1], t + 1] 31 # p(' '*4 + 't={t}, path[{t}+1]={path}, [{t}+1]={i}'.format(t=t, path=path[t+1], i=[t+1])) 32 print('path[{}] = {}'.format(t, path[t])) 33 34 return path, delta, phi 35 36path,delta,phi = viterbi(pi, a, b, obs) 37 38print('\nsingle best state path: \n', path) 39print('delta:\n', delta) 40print('phi:\n', phi)

試したこと

以下の質問の回答を参考にenumerate関数を用いたり、int(t)にしてみたりと試してみましたが同じ内容のエラーが出てしまいました。
https://teratail.com/questions/159836
https://teratail.com/questions/77978

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アルゴリズムの中までみてないですが、pathは配列のインデックスとして使うのでdtypeをintに指定する必要があります。
dtypeを指定しない場合、デフォルトはfloatになっています。
phiもintになると思います。

python

1# 2path = np.zeros(T, dtype=int) 3phi = np.zeros((nStates, T), dtype=int)

投稿2021/09/24 23:38

編集2021/09/24 23:39
bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bsdfan

2021/09/25 03:37

コメントありがとうございます。 参考ページは隅までチェックしましょう、ですね。
mayoyo

2021/09/25 13:58

ご回答ありがとうございます。返信が遅くなり申し訳ありません。 ご指摘いただいた通りにdtypeをintに指定することで解決することができました! 参考ページにも書かれていたのですね... これからはもっと隅まで注意して確認したいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問