多量変数の線形回帰
変数が多くなるとき、その式をいちいち羅列して記入するのはダサい。
以下のようにするとかなりおしゃれ
f = a0*x0 + a1*x1 + a2*x2 + .... + an*xn
これを
A = [a0,
a1,
a2,
.
.
an]
X = [x0,
x1,
x2,
.
.
xn] (x0 = 1)
とすると、
f = transpose(A)*X
実践的なテク
フィーチャースケーリング
住宅価格の予測において、二つの特徴量を用いたとする。
x1が土地面積(100~10000)
x2が部屋数(1~5)
このとき、x1,x2の範囲にかなり差があるため、J(a0,a1,a2)はかなり歪んだ等高線を描く。
歪んだ等高線の場合、最急降下法を行うとあっちへ行ったり、こっちへ行ったりするため、非常に時間がかかる。
これを改善するために、計算前にスケールの調整を用いるとよい。
xnは約-1<=x<=1であることが望ましい。厳密である必要はない。
よって上記の例では、すべてのデータセットにおいて
x1/10000
x2/5 (これは別にしなくてもいい)
を行うと、等高線がきれいな円となり、計算速度が速くなる。
また、平均ノーマライゼーションという手法もある。
これはより整えたい場合に用いる。
範囲の平均で引いて、(最大値ー最小値)または標準偏差で割る。
上記の例で行くと
(x1-1000)/2000
(x2-3.5)/7
とすると、両方の範囲が-0.5から0.5の間に収まる。
学習率α
大きすぎると、どんなに回数を重ねてもmin J()が収束しない。
小さすぎると、収束に時間がかかる。
一つの解決手段は、αを0.01,0.03,0.1,0.3,1,3,...と三倍ずつ大きくしていくことだ
これで急に収束しなくなれば、その前の値で反復を重ねれば良い
非線形回帰
例えば、家の土地面積から価格を予測するとき、データセットのプロットが明らかに曲線を描いていたとする。
このとき、線形回帰と同様の手順で
h(x) = a0 + a1x + a2x^2 +a3*x^3
と定義すればよい。
ただし、ここではフィーチャースケーリングが大変重要となる。
面積の範囲が100以上、10000以下だとすると、
(面積)^2は10000以上10^8以下
(面積)^3は10^6以上10^12以下
となる。
つまり、スケーリングを怠れば大惨事だ。
しかし、冷静に考えて住宅価格が三次関数のように急に発散し出したり、
二次関数のように急に暴落することは考えがたい。
このとき便利なのが、ルートである
h() =a0 + a1x + a2√x
とすればどうだろう。後半になるにつれてゆるやかになることが表現できる。
正規方程式法
特徴量がn個のデータがm個あるデータセットを使ってyを学習させるとき
Xの行列を1列目をすべて1にし、2列目以降にデータセットを入れる。
画像は抗議より引用
よって、Xはm*(n+1)の行列
Yの行列はベクトルで表現する。
すると、求めるべきθは
{tran(X)X}^-1tran(X)*Y
として表せるようだ。
pinv(X' *X)*X'*Y
とoctaveでは表記できる。
最急降下法と正規方程式法の違い
どちらかの欠点がもう片方では補完されているため、
場合に応じた選択が必要である。
最急降下法の欠点
適切なαを選択する必要がある
より多くの繰り返しを必要とする。
正規方程式法の欠点
特徴量nが大きくなると時間はn^3倍になる。
よって、特徴量が多い場合は向かない。
n=10^4くらいが基準点になるようだ。
行列の逆数が見つからない場合
主に二つの原因が考えられる。
相関を互いに持つ特徴量があるとき
例えば住宅価格予測において、特徴量に土地の縦横の長さ、面積が含まれていたとする。
この二つの特徴は相関を持つため、どちらかを省くと逆数が見つかるだろう。
特徴量が多すぎる
例えばデータ量が10しかないのに、特徴量が100あるなどは逆数が見つかりにくいらしい。
特徴量を削ってみよう
#octaveの基本操作
行列の表記
A = [1 2; 3 4; 5 6]
4*4単位行列
B = eye(4)
Aが3*2の行列であることを[3, 2]という行列で返す。
size(A)
ファイルの読み込み
load fileName.factor
か
load ('fileName.factor')
行列からの取り出し
A(2,2)
4が取り出される
A(3, :)
[5, 6]が取り出される。
A=[1 2; 3 4; 5 6]
B=[11 12; 13 14; 15 16]
のとき
[A B]=
[1 2 11 12; 3 4 13 14; 5 6 15 16]
となる
[A;B]
だと縦に合体する。