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

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

ただいまの
回答率

88.34%

MATLAB でオンラインで最小二乗法でパラメータを取得

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 721

前提・実現したいこと

MATLAB System Identification のRecursive Least Squares Estimatorブロックでオンライン最小二乗法を行いたい

MATLABのページ(https://jp.mathworks.com/help/ident/examples/online-recursive-least-squares-estimation.html)では、y(t) = a1*x(t-1) + a2*x(t-1)^2 + a3*y(t-1)の例が出ていますが、今回は単にy(t) = a*x(t) + b
なので、Regressorsは添付のSubsystemのように組みました。

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

Parametersは常にa = 1, b = 0となる

該当のソースコード

ソースコード

試したこと

添付の図のようにモデリングしました。
![イメージ説明](2ba4cd1f1b7887173f715c15ecaf1223.png)

subsystemは以下です。
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • obeSolitary

    2019/09/09 12:02

    質問に際し「前提・実現したいこと」など,用意されている見出しに対応する内容を書いていただけると
    やり取りがスムーズになるかと思います.

    キャンセル

回答 2

0

解決案

質問のタイトルだけでは詳しいことがよくわかりませんが,こちらで勝手に推測して回答いたします.
違う場合,「前提・実現したいこと」について追記してください.

  1. 「MATLAB でオンラインで」→ MATLAB Online(https://matlab.mathworks.com/)でと解釈.
  2. 「最小二乗法でパラメータを取得」→ 最小二乗法を適用するためのデータ点は取得済みで,
    指定次数の最小二乗近似式を求めたい.

多項式近似(polynomial fitting)を行う関数 polyfit(x,y,n) は,x と y が表すデータ点に対して
(最小二乗的に)最適な近似となる n 次多項式の係数を降べきの順で返すので,これを使います.

(例)5つのデータ点(1.3,14.4),(1.6,18.2),(1.7,18.9),(2.1,20.5),(2.3,21.3)に対する
1次の最小二乗近似式 P1(x)= a1 x + b1 のパラメータ a1, b1 の値を求めたい.
また,2次の最小二乗近似式 P2(x)= a2 x^2 + b2 x + c2 のパラメータ a2, b2, c2 の値を求めたい.
MATLAB Online での実行例

[ p2, s2 ] = polyfit(x,y,2); によって,2次の最小二乗近似式 P2(x)= a2 x^2 + b2 x + c2
のパラメータ(未定係数) a2, b2, c2 はそれぞれ p2(1), p2(2), p2(3) として得られます.

なお,Mathworks アカウントを未所持の場合,
Octave Online(https://octave-online.net/)でも同様のことが出来ると思います.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/09 13:25

    ありがとうございます。質問が中途半端で大変申し訳ございませんでした。

    時系列データ(x(t),y(t))があって、それをy = ax + bに近似したときにa, bを求めたいのですが、それを逐次求める方法を知りたいです。例えば、前もってt=0から100までの(x,y)の組が与えられたときのやり方はわかるのですが、逐次的に(オンラインで)やろうとするとやり方がわかりません。
    MATLABですとSystem Identification toolboxの”Recursive Least Squares Estimator”を使って、Regressorsにx, Outputにyを入れたのですが、うまくいきませんでした。
    コードを書こうと思いましたが、オンラインでやるとするとどのように書けばいいのかわかりません。
    前のa,bの値すなわち、a(t-1), b(t-1)からa(t), b(t)を再帰関数的な方法でかけばいいのでしょうか?

    キャンセル

  • 2019/09/09 14:35

    オンラインで,というのは online algorithm で(入力を完了する前から,逐次的に計算処理を進めてしまう)ということだったのですね.完全に勘違いをしておりすみません.

    即答できないので私も少し試してみますが,他の凄腕な方の回答を待つ方が確実かもしれません.

    キャンセル

  • 2019/09/09 15:01

    ご丁寧な対応ありがとうございました。こちらこそ、誤解を与える書き方で申し訳ございませんでした。

    キャンセル

0

y(t) = a * x(t) + b
なので、
以下のようにRegressorsのモデルを作成しなおしました。
イメージ説明
ですので、yはsubsystemの入力にはならず、Recursive Least Squares EstimatorのOutputへの入力のみとなります。

おそらく合っているかと思います。
System Identification toolboxを用いずにこのくらいコードで書けるようになりたいですが。勉強します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る