Udemyで学べる機械学習を全部見てみたんで、お勧め報告


# 結論
下記4つがオススメ上から順に見ていく事をオススメします。
[【4日で体験】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)

[みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習](https://www.udemy.com/learning-ai/)

[ゼロから作るニューラルネットワーク【Python 3 + NumPyでバックプロップを徹底マスター】](https://www.udemy.com/neuralnet/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)

[アプリケーション開発者のための機械学習実践講座](https://www.udemy.com/ml_for_app_developers/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)

# 大前提
## この記事を書いてる人
本職 Railsサーバーエンジニア（iphoneアプリ プログラマでもある）
三十半ば、三十歳過ぎてからプログラマになった。
変わり種とか突然変異と言われてる。

今後は比較的短期間（一年位）でデータサイエンティストになり
さらなる給料アップを企んでいる。

## 想定している読者
機械学習だけでなくプログラミング自体も初心者に向けています。

# 前置き Udemyと動画学習について
## Udemyとは？
[Udemy：オンライン学習ーいつでも どこでも自分のペースで学べます。](https://www.udemy.com/courses/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)

dotinstallのスーパーサイヤ人版

dotinsatllは1コース30分位で終わるが
Udemyは有料だが数時間でプロダクトレベルのアプリケーションを
作れるコースが多数公開されている

数年前までネットワーク不安定で動画が途切れることが多かったが
いまはそんな事なし

また以前は1コース5、6万だったが今はかなり価格が下がった上
定期的にセールを行ってくれている

## dotinstallって？
[ドットインストール - 3分動画でマスターする初心者向けプログラミング学習サイト](http://www.google.com/s2/favicons?domain=http://dotinstall.com/)

プログラミングを動画でしかもライブコーディングで学べる
一部無料、有料会員になるとソースコードを取得できる。

私はdotinstallが好きすぎて過去にこんな投稿をした事があった
[【初心者向け】ドットインストールのローカル開発環境の構築をcentOS6から7版に書き換えてみました。【環境構築】](http://qiita.com/kurosawa_kuro/items/10e9ff9738c239497008)
[【初心者】【PHP】【Laravel】ドットインストールのLaravel5入門をCloud9でする場合の設定方法](http://qiita.com/kurosawa_kuro/items/1ff03b8808a0934f0196)








## Udemyやdotinstall以外には？
youtube但し、日本語は少ない。

でもそもそもプログラミングは原則英語、エラーメッセージに怯えていると
いつまでたっても一人立ちできないので、いっそ英語の動画でプログラミングを学ぶのが
一番効率良いと思うし僕もそうしてきた。

## そもそもなんで動画学習を押すのか
下記を参考されたし
[ビデオによる教育の再発明](https://www.ted.com/talks/salman_khan_let_s_use_video_to_reinvent_education?language=ja)


## お勧めの勉強法
結論から言うと見るだけでは、時間とお金の無駄だと断言します。
わかったつもりになるだけ

### 1回目
一通り全部見る。
この時点では全体像把握が第一目的

### 2回目
環境設定し、ソースはコピペでいいから
兎に角自分の手元で動かす

### 3回目
自分でコードを書く、そして解説者の説明をコメント文として
書いていく

### 4回目
3回目を最低4回繰り返し7回は動画を見る事になる

##### なぜトータル7回か
下記を参考にしている
[東大首席弁護士が教える超速「7回読み」勉強法](https://www.amazon.co.jp/%E6%9D%B1%E5%A4%A7%E9%A6%96%E5%B8%AD%E5%BC%81%E8%AD%B7%E5%A3%AB%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E8%B6%85%E9%80%9F%E3%80%8C7%E5%9B%9E%E8%AA%AD%E3%81%BF%E3%80%8D%E5%8B%89%E5%BC%B7%E6%B3%95-%E5%B1%B1%E5%8F%A3%E7%9C%9F%E7%94%B1/dp/4569819303/ref=sr_1_1?ie=UTF8&qid=1486566484&sr=8-1&keywords=%E5%BC%81%E8%AD%B7%E5%A3%AB+7%E5%9B%9E)



#### コメント文の書き方例
```
# coding: UTF-8

import math
import matplotlib.pyplot as plt

# シグモイド関数
def sigmoid(a):
    return 1.0 / (1.0 + math.exp(-a))

# ニューロン
class Neuron:
    # 入力値の合計
    input_sum = 0.0
    # 出力
    output = 0.0

    def setInput(self, inp):
        # 入力値(inp)をinput_sumに足し合わせる
        self.input_sum += inp

    def getOutput(self):
        # 入力値の合計をシグモイド関数に渡す
        self.output = sigmoid(self.input_sum)

        return self.output

    def reset(self):
        # 入力値の合計をシグモイド関数に渡す
        self.input_sum = 0
        self.output = 0

# ニューラルネットワーク
class NeuralNetWork:
    # 入力層と中間層との間の重み
    # 最初の要素は入力層の最初のニューロンと中間層の各ニューロンとの重み、
    # 二番目の要素は入力層の二番目のニューロンと中間層の各ニューロンとの重み、
    # 最後の要素は入力層のバイアスと中間層の各ニューロンとの重み。
    w_im = [[0.496, 0.512], [-0.501, 0.998], [0.498, -0.502]]
    #  中間層と出力層との間の重み
    # 最初の要素は中間層の最初のニューロンと出力層のニューロンとの重み、
    # 二番目の要素は中間層の二番目のニューロンと出力層のニューロンとの重み、
    # 最後の要素は中間層のバイアスと出力層のニューロンとの重み。
    w_mo = [0.121, -0.4996, 0.200]

    # 入力層 二つのニューロンと一つのバイアス
    # 入力値がそのまま入るのでニューロンクラスを使わない。
    input_layer = [0.0, 0.0, 1.0]
    # 中間層 二つのニューロンクラスと一つのバイアス
    middle_layer = [Neuron(), Neuron(), 1.0]
    # 出力層 リストではない
    output_layer = Neuron()

    # 実行
    def commit(self, input_data):
        # 各層のリセット
        self.input_layer[0] = input_data[0]
        self.input_layer[1] = input_data[1]

        self.middle_layer[0].reset()
        self.middle_layer[1].reset()

        self.output_layer.reset()

        # 中間層 二つのニューロンクラスと一つのバイアス
        middle_layer = [Neuron(), Neuron(), 1.0]
        # 出力層 リストではない
        output_layer = Neuron()

        # 入力値のリストを受け止め、重みのリストと
        # 順に掛け合わせてneuron.setInputに渡す
        # 入力層 → 中間層
        self.middle_layer[0].setInput(self.input_layer[0] * self.w_im[0][0])
        self.middle_layer[0].setInput(self.input_layer[1] * self.w_im[1][0])
        self.middle_layer[0].setInput(self.input_layer[2] * self.w_im[2][0])

        self.middle_layer[1].setInput(self.input_layer[0] * self.w_im[0][1])
        self.middle_layer[1].setInput(self.input_layer[1] * self.w_im[1][1])
        self.middle_layer[1].setInput(self.input_layer[2] * self.w_im[2][1])

        # 中間層 → 出力層
        self.output_layer.setInput(self.middle_layer[0].getOutput() * self.w_mo[0])
        self.output_layer.setInput(self.middle_layer[1].getOutput() * self.w_mo[1])
        self.output_layer.setInput(self.middle_layer[2] * self.w_mo[2])

        return self.output_layer.getOutput()

# 基準点（データの範囲を0.0〜1.0の範囲に）
refer_point_0 = 34.5
refer_point_1 = 137.5

# 外部データ格納
trial_data = []
# 外部データファイルを開く
# 日本付近の緯度経度データ
trial_data_file = open("trial-data.txt","r")
# データファイルを一行づつ読み取る
for line in trial_data_file:
    # 行末の文字を取り除き「,」で区切ってリストにする
    line = line.rstrip().split(",")
    # 緯度から基準値を引いた値,経度から基準値を引いた値の
    # リストをtrial_dataに追加する
    trial_data.append([float(line[0]) - refer_point_0, float(line[1]) - refer_point_1])
# 外部データファイルを閉じる
trial_data_file.close()

# ニューラルネットワークのインスタンス
neural_network = NeuralNetWork()

# 実行
position_tokyo = [[],[]]
position_kanagawa = [[],[]]
for data in trial_data:
    if neural_network.commit(data) < 0.5:
        position_tokyo[0].append(data[1] + refer_point_1)
        position_tokyo[1].append(data[0] + refer_point_0)
    else:
        position_kanagawa[0].append(data[1] + refer_point_1)
        position_kanagawa[1].append(data[0] + refer_point_0)

# プロット
# 散布図(scatter)の設定
plt.scatter(position_tokyo[0], position_tokyo[1], color="red", label="Tokyo", marker="+")
plt.scatter(position_kanagawa[0], position_kanagawa[1], color="blue", label="Kanagawa", marker="+")
plt.legend()
plt.show()
```


# 本題
頭でも書いたが4つがお勧め。

[【4日で体験】 TensorFlow x Python 3 で学ぶディープラーニング入門](https://www.udemy.com/tensorflow/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)

ディープラーニングって何？という状態の方は下記、設定方法が素晴らしく丁寧に説明されているので
安心して進めれる

[みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習](https://www.udemy.com/learning-ai/)
数学的な事は最低限にしておきテンソルフローやチェイナー等は
用いずにnumpy程度でニューラルネットワークを組んでいくのだが
段階が秀逸でものすごくわかりやすい

[ゼロから作るニューラルネットワーク【Python 3 + NumPyでバックプロップを徹底マスター】](https://www.udemy.com/neuralnet/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)
いきなり難しくなるが、色んな参考書・コースを実際に受講されてその重要なエッセンスを
数式の省略なく説明してくれている貴重なコース。

様々なテクニックの名称を整理してくれてコメントしてくれているので、あの参考書のこの技法の
別名はこの参考書のコレだったのかとかわかって助かります。

[アプリケーション開発者のための機械学習実践講座](https://www.udemy.com/ml_for_app_developers/?deal_code=JPUDEMYMEDIA1800&aff_code=Ewh3Y1xbR3QBSht5MkBPbG1RGXFfVVh8AF4YcE5TTXYBRRF0WT5XMRM%3D&utm_source=qiita&utm_campaign=1800&utm_medium=anb)
実際に解析（学習）完了して、ウェブアプリとして公開する為の貴重なコース

# お買い得情報
udemyは定期的にラーニングフェス等で連休前等に破壊的ディスカウントをします。
90%オフくらいになりますので、その際に気になるコースをごっそり買い。

udemyスマホアプリに保存して通勤の際に積極的に勉強しましょう！！

# 参考書
[マンガで学ぶ線形代数](https://www.amazon.co.jp/マンガで学ぶ線形代数-星野-稔/dp/4861672279/ref=sr_1_3?ie=UTF8&qid=1497439963&sr=8-3&keywords=線形代数+マンガ)
機械学習を学ぶ際、線形代数の理解が重要になってきますが、線形変換や固有値が鬼門と言われていますが、私は先に上記の絵図が多い漫画版の線形代数でイメージが湧きやすくなりましたのでオススメしています。

漫画といえど、実際に評価が高く侮れません。



# 備考
以前から私が出入りしている人工知能の限定コミュニティ向けに書いた
ものを最新版にしました。

特に都内で土日集中講座に出席できそうな方はこちらに参加するのもオススメしてます。
私も懇親会だけでなく、たまに数学証明補助やPythonプログラミングの
アドバイス等のスタッフとして参加しています。

キカガク
https://kikagaku.connpass.com