雑ノート(仮)

適当なメモ。

Coursera Machine Learning week2 その1

重回帰分析 (multivariate linear regression)

単回帰分析(Linear regression with one variable)には以下の通り一つしか変数がないが、

h_\theta (X)=\theta_0 + \theta_1(x)

これが複数ある場合のデータセットでの分析を行える関数があるこれを重回帰分析と呼ぶ

新しく提示された定義
x_j^{(i)} = i件目の学習データのj番目のフィーチャ(変数)の値
x^{(i)} = i件目の学習データのフィーチャ(変数)ベクトル
m = 学習用のデータセットの数
n = フィーチャ(変数)の数
x_0 = 1として扱う

h_\theta (x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_3 + \cdots + \theta_n x_n

上記の関数はweek1で教わった行列を使った形に置き換え可能

\begin{align*}h_\theta(x) =
\theta^TX = 
\begin{bmatrix}\theta_0 \hspace{2em} \theta_1 \hspace{2em} ... \hspace{2em} \theta_n\end{bmatrix}\begin{bmatrix}x_0 \newline x_1 \newline \vdots \newline x_n\end{bmatrix}= \theta^T x\end{align*}

重回帰分析の場合の目的関数

変数がいくつ増えても以下の式で表すことができる


\begin{align*}& \text{repeat until convergence:} \; \lbrace \newline \; & \theta_j := \theta_j - \alpha \frac{1}{m} \sum\limits_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)} \; & \text{for j := 0...n}\newline \rbrace\end{align*}

フィーチャースケーリング(Feature Scaling)とmean normalization

最急降下法(Gradient Descent)の収束パフォーマンスを上げることができる

学習データとして与えたもののレンジが違いすぎる場合、最急降下法のパフォーマンスに影響が出る。その改善として

学習データx_{(i)}のレンジを -1< x_{(i)} < 1または-0.5< x_{(i)} < 0.5になるように変換すると早く収束するようになる。

Feature Scaling

最大値で割る
x_i := \frac{x_i}{\text{max of}x_i }

mean normalization

平均が0に近づくように調整する
x_i := \frac{xi - (\text{mean of }x_i)}{(\text{range of }x_i)}

最急降下法の学習効率aの選び方について

大きすぎると収束せず、遅すぎると時間がかかる

Andrew先生のおすすめは0.001から初めて3倍ずつ増やしていき、
収束しない学習効率の一つ手前のものを利用する方法。


0.003→0.01→0.03

データのフィットさせる仮説関数の形式の選択肢はたくさんある

1時関数、2時間数、3時間数、対数
などのグラフのどれがデータに会うかは開発者が選ぶことができる。
今後自動でどの数式が最適か判別するアルゴリズムを紹介すると行っていたが、今は「選べる」ことを理解して入ればいい。

ただし、3時間数などを選んだ場合はよりフィーチャースケーリングが大事になってくる。
(値の範囲はn乗のオーダーで膨らんでいくため。)

正規方程式

最急降下法の他に仮説関数のパラメータを求める方法として正規方程式というものがある
正規方程式は以下の定義になる

\theta = (X^TX)^{-1}X^Ty

Octaveで計算するならこんな感じ

pinv(x'*x)*x'*y

メリット

- 正規方程式を使う場合はフィーチャースケーリングは不要。
- 繰り返し演算を行う必要がない。
- 学習効率aを選ぶ必要がない

デメリット

- フィーチャーが多いと遅い。
- (X^TX)^{-1}が計算可能である必要がある

Andrew先生によると、逆行列の計算は行・列数=nのときO(n^3)でスケールするが
現代のコンピュータだとn = 10000 まで増えた場合は正規方程式と最急降下法のどちらを使うか迷うらしい。

SpectreのPoCの動かし方

世間を賑わしているGoogle Zero Projectが発見したCPUに関する2つのバグ、meltdownとspectreですが、 spectreのpocが公開されていたので手持ちのKali Linuxで動かしてみました。

www.exploit-db.com

char *secret = "The Magic Words are Squeamish Ossifrage.";

この文字の内容が不正にアクセスされてしまうデータです 適当に自分の名前などに置き換えてやって見ましょう。(私はpassw0rdで試しました)

また125行目のシングルクォートは環境によってはうまく動かない原因になるのでダブルクォートに置き換えましょう。

(value[0] > 31 && value[0] < 127 ? value[0] : ’?’), score[0]);

