継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Cousera で「Machine Learning Course」の 第2週を受講した

タダです。

Cousera の 「Machine Learning Course」の2週目の講座を受けたので個人メモをまとめていきます。 www.coursera.org

第2週の講座は、次の4つのセクションになります。

  1. Multivariate Linear Regression
  2. Computing Parameters Analytically
  3. Submitting Programming Assignments
  4. Octave/Matlab Tutorial

なお、3.については課題の提出方法のレクチャーとなるため、まとめから割愛します。

Multivariate Linear Regression

  • N=1の特徴で最急降下法を使う場合、勾配降下方程式自体は一般に同じ形式で、n個の機能について以下のように繰り返すだけになる f:id:sadayoshi_tada:20190201200839p:plain

  • フィーチャースケーリングを使えば、特徴量の範囲を調整することで最急降下法を最も早く収束可能である

    • フィーチャースケーリングは、入力値を入力変数の範囲(すなわち、最大値から最小値を引いたもの)で割ることを含み、その結果、ちょうど1の新しい範囲が得られる
    • 値のレンジは小さすぎたりり、大きすぎたりしてはいけない
  • ノーマライゼーション(正規化)
    • 正規化では、入力変数の値から入力変数の平均値を減算することで、入力変数の新しい平均値がゼロになる
    • 範囲で割ったり、標準偏差で割ったりすると、結果が異なることに注意が必要である

参考: osozaki-engineer-tips.com

  • 多項式回帰
    • 仮説関数を二次関数、3次関数、平方根関数(またはその他の形式)にすることで、仮説関数の動作や曲線を変更できる

Computing Parameters Analytically

  • 正規方程式は最小二乗法の計算で役立つ方法として紹介されたが、いまいち理解しきれていないため理解でき次第また追記する

参考: omedstu.jimdo.com

  • 最急降下法と正規方程式のメリットデメリッ
    • 最急降下法
      • メリット:特徴量がたくさんあっても機能する
      • デメリット:学習率を選ぶ必要がある、たくさんのイテレーションが必要になり、処理が遅くなる
    • 正規方程式
      • メリット:学習率のアルファを選ぶ必要はなく実装はシンプル、イテレーションが不要
      • デメリット:X転置Xの逆行列を計算する必要がある、特徴量がたくさんあると遅くなる
  • 正規方程式の非可逆とは何か?
    • 2つの特徴が非常に密接に関連している(すなわち、それらは線形に依存している)冗長な特徴
    • 特徴が多すぎる場合は、いくつかの機能を削除するか、「正則化」を使用する
      • 上記の問題を解決するには、他の機能と線形的に依存している機能を削除するか、機能が多すぎる場合は1つ以上の機能を削除する

Octave/Matlab Tutorial

本項では、Octaveを使った文法の解説とベクトル化の実装が解説された

そもそもOctaveは高レベルプログラミング言語で、Andrew先生曰く初めて触れるプログラミングに触れる学生にも馴染むということだ

GNU Octave は、主に数値解析を目的とした高レベルプログラミング言語である。Octaveは線形ならびに非線形問題を数値的に解くためのコマンドライン·インタフェースを提供する。また、 MATLABとほぼ互換性のある、数値実験を行うためのプログラミング言語として使用することができる。 Octaveは、GNUプロジェクトの一つでGNU General Public Licenseの条件の下のフリーソフトウェアである。 GNU OctaveScilabは、MATLABオープンソース代替品の一つである。 ただし、Octaveは、ScilabよりもMATLABとの互換性維持に重点を置いている

ja.wikipedia.org

Octaveで特徴的だったのは、行列とベクトルの書き方である

# 行列の表現方法
>>A = [1 2; 3 4 ; 5 6]

#出力
# A =
# 
#   1   2   3
#    4   5   6
#    7   8   9

# ベクトルの表現方法
>>B = [ 1 ; 2 ; 3 ]

# 出力
#B =
#
#   1
#   2
#  3

行列のデータ参照は以下のように行う

# 行列の参照
>>A = [1 2; 3 4 ; 5 6]
>>A(2, 3)

# 出力(2行目3列目のデータを参照)
#ans =  6

>>A([1, 3], [2, 3])

#出力(1, 3行目で2, 3列目のデータを参照)
#ans =
#
#  2   3
#   8   9

その他、学んだ文法をまとめる

# for文
>>for i=1:5
i
endfor

#出力
#i =  1
#i =  2
#i =  3
#i =  4
#i =  5

#if文
>> a=1; b=2; x=0;
>> if ( a==1 && b==2)
x=1;
elseif( a==1 && b==2)
x=2;
else
x=3;
end
>> x

#出力
#x =  1

ベクトル化の実装では行列の内積の計算をOctaveで行う方法が紹介された

>> A = [1;2;3]

#出力
#A =
#
#   1
#   2
#   3

>> B = [4;5;6]

#出力
#B =
#
#   4
#   5
#   6

>> Answer = a` * b

#出力
#Answer =  2

>> display(ans)

#出力
#   2   3
#   8   9

まとめ

第2週のプログラムで以下のことを学びました。

  • フィーチャースケーリングは最急降下法で処理する場合、最も早く処理を完結できる
  • 最急降下法と正規方程式の使い分け
  • Octaveの文法や実装例

第3週のプログラムも引き続き受講していきます。

補完教材として、以下の本を読んでいます。こちらの書評も書きたい...!

関連記事

sadayoshi-tada.hatenablog.com sadayoshi-tada.hatenablog.com