1

正しい数学用語を使用していない場合は申し訳ありませんが、私が達成しようとしていることを理解していただければ幸いです。

私の問題: 結果 z に対する 2 つのベクトル x と y の値に対して線形回帰 (現在は最小二乗法) を使用しています。これは matlab で行う必要があり、\-operator を使用して回帰を実行しています。私のデータセットには、数千の観測が含まれます (最大で約 50000 まで)。

x 値は 10 ~ 300 の領域 (ほとんどは 60 ~ 100 の間) にあり、y 値は 1 ~ 3 の領域にあります。

私のコードは次のようになります。

X = [ones(size(x,1) x y];
parameters = X\y;

出力「パラメータ」は、次の式で使用される 3 つの係数 a0、a1、および a2 です。

a0 * 1 + a1 * xi + a2 * yi = zi

(i には添え字が必要です)

これは期待どおりに機能しますが、ベクトル z が負の場合でも、2 つのパラメーター a1 と a2 を常に正の値にする必要があります (これは、もちろん a0 が負になることを意味します)。 (z は常に x と z に正の相関があります)。これは最小二乗法を使用して可能ですか? また、線形回帰の他のアルゴリズムにも対応しています。

4

2 に答える 2

1

簡単な解決策は、それを解決するために設計されたツールを使用することです。つまり、最適化ツールボックスから lsqlin を使用します。3 つのパラメーターのうち 2 つに下限制約を設定します。

したがって、x、y、および z がすべて COLUMN ベクトルであると仮定すると、

A = [ones(長さ(x),1),x,y];

lb = [-inf, 0, 0];

a = lsqlin(A,z,[],[],[],[],lb);

これにより、2 番目と 3 番目の未知のパラメーターのみが制約されます。

最適化ツールボックスがない場合は、matlab 自体の一部である lsqnonneg を使用します。ここでも解決策は簡単です。

A = [ones(長さ(x),1),x,y];

a = lsqnonneg(A,z);

あなたのモデルは

z = a(1) + a(2)*x + a(3)*y

a(1) が本質的にゼロである場合、つまりゼロの許容範囲内にある場合、最初のパラメーターがゼロでの境界によって制約されていると仮定します。その場合、A の 1 の列の符号を変更して、2 番目の問題を解決します。

A(:,1) = -1;

a = lsqnonneg(A,z);

この解の a(1) が有意にゼロでない場合、2 番目の解は最初の解よりも優れている必要があります。モデルは次のようになります

z = -a(1) + a(2)*x + a(3)*y

lsqnonneg の呼び出しはせいぜい 2 回で済み、2 回目の呼び出しはほんの一部 (問題に関する情報がないため、2 回目の呼び出しの 50% の確率) しか行われません。

于 2009-03-31T16:28:16.737 に答える
1

明確にするために言い換えてみます。モデルによると、z は常に x および y と正の相関があります。ただし、係数の線形回帰を解くと、負の値が得られることがあります。

データが正しければ、これは正しい係数が小さく、ノイズによってたまたま負になる場合にのみ発生するはずです。ゼロに代入することもできますが、平均は適切に一致しません。

その場合、正しい解決策はjpalacek の言うとおりですが、ここで詳しく説明します。

  1. x と y に対して回帰を試みます。両方とも正の場合、結果が得られます。
  2. a1 が負の場合は、ゼロであると仮定します。y に対して z を回帰します。a2 が正の場合、a1 を 0 として、この回帰から a0 と a2 を取得します。
  3. a2 が負の場合、それもゼロであると仮定します。z を 1 に対して回帰し、これを a0 とします。a1 と a2 を 0 とします。

これにより、必要なものが得られるはずです。

于 2009-02-20T12:40:03.770 に答える