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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

1回答

1707閲覧

matlabで最適化を行う

kakikukekonbu

総合スコア19

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2020/01/15 06:44

編集2020/01/16 09:00

前提・実現したいこと

制約付きの最小二乗法をmatlabで実装しています.
matlabの関数でlasso関数があるのでそれを使ってやっているのですが
エラーが返されている状況です.

最適化の式は以下のものです.
y =Xa, X = Xb, B = ω でlasso関数に代入しました.(B = lasso(X,y))
イメージ説明

どうかご教授お願いします.

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

エラー: lasso (line 231) パラメーター 'Y' は 'X' の列数と同じ長さをもつ実数値のベクトルでなければなりません。

###現在やったこと
Xbを転置させたが同じエラーが返された.

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

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

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

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

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

WathMorks

2020/01/15 09:51

その定式化ですと w が サイズAxBの行列でなければなりませんが、それで正しいですか?
WathMorks

2020/01/15 10:11

また「制約付き」とありますが、定式化には見当たりません。正則化項付き、のことですか?
kakikukekonbu

2020/01/16 08:04

説明不足ですみません. 正則化項付きの最小二乗法です.
WathMorks

2020/01/16 08:39

今の定式化ですと、wは行列でなければなりませんが、それは想定内ですか?
WathMorks

2020/01/16 09:03

size(y) size(X) を確認してください
kakikukekonbu

2020/01/16 09:04

以前質問させていただいたときに,ωは横ベクトルと見て y =Xa, X = Xb, B = ω  の対応でlasso関数に入れればもとめたいωが出るといわれてやってみたのですが 違いましたでしょうか.
kakikukekonbu

2020/01/20 02:37

Y:27×256 single X:60×512 single です,
WathMorks

2020/01/22 02:16

であればwは行列、といいたいところですが、Y,Xの列数が違いますね。 列数を揃えてください。
guest

回答1

0

ベストアンサー

もとの定式化はmatlabのlassoにそのまま放り込める形にはなっていません。
matlabのlassoはyが縦ベクトルであることが前提です。
size(y)
size(X)
をチェックしてしかるべくサイズの調整をすれば解決します。

追記
yも2次元配列ということでしたら、問題を等価なベクトル形式に変更するというのが(最も安直な)方法です.
kronを使用するためAのサイズが大きくなりますが、今のサイズならそれほど問題にはならないでしょう。

matlab

1Y=rand(27,256); 2X=rand(60,256); 3 4n1=size(Y,1); 5n2=size(X,1); 6b=Y(:); 7A=kron(X',eye(n1)); 8W=lasso(A,b); 9[~,n3]=size(W); 10w=reshape(W,n1,n2,n3);

ADMMならkronを使用する必要がなく,メモリーや速度は気になりません。興味があれば実装してみてください。

投稿2020/01/16 09:12

編集2020/01/25 04:40
WathMorks

総合スコア1582

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

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

WathMorks

2020/01/16 10:20

0: yが1次元配列であることを確認する。そうでなければ以下の方法は適用できない。 1:(行ベクトルの可能性があるので)y=y(:)と列ベクトル化する 2: length(y)とsize(X,1)が同じかチェック. 同じならB=lasso(X,y); 3:サイズが異なるなら B = lass(X',y);
kakikukekonbu

2020/01/21 05:58

yがY:27×256 singleになっているのでlasso関数は使えないということになりますかね
WathMorks

2020/01/21 12:51

別の方法があります。
kakikukekonbu

2020/01/22 02:38

B = reshape(A,sz) これを用いて列数を揃えればよろしいでしょうか.
WathMorks

2020/01/22 02:52

定式化が正しくなされていない、ということです。 YとXを近似的に結び付けるスパースな行列wを探したいようですが、 YとXの列数が異なるため、そのようなwは存在しません。
kakikukekonbu

2020/01/22 04:33

知識が薄くすみません. XとYの列数が異なる場合,lassoを適用するにはどうしたらよいのでしょうか. リッジ正則化の場合でしたら, ω = y * ((X*X' + lambda*eye(size(X,1))) \ X)'; で解けたのですが,どうしたらよいのかわからない状況です
WathMorks

2020/01/22 11:23

Y:27×256 single X:60×512 single とのことですが、もしそうならリッジ正則化でも解けません。サイズが異なるので積が定義できないからです。 しかし「解けた」ということならY,Xの列数が同じはずです。 リッジ正則化で使ったy, Xのサイズは本当に Y:27×256 single X:60×512 single ですか?
kakikukekonbu

2020/01/24 06:30

Y:27×256 single X:60×256 single でした間違えてましたすみません.
WathMorks

2020/01/25 04:41

lambdaを設定したい場合は, matlab lasso のドキュメントを参照してください。
kakikukekonbu

2020/01/25 06:04

データは以下のようになっていたのですが、 Y:27×256 single X:60×256 single この場合lasso関数は使えないのでしょうか。
WathMorks

2020/01/25 06:10

直接は使えません。回答にあるように変形すると(とりあえず)使えます。
WathMorks

2020/01/25 06:13

セットアップが面倒ですが、cvxを使うというのも手です。 こちらは誰でも簡単に使えるように設計されています。
kakikukekonbu

2020/01/25 06:32

セットアップして、 今回私が解きたい最小二乗問題を解くようにすればできる感じでしょか。 とりあえず一度挑戦してみます。
kakikukekonbu

2020/02/04 03:45

kronを使って変形させているのですが,元のデータに影響は出ないのでしょうか.
kakikukekonbu

2020/02/04 04:09

度々すみません. lasso関数の部分のエラーは解決できました!ありがとうございます. 実は,最小二乗法の後に, D=sqrt(sum(sum((Xa-TL*Xb).^2))/256); を解かなければならいのですが,TLのサイズが合わないため解くことができません (TL:1620×100 single) TLの解として理想なのは27×60 singleなのですが,不可能でしょうか リッジ正則化項を加えたときは,リッジの解が27×60 singleになり,後の式もうまく計算できたのですが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問