(value[0] > 31 && value[0] < 127 ? value[0] : "?"), score[0]);

適当な名前をつけてコンパイルして

gcc <適当な名前>.c

実行します

./a.out

結果

Reading at malicious_x = 0xffffffffffdfed68... Unclear: 0x70=’p’ score=972 (second best: 0x01 score=750)
Reading at malicious_x = 0xffffffffffdfed69... Unclear: 0x61=’a’ score=992 (second best: 0x01 score=725)
Reading at malicious_x = 0xffffffffffdfed6a... Unclear: 0x73=’s’ score=989 (second best: 0x00 score=604)
Reading at malicious_x = 0xffffffffffdfed6b... Success: 0x73=’s’ score=23 (second best: 0x00 score=9)
Reading at malicious_x = 0xffffffffffdfed6c... Success: 0x77=’w’ score=37 (second best: 0x01 score=16)
Reading at malicious_x = 0xffffffffffdfed6d... Success: 0x30=’0’ score=37 (second best: 0x01 score=16)
Reading at malicious_x = 0xffffffffffdfed6e... Success: 0x72=’r’ score=55 (second best: 0x00 score=25)
Reading at malicious_x = 0xffffffffffdfed6f... Success: 0x64=’d’ score=225 (second best: 0x00 score=110)
以下略

C言語は触ったことがあ流ので100行くらいのコードなら読めるかも、と思いましたが、全然わからないのでやめました。 解説はこちらの記事が詳しいです

qiita.com

Mac & Safari & US配列ユーザーがいますぐ見直すべきキーボードショートカット

macOSではCmd + Qがアプリケーションの終了となっています。 もちろんSafariも例に漏れずこのキーバインドでブラウザが終了してしまいます。

USキーボードでは英数/日本語の切り替えはCmd + Spaceです。 Cmd + Spaceで切り替えごに「q」から始まる単語を打つ、ということを高速で行うと間違ってCmd + qのアプリケーション終了のショートカットが走ってしまうことが良くあります。*1 わざわざ変換なんてしているのだから、ブラウザに長文でも書き込んでいるときに限って起こります😭

というわけで・・・

いますぐ Cmd + Q を無効化しましょう!!!

キーバインドの設定はSafariの環境設定ではなく、OS本体のシステム環境設定で行います

システム環境設定 > キーボード > ショートカット > アプリケーションの欄に

Safari>Safariを終了を追加しキーバインドを変更しましょう。

私は Cmd + Shift + Q を終了に割り当てています。 同じ要領でCmd + W(タブを閉じる)も変更しています*2

そもそもなぜCmd + Qなんて打ちやすいキーバインドにこんな危険な操作が割り当てられているのかわかりません。 Safariを急いで消す必要がある人なんているんでしょうか?

何はともあれ、ブラウザに打ち込んだ長文が消える人が一人でも少なくなりますように😇

*1:全く同時でなくても、cmdキーの当たり判定が残っているのか、ショットカットが発動することがある気がします

*2:Cmd + shift + wはOSかなんかに取られてるっぽくて設定できませんでした

Effective Java item1:Consider static factory methods instead of constructors

サービスプロバイダフレームワークの検証ができていないが、時間をかけすぎているのでこの辺で投稿。*1

コンストラクタだけでなく、static factoryメソッドも検討しましょう。

Boolean temp = new Boolean(true);//コンストラクタ
Boolean temp2 = Boolean.valueOf(true);//スタティックファクトリーメソッド

Static Factoryのメリット

1.名前が持てる

- コンストラクタはクラス名のみ。
- コンストラクタが複数ある場合は引数の意味を注意して覚える必要がある
- 複数のコンストラクタが存在する場合、適切な名前を持つ複数のStatic Factoryメソッドに書き直した方がいい

2.呼ばれるたびにインスタンスを作成しなくてもよい

- 例えば:FlyWeightパターン、Singletonパターン
   - 既存のインスタンスを使い回す柔軟なコーディングが可能。

3.サブクラスのインスタンスを返すことができる

例えば class Dog extends Animalこんなクラスがあるとして

Dogのスーパークラスのstatic factoryメソッドがdogインスタンスを返すことができる。

 Animal animal = Animal.newDog("potchi");
 animal.bark();

4.引数によって返すインスタンスのクラスを変更できる*2

