🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
プログラミング言語

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

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

Python

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

Q&A

解決済

2回答

2082閲覧

python、pykalmanのobservation_matrices.dotについてのエラー解決法

oosak

総合スコア3

プログラミング言語

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/01/05 12:00

始めまして、プログラミング初心者です

前提・実現したいこと

「時系列予測 自己回帰モデル 状態空間モデル 異常検知」という本にならってpykalmanを用いた時系列予測を試みています。
###質問の内容
pykalmanのobservation_matrices.dotという関数の規則が分からず、以下のエラーを解決できずにいます
###エラーメッセージ
AttributeError Traceback (most recent call last)
<ipython-input-89-0e81c18edc56> in <module>
7 print(current_cov)
8 print(current_state)
----> 9 pred_y[i]=kf.observation_matrices.dot(current_state)
10
11 plt.plot(np.hstack([pred_o_smoothed.flatten(),pred_y]),"--",label="forcast")
'NoneType' object has no attribute 'dot'

該当のソースコード

python

1#長期予測 2plt.plot(y.values,label="observation") 3pred_y=np.empty(len(test)) 4current_state=smoothed_state_means[-1] 5current_cov=smoothed_state_covs[-1] 6for i in range(len(test)): 7 current_state,current_cov=kf.filter_update(current_state,current_cov,observation=None) 8 print(current_cov) 9 print(current_state) 10 pred_y[i]=kf.observation_matrices.dot(current_state) 11 12plt.plot(np.hstack([pred_o_smoothed.flatten(),pred_y]),"--",label="forcast")

試したこと

kf.observation_matrices.dotの因数をcurrent_state,current_covの二つに設定すると同じエラー文が出ました。
また、コード中にあるkf.observation_matrices.dotがどのようなものか、今一わからないので、np.dot(current_state,current_cov)としてみたところ、ValueError: setting an array element with a sequence.
というエラーが出ました。

current_state,current_stateには[335.11076688 0. ],[[10.91607978 0. ]
[ 0. 0. ]]の値が入っています。

どうか回答宜しくお願いします

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1kf.observation_matrices.dot(current_state)

は、kf.observation_matricesというnumpy配列と、current_stateというnumpy配列のdot積で、

python

1np.dot(kf.observation_matrices, current_state)

と同じです
ベクトルの内積や行列の積を求めるnumpy.dot関数の使い方

kf = KalmanFilter(... の直後で

python

1print(kf.observation_matrices.shape)

を実行すると分かりますように、参考にされてる本の最初の例(98ページ)の場合は次元は下記の通り
(1, 2)

また、質問に挙げられているコードのforループの直前で

python

1print(current_state.shape)

を実行すると分かりますように、本の最初の例の場合は次元は下記の通り
(2,)

この次元の組み合わせならdot積が計算でき、結果は一つの数値になります

なお、本の例で次元の要素数が2になるのは、

python

1n_dim_trend = 2

で決まってますので、そこを変えたら要素数も変わります

エラーになるのなら、dot積が計算できない次元の組み合わせになっていると思うので、まずは次元を確認して、どちらの次元が間違っているのかを把握してください
その上で、次元がおかしい方が作られる過程を追いかけて、どこが間違っているか調べてください

投稿2021/01/06 04:37

jbpb0

総合スコア7653

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

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

jbpb0

2021/01/06 05:08 編集

> current_state,current_stateには[335.11076688 0. ],[[10.91607978 0. ] [ 0. 0. ]]の値が入っています。 current_state(とcurrent_cov)の次元は合ってますね それでエラーが出るなら、kf.observation_matricesの次元が間違っているのでしょう kf.observation_matricesは、分析したいデータとは無関係なもので、本のコードでの kf = KalmanFilter(... までを本の通りに書けば、次元は合ってエラーにはならないはずです そこから何か変えてませんか?
oosak

2021/01/06 06:59

回答、誠にありがとうございました。 ご指摘いただいたように、observation_matricesに問題があり、私がobservationのタイプミスをしていたために値が正しく入っていなかったようです。 以下は打ち直したコードの全体です from pykalman import KalmanFilter initial_state_mean=np.zeros(n_dim_state) initial_state_covariance=np.ones((n_dim_state,n_dim_state)) kf=KalmanFilter(n_dim_obs=n_dim_obs, n_dim_state=n_dim_state, initial_state_mean=initial_state_mean, initial_state_covariance=initial_state_covariance, transition_matrices=F, observation_matrices=H, observation_covariance=1.0, transition_covariance=Q) print(kf.observation_matrices.shape) 非常に初歩的な質問に答えていただきありがとうございます。
oosak

2021/02/02 15:18

返事が遅くなってしまいました。ありがとうございます、非常に助かります。
guest

0

私はカルマンフィルターを使ったことがありませんので、公式ドキュメントを少し覗いてみました。
公式ドキュメントを読む限り、kf.observation_matricesにはリストのリストを設定するもののようです。
oosakさんのソースコードではKalmanFilterのインスタンス生成時にNoneを設定しているので、None.dotというメソッドっぽいものを実行しようとして
'NoneType' object has no attribute 'dot'
が出ています。
しかしリストのリストを設定したとしても、
AttributeError: 'list' object has no attribute 'dot'
でエラーが出ます。

pred_y[i]=kf.observation_matrices.dot(current_state)
が間違っているのは確実ですが、これを書いたのがoosakさんなので、これ以上はわかりません。
可能性としは、お読みになった本では以下のように行うことが前提になっているのかもしれません。

python

1kf = KalmanFilter(transition_matrices = [[1, 1], [0, 1]], observation_matrices = np.array([[0.1, 0.5], [-0.3, 0.0]]))

全く知らない話ですので外している可能性は大きいですがご参考まで。

投稿2021/01/05 13:10

ppaul

総合スコア24670

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

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

jbpb0

2021/01/06 04:54 編集

https://dajiro.com/entry/2020/05/04/220313 の一つ目のカルマンフィルタのコードは、質問者さんが参考にしている本の最初の例と、ほとんど同じです kf = KalmanFilter(... の引数の「*_matrices」には、コードの始めの方にある FGHset という関数で作った配列を代入してます
ppaul

2021/01/06 05:28

やはり、numpyのndarrayなのですね。oosakさんが書き換えた結果、そこにNoneが入っているのがエラーの原因です。FGHsetを書き換えたとき、戻り値なしのreturnを書いてしまった、というのは良くある過ちですが、今回のはどうなんでしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問