線形回帰のまとめ(その4、Pythonでのパフォーマンス比較)

前回は、線形回帰をPythonを使って、

  1. 数式で解くパターン
  2. 最急降下法を力技でやるパターン
  3. 最急降下法を行列で解くパターン
  4. ScikitLearnのライブラリを使うパターン
の4つの方法で実装してみました。

最後に、最急降下法が収束する様子を観察し、それぞれの方法でのパフォーマンスの比較をしてみようと思います。



最急降下法が収束する様子をグラフ化する


最急降下法のコードをちょこっと変形
w0=0
w1=0
alpha=0.001
iterations = 1000
L=np.empty([iterations, 1])
for i in range(iterations):
    w0, w1 = doDescent(X, Y, w0, w1, alpha)
    L[i] = computeCost(X, Y, w0, w1)

plt.plot(range(L.shape[0]), L)
plt.xlabel(u'最急降下法の繰り返し回数[回]')
plt.ylabel(u'目的関数J(θ)の値')
plt.show()


するとこんなグラフが出力されます。
せいぜい100回のループで収束してるようです。

ですが、移動量を決めるパラメータαを0.001に変更すると 
1000回でも収束しなくなりました。
データの値やサイズに応じて、適切なパラメーター設定が必要になるわけですね。


4つの方法でのパフォーマンス(応答時間)

収束したかどうかは別にして、α=0.1で1000回、10個~10万個の訓練データを与えてベタ回しした結果がこちらです。

グラフの縦軸は対数です。行列式も数式(sum計算)も健闘してますが、ライブラリの高速性には驚きますね。

いかがでしたでしょうか。(ブロガー的なこの言い回し好きじゃない)

線形回帰についてじっくり見てきました。次は線形じゃない場合を考えていかなければなりませんね。機械学習をマスターするにはまだまだ先は長そうです。頑張って書いていきましょう!

このブログの人気の投稿

MS Azure Information Protection を入れたら右クリックの「分類して保護する」がうざい

Zwiftがいきなり楽になってしまった件(顛末)