例えばEnumSetクラスのstatic factoryメソッドのnoneofは引数のenumの数が - 64以下ならRegularEnumSetを - 65以上ならJumboEnumSetを返す

ちなみにこれはRegularEnumSet内部でEnumの要素の有無をlong型(64bit)の変数で管理しているからであり、 65以上の要素を持つEnumは扱えないので、代わりに内部でlong型の配列で値を保持するJumboEnumSetを返す。*3

5.戻り値のクラスはstatic factoryメソッド作成時に存在していないくていい

JDBCなどのライブラリの設計の根幹となる考え方らしい。Effective Java第2番にはサービスプロバイダーフレームワークの例が乗っていましたが、 これがごっそり削除されました。ここはJDBCなどをダウンロードしてしっかり検証すべき。*4

とのことだけどどんなのが載ってたんだろう。。。気になる。

デメリット

1.public,protectedのコンストラクタのないクラスははサブクラス化できない

例:コレクションフレームワーク内の便利な実装クラス*5はサブクラス化することができない。

2.適切な名前をつけないと見分けがつかない

コンストラクタはそのままクラス名がメソッド名になるが、スタティックファクトリは実装者が考えて命名する必要がある。以下のような命名が一般的らしい

from

引数の型からファクトリメソッドの型へ変換を行う

以下の例だとDateクラスのファクトリによってInstant -> Dateの変換が行われている

// example of "from"
Instant instant = Instant.now();
Date d = Date.from(instant);

of

複数のパラメータを含んだinstanceを作る

Set<Rank> faceCards = EnumSet.of(Rank.JACK, Rank.QUEEN, Rank.KING);

valueOf

その値をもつオブジェクトを作る

BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);

instance または getInstance

インスタンスが一つしか存在しないインスタンスを返す(シングルトン)

Calendar cal = Calendar.getInstance();

create または newInstance

getInstanceと違って返されるインスタンスはそれぞれ異なっている

Object newArray = Array.newInstance(String.class, 4);

getType

getInstanceに似ている。の唯一のインスタンスを返す。

FileStore fs = Files.getFileStore(path);

Filesクラスは他にも以下のようなgetType系のstatic factoryを保持している

getAttribute(Path, String, LinkOption...) getFileAttributeView(Path, Class, LinkOption...) getLastModifiedTime(Path, LinkOption...) getOwner(Path, LinkOption...) getPosixFilePermissions(Path, LinkOption...)

newType

getTypeと違って呼ばれるたびに返されるインスタンスを生成する

BufferedReader br = Files.newBufferedReader(path);

type

getType,newTypeの代替として使用される

Vector<String> v = new Vector();
v.add("aa");
v.add("bb");
List<String> testList = Collections.list(v.elements());

感想

  • サービスプロバイダフレームワークの箇所は説明が増えているがコード例がごっそり消えている
  • Static factoryを使えばジェネリクスをコンストラクタ、型両方に書く煩わしい記述を省略できる!との指摘は消えていました
Map<String,Integer> test = new HashMap<String,Integer>
Map<String,Integer> test2 = HashMap.newInstance
  • 第2版の日本語役で1.7で追加されたダイアモンド演算子型推論により解決していると指摘されていましたね。

ちなみにGoogle Collectionとして開発が進められていたGuavaですが、

qiita.com

著者のJoshua blochが関わっているためか、Mapクラスにこのsatatic factoryメソッドが実装されています

Map<KeyType, LongishValueType> mapGuava = Maps.newLinkedHashMap();

The library's design and code were advised and reviewed by Joshua Bloch

Google Guava - Wikipedia

Sunでコレクションを一通り作った知見を生かしてGoogleで作り直されたのでしょうか。 なかなか興味深いOSSですね😎

*1:最近はプログラミング環境の整備みたいなのをやりまくってて、トラブルシュートの時間が多すぎてあまり本質的な作業ができていない。JDBC等の導入も週末余裕があるときに進めようと思う。

*2:もちろん宣言クラスかそののサブクラス限定だが

*3:EnumSetを使ったことがないので調査に時間がかかった

*4:Javaで仕事をしたことがないのでこういう実戦寄りのライブラリとかに疎い

*5:ImmutableCollectionsのインナークラスのList1とか。

Coursera Machine Learning week1 まとめ

前からやろうと思っていたCourseraのMachine Learningのコースを始めた。

www.coursera.org

動画は外出先では見れないので、主に終業後、自宅で進めている。 ちょうどWeek1が終わったところなので勉強した内容を投稿

yuyubu.hatenablog.com

yuyubu.hatenablog.com

yuyubu.hatenablog.com

注意していること

他の勉強の進捗を下げない

最近は「テスト駆動開発」と「Eeffective Java」の写経と「プログラマーのためのSQL」の読書を進めているが、これらはやめない。

英語をボトルネックにしない

字幕がついてるから英語無理な人でもできる、との評判だが、出題問題などは訳されておらず英語力が皆無の場合は授業を進めるのが困難。個人的には「英語ができないこと」を理由に時間をかけたくない。対策として、各教材に消化目安時間が表示されているが、文章読解にそれ以上の時間をかけている場合は躊躇なく残りの文章をGoogle翻訳にぶち込むことで対処。

iOSアプリの開発で有名な堤さんもこの講座を受講したそうだが*1、堤さんも英語は躊躇なくGoogle翻訳にぶち込む派らしい。*2

学んだこと

Couseraの感想

Anderw先生自身がCouseraを始めたこともあってか、Couseraの使い方、というより授業の設計がかなりうまいと思う。 またノートも受講生が取らなくていいスタイルになっている。(完全に授業の内容に集中できる感じ。)

大学の授業でもノートを取らなくても良いように、あらかじめプリントで配ったり、授業のサイトにまとめておいて欲しかった。 自分は数値計算的な授業で毎回こういう数式を黒板から写経した覚えがあるが、あれは本当に時間の無駄だったと思う。写すことに必死で理解する時間がすごく少なくなるから。

良かったところ

  • 動画とリーディングの2パート構成
    • 動画の途中で画面が切り替わって選択問題がたまに出される。
      • 授業中に先生に当てられる感じ。
    • 今後はプログラムの提出も催促されるらしいので楽しみ

ここが微妙

ローカライズが微妙。まぁ有志のかたがやっているので仕方がない部分があるが、 翻訳の日本語自体は問題ないが、字幕の消えるタイミングが早すぎたり、ずれていたりで細かいところが気になる。*3

iOSアプリの挙動が不安定。DLした際はできの良さに驚いたが、すぐフリーズして使い物にならなくなった。動画がDLできるっぽいけど品質が上がればiPadなどにDLしてどこでも大学の授業を受けれるようになるのかもしれない。

他に必要な大学の価値は

  • オフィスアワー
  • 実験
  • TAによるサポート

だと思うのですべてなんらかの手段で代替できれば、未来の大学にとって変われると思う。

授業の感想

  • 難易度的には数学は中学生レベルのものがあれば理解できると思う
    • 理系とか文系とかほとんど関係ないレベル。
  • まじでy=ax+bこれが何を表しているかわかって入れば授業にはついてこれる。
    • 流石に1時関数をグラフに起こすとどうなるかとかはandrew先生も解説しない
  • 算数・数学の回避を最優先に人生を生きてきた人間には辛いと思う
    • 分数の計算が怪しい人とか普通にいるし。
  • 使われている数式を全て理解するには微分偏微分・解析の知識が必要
    • anderw先生が求めているのは中学生レベルの数学の知識程度であり、微分や解析はわからなくてもアルゴリズムを問題に適用できる
    • 一部学校でやったことあるような気がするが完全に忘れてる
    • ノートを書くのにすごく時間がかかっている。もう書かないかもしれない。

備考

  • はてなブログタイトルにに# や - を使わない方が良さそう
    • リンクを貼った時の埋め込みに失敗する。
    • この件でエントリを何度も作り直して投稿しました。通知など過剰に行ってましたらすみません。
  • はてなブログtex記法を使うとMarkdown記法と一部の記号が衝突してしまいうまく表示されないことがある。
  • プレビュー後のうまくレンダリングされなかったtexをコピペして下書きのtexの下に貼り付けて、消えているもの (Markdownとしてレンダリングされたもの)を見つけてエスケープすると良い。

  • 数式の表現はこれを使って求めている

  • はてなblogのtex記法では\indentや\newlineが使えない?texの解析エンジンの仕様か?  
    • \newlineは\\でできる模様。
  • octaveはweek2で入れる模様。
    • 私はもう入れましたが、トラブル続きのmacでもなぜかすんなり入りました。

*1:https://qiita.com/shu223/items/9e3a50e092c2997fe6d2

*2:iPhoneアプリ、BLE、機械学習。自分が学ぼうとしたことの先にいつも堤さんの足跡があるのがすごい

*3:特にweek1-3の範囲はひどかった。英語できない俺が字幕切ってやったレベル

Coursera Machine Learning week1 その3

行列とは

大括弧に閉じられた数字の配列のこと


  A = \left[
    \begin{array}{rrr}
      -1 & 20  \\
      42 & -5  \\
      7 & 8 
    \end{array}
  \right]

上の例は3*2の行列。(行数*列数で表現する)

\mathbb{R^{3*2}}と表すこともある。


各要素への参照はA_{ij}

  • i:行
  • j:列

で表す。



例) A_{21}=42

ベクトルとは

行列の特殊な形にすぎない。
n × 1の行列のこと。


  y = \left[
    \begin{array}{rrr}
      -1   \\
      42   \\
      7  
    \end{array}
  \right]


上記の例は3次元のベクトル。
\mathbb{R^3}と表すこともある。

y_{i}で上からi番目の要素を参照する
プログラミングとの兼ね合いでiが0始まりの場合と1始まりの場合の2パターンがあるが、この講義では基本的に1始まりとしている。

行列の足し算

同じ位置にある数値を足し合わせるだけ。同じ次元の行列しか足せない。


   \left[
    \begin{array}{rrr}
      -1 & 20  \\
      42 & -5  \\
      7 & 8 
    \end{array}
  \right] + 
   \left[
    \begin{array}{rrr}
      12& 3  \\
      4 & 1  \\
      3 & 2 
    \end{array}
  \right] = 
   \left[ 
    \begin{array}{rrr}
      11& 23  \\
      46 & -4  \\
      10 & 10 
    \end{array}
  \right]

行列の掛け算

行列の各要素に実数をかけるだけ。

  2 \times \left[
    \begin{array}{rrr}
      -1 & 20  \\
      42 & -5  \\
      7 & 8 
    \end{array}
  \right] = 
  \left[
    \begin{array}{rrr}
      -2 & 40  \\
      84 & -10  \\
      14 & 16 
    \end{array}
  \right]

行列とベクトルの積

ベクトルの要素数と行列の列数が一致していないと掛け算はできない。


  \left[
    \begin{array}{rrr}
      -1 & 20  \\
      42 & -5  \\
      7 & 8 
    \end{array}
  \right] \times
  \left[
    \begin{array}{rrr}
      -2   \\
      3  \\
    \end{array}
  \right]
 =   \left[
    \begin{array}{rrr}
      (-1 \times-2)+ (20 \times 3)   \\
      (42 \times -2) + (-5 \times 3)  \\
      (7 \times -2) + (8 \times 3)  \\
    \end{array}
  \right]
= \left[
    \begin{array}{rrr}
      62 \\
      99 \\
      10
    \end{array}
  \right]

この行列計算をoctaveでかくとこんな感じ

octave:1> y = [-1,20;42,-5;7,8]
y =

   -1   20
   42   -5
    7    8


octave:2> y2 = [-2;3]
y2 =

  -2
   3

octave:3> y * y2
ans =

   62
  -99
   10

行列と行列の掛け算

m行n列の行列 とn行o列の行列のみが積算が可能である
結果の行列の形はm行o列の行列になる。

[m × n] × [n × o] = [m × o]

片方の列と片方の行の数が一致しないと掛け算不可。



\begin{bmatrix} a & b \newline c & d \newline e & f \end{bmatrix} \times \begin{bmatrix} w & x \newline y & z \newline \end{bmatrix} =\begin{bmatrix} a\times  w + b\times y & a\times x + b\times z \newline c\times w + d\times y & c\times x + d\times z \newline e\times w + f\times y & e\times x + f\times z\end{bmatrix}

行列の掛け算には可換性がないことに注意(not commutative)

A \times B \neq B \times A

行列の掛け算にはスカラ(実数)の場合と同じく、結合法則が成り立つ

スカラ: (3 × 5 ) × 2 = 3 ×(5×2)
行列: A \times B \times C =

単位行列(Identity Matrix)

A * I = I * A = A が成り立つIのこと

2行2列の場合
 \left[
    \begin{array}{rrr}
      1 & 0  \\
      0 & 1  
    \end{array}
  \right]

3行3列の場合
 \left[
    \begin{array}{rrr}
      1 & 0 & 0  \\
      0 & 1  & 0  \\
      0 & 0 & 1
    \end{array}
  \right]

逆行列

Aに対して

 AA^{-1} = A^{-1}A = I

が成り立つA^{-1}のこと

(補足:I単位行列)

逆行列は以下のようにoctaveではpinv関数で求められる

octave:8> a = [3,4;2,16]
a =

    3    4
    2   16

octave:9> pinv(a)
ans =

   0.400000  -0.100000
  -0.050000   0.075000

octave:10> 

逆行列は正方行列(行数と列数が一致する行列)にのみ存在し
また全ての正方行列が逆行列を持つとは限らない。
逆行列を持たない正方行列のことを特異行列(singular)や縮退行列(degenerate)と行ったりする。

行列の転置(transposition)

ある行列Aに対して
B_{ij}=A_{ji}となるようなBを作ることを行列の転置と呼ぶ

またこのようなBをA^Tとも表現する

感想

はてなblogは編集がmarkdownモードだとtexの行列が表示できないようだ。
なので行列が登場するweek1-3のみはてな記法モードで書いた。
markdownというスマートなフォーマットがあるのになぜこのような記法を作るのかよくわからない。
というよりmarkdownの標準化がうまくされて、数式の記法なども統一されればこういうことは起こらないと思う。

Coursera Machine Learning week1 その2

week1の内容が長すぎるので3つに分けます

最急降下法(Gradient Descent)

 \text{repeat until convergence:} \lbrace

 \theta j:=\theta j-\alpha \dfrac {\partial }{\partial \theta _{j}}J\left( \theta _{0},\theta _{1}\right)

  \rbrace

  • 学習効率(Learning rate): \alpha
  • 導関数項(derivative term): \dfrac {\partial }{\partial \theta _{j}}J\left( \theta _{0},\theta _{1}\right)

導出数項は少しずつ0に近づくため、学習効率が固定されていても局所的最小値に収束する

最急降下法(Gradient Descent)を二条誤差目的関数(Squared error function)に適応して目的関数のパラメータを求める方法

  \dfrac {\partial }{\partial \theta _{j}}J\left( \theta _{0},\theta _{1}\right) =  \dfrac {\partial }{\partial \theta _{j}} \cdot \dfrac {1}{2m}\sum ^{m}_{i=1}\left( h_{\theta }\left( x^{(i)}\right) -y^{(i)}\right) ^{2}

  • 2.目的関数(h_\theta (X)=\theta_0 + \theta_1(x) )を適応する

  \dfrac {\partial }{\partial \theta _{j}}J\left( \theta _{0},\theta _{1}\right) =  \dfrac {\partial }{\partial \theta _{j}} \cdot \dfrac {1}{2m}\sum ^{m}_{i=1}\left( \theta_0 + \theta_1 x^{(i)} -y^{(i)}\right) ^{2}

  • 3.上記の関数をj=0,j=1に適応すると以下の結果になるらしい*1

j=0:\dfrac {\partial }{\partial \theta _{0}}J\left( \theta _{0},\theta _{1}\right) = \frac{1}{m} \sum\limits_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})

j=1:\dfrac {\partial }{\partial \theta _{1}}J\left( \theta _{0},\theta _{1}\right) =\frac{1}{m} \sum\limits_{i=1}^{m}\left((h_\theta(x^{(i)}) - y^{(i)}) x_{i}\right)

  • 4.最終形

 \text{repeat until convergence: } \lbrace

 \theta_0 := \theta_0 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m}(h_\theta(x_{i}) - y_{i})

  \theta_1 :=  \theta_1 - \alpha \frac{1}{m} \sum\limits_{i=1}^{m}\left((h_\theta(x_{i}) - y_{i}) x_{i}\right)

\rbrace

  • 最急降下法を実装するときの注意
    • 必ず\theta_1\theta_2を同時に更新すること
    • 局所最適(Batch)に落ち着く問題
      • 最急降下法ではローカル最適(Batch)に落ち着いてしまいグローバル最適を発見できない恐れがある
      • 凸型関数を利用すれば必ずグローバル最適を発見できる(曲最適に落ち着かない)

*1:どう変換したのかよくわからない