$30 off During Our Annual Pro Sale. View Details »

用 Jupyter Notebook 實現數學的想法

用 Jupyter Notebook 實現數學的想法

這是在台東大學應用數學系, 為大學部、尤其是大一的同學, 介紹怎麼樣用 Python 實現數學的想法。從「數學的核心是函數」這個概念開始, 介紹如果要用 Python 應該使用怎麼樣的套件, 為什麼 Jupyter Notebook (JupyterLab) 會成為數據分析的主流。然後介紹基本的 Python 程式語言, 最後介紹當紅人工智慧的技術。

yenlung@mac.com
PRO

May 21, 2018
Tweet

More Decks by yenlung@mac.com

Other Decks in Technology

Transcript

  1. 數學的想法 蔡炎⿓ 政治⼤學應⽤數學系 台東⼤學應數系 ⽤ Jupyter Notebook 實現

  2. 關於我 !2 UC Irvine 數學博⼠ (純數) 唸博⼠時知道 Python

  3. 0 數學的核⼼ 是函數 !3

  4. !4 每⼀科數學, ⼼理都有函數

  5. !5 線性代數 希望全宇宙的函數都 是線性的數學⼤夢。 微積分 取極限的⼿法研究函數。 機率統計 建構⼀個函數最可 能的樣⼦。

  6. !6 函數是⼀個對應關係 f 定義域 X 和值域 Y 間的對應。 X Y

  7. !7 函數是⼀個對應關係 X, Y 是兩個集合。 X Y 定義域 值域

  8. !8 函數是⼀個對應關係 x 對應到 y 的符號。 X Y y =

    f(x)
  9. !9 要符合兩個條件 數學上說, 這樣才是 well-defined!

  10. !10 每⼀個在 X 中的元素 x, 都有⼀個在 Y 裡的元素 y, 使得

    f(x) = y。 條件 1
  11. !11 如果今天有在 X 中的兩個元素 x1, x2, 且 x1=x2, 則我們有 f(x1)

    = f(x2) 條件 2
  12. !12 可以⽤⼈話說⼀次嗎?

  13. !13 函數其實是⼀個解答本 解答我們想知道的事。

  14. !14 在野外看到⼀隻動物, 我想知道是什麼?

  15. !15 問題 答案 台灣⿊熊 蟒蛇 我們希望有個解答本

  16. !16 函數就是解答本 f 問題 答案 台灣⿊熊

  17. !17 我想知道某⽀股票明天 的收盤價。

  18. !18 f ⽇期 x 某股票 x 當天的收盤價 

  19. !19 f ⽤前 1 週的情況預 測下⼀期。

  20. !20 函數是⼀個對應關係 所有可能的問題。 X Y 定義域 值域 所有可能的答案。 f

  21. !21 f 找出這個函數! 統計 機器學習 深度學習

  22. !22 現在有個很好的⼯具...

  23. 1 Python !23

  24. Python 簡介 !24 1991 由 Guido van Rossum 創 簡單、全⽅位、社群強⼤的程式語⾔

    幾乎成為資料分析 No. 1!
  25. Python 簡介 !25 兩個重⼤系列 Python 2 Python 3 即將退休。 https://pythonclock.org/

  26. !26 交了 50 美元 的年費! 2000 年時, 加⼊ Python Software

    Activity, 當時只有 271 ⼈
  27. 演講的內容 !27 Python 基礎 Jupyter Notebook 環境 Python 資料分析、數學相 關套件

  28. !28 Jupyter Python Python 當紅 主流平台。

  29. !29 Jupyter NumPy Matplotlib Pandas SciKit Learn Python 的數據分析團隊。 數值運算

    畫圖⾼⼿ 資料清理 機器學習
  30. !30 為數學⽽⽣ SymPy 符號計算的⾼⼿。

  31. !31 基礎 統計分析 機器學習 ⼈⼯智慧 進階

  32. !32 Keras 快速實現深度學習

  33. 2 安裝 !33

  34. https://www.anaconda.com/download/ 下載 Anaconda 請裝 Python 3 的版本。 !34

  35. http://bit.ly/py3github 下載課程資料 !35

  36. 3 Jupyter 
 Notebook !36

  37. > jupyter notebook 打開終端機 (Windows 下⽤ Anaconda Prompt) !37

  38. !38 事實上有個新的 JupyterLab, 在正式推出 1.0 後就要完全取代原來的 Jupyter Notebook。 JupyterLab

  39. > jupyter lab !39 進⼊我們⼯作資料夾後, 在終端機中執⾏ jupyter lab 即可。

  40. In[ ]: 記得在每個 cell 中是按 shift enter — 執⾏ !40

  41. %Jupyter 有很多魔術指令, 都是以 % 開 頭, 讓我們享有諸多⽅便功能。 !41

  42. 我們的標準魔術指令 %pylab inline 把 Jupyter Notebook 打造成⼀個⽅便的數學、計算、 互動試驗場! !42

  43. 我們暫時不要管太多, 但以下⽅式⽐較好。 「正確的」打法 %matplotlib inline import numpy as np import

    matplotlib.pyplot as plt 使⽤ numpy, matplotlib 兩個套件 !43
  44. 隨機取 100 點畫圖 plot(randn(100)) 從平均值為 0, 標準差為 1 的常態分布中, 隨機抽

    100 個 點, 畫出圖來。 !44
  45. 畫出四個點 plot([3,-5,7,2]) plot ⽤法是這樣⼦的: 是畫出 (0,3), (1, -5), (2,7), (3,2)

    幾個點再連起來。 !45
  46. plot(X,Y) 點的 x 座標 list (array) 點的 y 座標 list

    (array) 畫圖語法 !46
  47. 標準折線圖 plot([0.8, 1.2, 2.1, 2.8], [2, -5, 3.2, 5]) 我們有點

    (0.8, 2), (1.2, -5), (2.1, 3.2), (2.8, 5), 把它們連起來的圖畫出來。 !47
  48. 重點 亂數隨機抽 整數亂數的取法。 randint(a,b) !48 隨機抽取⼀個整數 k, 使得

  49. 重點 亂數隨機抽 標準亂數的取法。 rand(n) !49 隨機取 n 個亂數, 每個數字 k

    範圍是:
  50. 重點 亂數隨機抽 從標準差為 0, 變異數為 1 的常態分布取 n 個數字。 randn(n)

    !50
  51. !51 ⽤選單選 Markdown 格式, 就可以⽤ Markdown 語法 做筆記! 筆記神⼿ Markdown

    請搜尋 Markdown 語法, ⽽ Jupyter Notebook 也⽀援 ⽤ LaTeX 打數學符號!
  52. 4 Python
 計算機 !52

  53. 要算什麼就打什麼, ⽐計算機⽅便。 基本運算 1 + 3*8 輸出:
 25 !53

  54. 唯⼀要注意的是次⽅打法。 次⽅ 2**3 輸出:
 8 23 !54

  55. 程式的好處是可以⽤變數暫存。 變數 a = 87 a 87 !55

  56. 例⼦ 電池⽡時計算 為了⾶⾏安全, ⽡時 (Wh) 太⾼的⾏動電池是有限制 的。但平常的電池標⽰的是亳安時 (mAh) 和伏特電 壓

    (V), 我們怎麼換算呢? !56
  57. 例⼦ 電池⽡時計算 假設 H 牌有個 10050 mAh, 12 V 的⾏動電源,

    換算 為⽡時是多少呢? 10050/1000 * 12 !57
  58. 例⼦ 電池⽡時計算 同樣的問題令成變數可能更清楚。 mAh = 10050 V = 12 Wh

    = mAh/1000 * 12 !58
  59. 更好的是寫成⼀個 函數 !59

  60. 重點 函數的寫法 函數的寫法是這樣的。 def Wh(mAh, V): return mAh/1000 * V

    !60
  61. 重點 不同的資料型態 變數不只可以存數字 (事實上數字還可分整數、浮點數)。 a = 3 int float str

    b = 3.2 s = "hi" 整數 浮點數 字串 !61
  62. 重點 不同的資料型態 還有個很重要的串列 (list), 其實更符合我們計算 需求的是陣列 (array), 我們先不做明確區分, 之後 再說明。

    list L = [1,2,3,4] 串列 !62
  63. 重點 不同的資料型態 最後有個叫字典 (dictionary) 的資料型態, 你就 可以想成, 嗯, ⼀個字典。 mydict

    = {'a':3, 'b':2, 'c':5} 字典 !63
  64. 重點 字典的查詢 mydict['a'] !64 輸出: 3

  65. 重點 增加⼀筆資料 mydict['d'] = 7 !65 結果: mydict = {'a':

    3, 'b': 2, 'c': 5, 'd': 7}
  66. 串列、字串、陣列的 切割 索引 + !66

  67. 重點 索引分割 我們⽤個串列來說明, 但字串、陣列基本上是⼀樣的 (除了陣列有更進階⽤法)。 L = ["A", "B", "C",

    "D", "E"] !67
  68. Python 的切割點都在中間。 重點 索引分割 !68

  69. ⼀些例⼦。 重點 索引分割 L L[1] L[2:4] L[-1] 'B' ['C', 'D']

    'E' !69
  70. ⼀路到底。 重點 索引分割 L L[:] L[2:] L[:-2] ['A', 'B', 'C',

    'D', 'E'] ['C', 'D', 'E'] ['A', 'B', 'C'] !70
  71. 重點 串列的擴充 L = [1, 3, 8, 9] L.append(17) 這個串列我們想「擴充」,

    可以⽤ append。 L 會變成 [1, 3, 8, 9, 17]。 !71
  72. 重點 串列的擴充 L = [] L ⼀開始設成空串列, 再慢慢擴充, 也是個常⽤的⼿法。 !72

  73. 練習 複利計算 你因為急需⼀萬元現⾦,去找某錢莊借錢,⽼闆說「你 看銀⾏信⽤卡利息動不動就 16%、18%。我們是 『⼗天⼗分利』也就是 10%! 根本就慈善事業⼀樣 了。」 複利公式

    !73
  74. 練習 複利計算 深怕你不會算, ⽼闆還很親切的教你「⽐如你借 1,000 元, ⼗天後就還 1,100 就好。」你覺得好像 很合理,

    於是借了 10,000 元, 複利計算, 每⼗天複 利⼀次, 五年後你共⽋多少? 寫個可以輸⼊本⾦、年利率、每 年要複利幾次、借多少年的函 數, 計算最後本利和是多少。 !74
  75. 5 超炫的互動 !75

  76. 重點 互動準備 我們還沒學的套件指令讀⼊⽅式, 先⽤⼀下。 from ipywidgets import interact !76 這樣我們的

    Python 就「多了」⼀個叫 interact 的指令函數。
  77. !77 寫個函數
 就能互動

  78. 例⼦ 寫個簡單的函數 def f(x): print(x) !78 ⼀定要⽤參數的, 這很難 再更簡單。

  79. 例⼦ 然後就互動! interact(f, x=3) !79 這裡可以⽤任意的資料型態!

  80. 例⼦ 有預設值的 來個「像樣點」的例⼦。 def move(n=1): print(" "*n + "oooo") interact(move,

    n=(1,50)) !80
  81. 重點 互動之⼆ 我們介紹第⼆個互動指令。 from ipywidgets import interact_manual !81 ⽤法和 interact

    基本上是⼀樣的, 試試有什麼不 同?
  82. 練習 拍拍機器⼈ ⽤ interact_manual 寫⼀個簡單的對話機 器⼈, 不管使⽤者說什麼都回應「拍拍」。 !82 拍拍

  83. 6 畫圖 !83

  84. 數學函數 畫個 !84

  85. 重點 電腦畫函數就是描點法 假設我們要畫 的函數圖形, x 範圍取 -10 到 10。 !85

  86. 重點 電腦畫函數就是描點法 先來準備 x 座標的點, -10 到 10, 我們取, ⽐⽅說

    100 個點。 x = linspace(-10, 10, 100) 這會產⽣⼀個陣列 (array)。 !86
  87. 重點 電腦畫函數就是描點法 陣列很神的是, 100 個點算 sin 值可以⼀次算完! y = sin(x)

    這樣 y 也是有 100 個點的陣列! !87
  88. 重點 電腦畫函數就是描點法 最後就是⽤ plot 畫出來! plot(x,y) !88

  89. 重點 電腦畫函數就是描點法 我們順便介紹另⼀種畫圖法 scatter。 scatter(x,y) !89

  90. scatter plot 畫圖我們先學會兩⼤⽅式就好, 事實上這⽐我們想像還夠⽤! !90

  91. matplotlib 畫個 圓怎麼做? !91

  92. 其實圓也就是⼀堆點連成的 (x(0), y(0)) (x(1), y(1)) (x(t), y(t)) !92

  93. 半徑是 r, 時間 t 時我們的點剛好轉了 t 度。
 這時的 x(t), y(t)

    座標是多少呢? r t (x(t), y(t)) !93
  94. 還記得極座標嗎? r t x(t) = r cos(t) y(t) = r

    sin(t) !94
  95. 寫成程式是這樣 r = 3 t = linspace(-2*pi, 2*pi, 200) x

    = r*cos(t) y = r*sin(t) plot(x, y, lw=3) !95
  96. 真的畫出⼀個圓! (其實我有點騙你) !96

  97. 我騙你的地⽅是, 畫出來怎麼看都是橢圓, 要修 正就是在畫圖下 plt.plot 指令那需要修正。 ax = gca() ax.set_aspect('equal') !97

  98. Ңࡁॆ͍ٙᕚͦ݊ 如果 r 不是故定的呢? 也就是它會變⻑變短, 是 不是會畫出什麼特別的圖呢? !98

  99. 練習 畫出漂亮曲線 我們來試試, 會變化的 r 會畫出什麼樣的曲線? 這很 容易, ⽐如你想要「只有中⽂才有的」感⼈笛卡兒 愛情故事中出現的

    在前⾯的點設定只要改成... r = 3*(1-sin(t)) x = r*cos(t) y = r*sin(t) !99
  100. 7 條件判斷 !100

  101. 重點 條件判斷 a>b b>=5 a!=b False True True a =

    3, b = 5 !101
  102. 重點 條件判斷 a==b False a = 3, b = 5

    特別注意相等的判斷要兩個等號! !102
  103. 重點 陣列可以⼀次判斷! L = array([1,-3,2,5,-7]) L>0 輸出:
 array([ True, False,

    True, True, False]) !103
  104. 重點 陣列可以⼀次判斷! L = array([1,-3,2,5,-7]) L>0 輸出:
 array([ True, False,

    True, True, False]) !104
  105. 例⼦ 遊戲的回應 假設你寫了個遊戲, 玩家會得到 0-5 的⼀個評等。你想 依下表來回應... 5 太棒了了! 3-4

    不錯! 0-2 加油好嗎? !105
  106. 例⼦ 遊戲的回應 s = 4 if s==5: print("太棒了了!") elif s>=3:

    print("不錯!") else: print("加油好嗎?") !106
  107. input !107 和電腦互動

  108. 重點 input ⽤法 要等使⽤者輸⼊⼀些資料, 可以⽤ input 指令。 s = input("請輸入:

    ") !108 注意這時得到的⼀定是字串, 可⽤例如 int(s) 改成 整數。
  109. 練習 匯率換算 ⽤ input 讓使⽤者輸⼊多少美⾦, 換算成台幣顯⽰ 出來。 !109

  110. 8 迴圈 !110

  111. 迴圈就是讓電腦重覆做⼀些事的⽅法, ⼀般 有 for 和 while 兩種⽅式。 while for !111

  112. 就是從某個串列中, ⼀個⼀個拿出來。 for L = [1, 2, 3] for i

    in L: print(i) 輸出:
 1 2 3 !112
  113. while 是做到條件不成⽴了才停⽌。 while k = 0 while k<5: k =

    k + 1 print(k) 輸出:
 1 2 3 4 5 !113
  114. 練習 冰雹數列 有⼀個數列 , 是這樣決定的: 如果⽬前的數字是,    那下⼀數字是⽤下列⽅式決定的。 這種數列叫「冰雹數列」。給定任意起始值正整數 k,

    最後都數變成 1。⽤ Python 寫個程式驗證看看! !114
  115. 練習 冰雹數列 k=27 k=87 !115

  116. 練習 猜數字遊戲 電腦隨機取⼀個 1-100 的數字讓使⽤者猜。使⽤者 輸⼊答案後電腦要回應太⼤還是太⼩, 重覆到使⽤ 者猜對為⽌。 !116

  117. 重點 梯度下降法 假設你做了⼀個神經網路, 對 w 這個參數的 loss function 如下: 起始點

    w 隨機從 0 到 5.5 選⼀個數, ⽤梯度下降 法找出 (局部) 最⼩值發⽣的地⽅。 !117
  118. 9 覺得好玩 才能學好 !118

  119. Micro:bit !119 英國 BBC 推出的超⼩型 電腦, 提供給百萬學同學 習程式。 LED ⾯板

    按鈕 A 按鈕 B 還有⽅位感應、⽔平感應、加速度 感應等等...
  120. 線上模擬器 from microbit import * display.show(Image.HEART) !120 http://bit.ly/microbitPython CTRL enter

    — 就是畫我!
  121. 就是這樣, 之後都不重覆。  開始 from microbit import * !121

  122. 重點 Scroll 印出⼀個字串。 display.scroll("Hello, World!") !122

  123. 重點 Show 圖 我們⽤過的秀圖! display.show(Image.HAPPY) !123 Image.HEART Image.SAD Image.ANGRY Image.YES

    Image.NO Image.CLOCK12 Image.ARROW_N Image.SNAKE 還很多
  124. 重點 ⾃⼰畫圖 我們⾃⼰來畫圖。 char = Image("00900:" "99999:" "90909:" "99999:" "00900")

    display.show(char) !124 這會顯⽰「中」 這個字。
  125. 重點 動畫 ⼜哭⼜笑... smiley = [Image.HAPPY, Image.SAD] display.show(smiley, loop=True, delay=1000)

    !125 延遲時間單位是毫秒。 
  126. !126 ⿆客樂彼特(Micro:bit)太好玩社 臉書社團 f

  127. !127 Soobi

  128. !128 政⼤魔法程式家 x 數理資訊學程討論區 臉書社團 f

  129. !129 紅葉 50 週年 棒球營 x 服務隊 x Micro:bit x

    瞭解原住⺠⽂化 「暑期國⼩營隊-UVAAZ營」
  130. 10 套件讀⼊ !130

  131. !131 這裡介紹 Python 套 件讀⼊的正規⽅式!

  132. 重點 import 法之 1 標準就是⽤ import 去讀⼊⼀個套件, 例如讀⼊ numpy 就是

    import numpy !132 只是這樣以後要⽤到 numpy 相關指令都要像這樣... y = numpy.sin(2*numpy.pi*t)
  133. 重點 import 法之 2 我們喜歡給個簡單的代號, ⽐⽅說: import numpy as np

    !133
  134. 重點 import 法之 2 有趣的是很多套件有「標準」縮寫⽅式。 !134 %matplotlib inline import numpy

    as np import matplotlib.pyplot as plt import pandas as pd 這是我們推薦的資料分析「起⼿式」。
  135. 重點 import 法之 3 我們也可以單獨要某⼀個函數。 !135 from numpy import sin

    然後 Python 突然就會 sin 了!
  136. 重點 import 法之 4 也可以某個套件庫的函數全要! 但⾮常不推薦! !136 from numpy import

    *
  137. 11 要數學就找 numpy !137

  138. NumPy 最重⼤的概念… !138 Array Oriented!!

  139. 重點 Brodcasting 假設同學的學期分數出來, ⽼師決定每位同學加 5 分! grades = np.array([87, 65,

    77, 93]) grades + 5 !139 輸出: array([92, 70, 82, 98])
  140. 重點 矩陣計算 平時、期中、期末權重分別是 20%, 35%, 45%, 我們來算算某同學成績。 grades = np.array([85,

    70, 80]) weights = np.array([0.2, 0.35, 0.45]) np.dot(grades, weights) !140 輸出: 77.5 grades @ weights 現在其實⽐較愛⽤
  141. 重點 快速⽣ array 的⽅法之⼀ 從 0 到 10, 很均勻的找出 100

    個點。 x = np.linspace(0, 10, 100) !141 輸出: array([0., 0.1010101, …, 10.])
  142. 重點 快速⽣ array 的⽅法之⼆ np.arange 和 Python 的 range 很像,

    只是輸 出的是 array, ⽽且範圍可以⽤浮點數。 A = np.arange(10) !142 輸出: array([1, 2, …, 10])
  143. !143 熟悉 array 的 shape 怎麼變來變去是很重要 的! 剛開始學 Python 的可能很難理解,

    但...
  144. 重點 某個 array 的 shape A.shape !144 輸出: A =

    np.arange(10) 記得我們定義了 (10,)
  145. 重點 Shape 更改法之⼀ A.shape = (2,5) !145 輸出: A=array([[0, 1,

    2, 3, 4], [5, 6, 7, 8, 9]]) ⼆維的陣列
  146. 重點 Shape 更改法之⼆ A.reshape(5,2) !146 輸出: array([[0, 1], [2, 3],

    [4, 5], [6, 7], [8, 9]]) 注意 A 本⾝ 不會變!
  147. !147 不太好懂的 axis ⽅向 唸數學的記得矩陣都是 「先列後⾏*」就可以! * ⼤陸的⽤法「⾏、列」和台灣相反

  148. 重點 axis 的概念 axis 指運算的⽅向。在⼆維陣列有兩個⽅向: 沿 列 (axis=0), 或是沿⾏ (axis=1)

    的⽅向。 !148 
 [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]] axis=0
  149. 重點 axis 的概念 axis 指運算的⽅向。在⼆維陣列有兩個⽅向: 沿 列 (axis=0), 或是沿⾏ (axis=1)

    的⽅向。 !149 
 [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]] axis=1
  150. 重點 ⼆維陣列的和 A = array([[0, 1, 2, 3, 4], [5,

    6, 7, 8, 9]]) A.sum() !150 全加! 輸出: 45
  151. 重點 ⼆維陣列的和 A = array([[0, 1, 2, 3, 4], [5,

    6, 7, 8, 9]]) A.sum(axis=0) !151 ⼀列⼀列 加起來! 輸出: array([5, 7, 9, 11, 13])
  152. !152 Array 過濾器 這個真的炫!

  153. 重點 array 過濾器 假設我們有個 array bool = np.array([True, False, False,

    True, True, False]) !153 我們想取出⼤於 0 的那些數。我們可以⽤另⼀個 array, 把要的標 True, 不要的標 False。 L = np.array([3, -2, -1, 5, 7, -3])
  154. 重點 array 過濾器 然後魔法出現了! L[bool] !154 L = np.array([3, -2,

    -1, 5, 7, -3]) 魔法 輸出: array([3, 5, 7]) * 但是 bool 那串是我們⾃⼰打的, 實在有點遜。
  155. 重點 array 過濾器 其實我們可以這樣找出 bool 那個 array。 L>0 !155 L

    = np.array([3, -2, -1, 5, 7, -3]) WOW! 輸出: np.array([True, False, False, True, True, False])
  156. 重點 array 過濾器 更過份的是這樣! L[L>0] !156 L = np.array([3, -2,

    -1, 5, 7, -3]) 炫! 輸出: array([3, 5, 7])
  157. !157 次元切割⼑ 取出陣列中 我們想要的 部份!

  158. 重點 slicing NumPy 的 slicing 和 list 的切法基本上是⼀樣的! x[2:5] !158

    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 輸出: array([2, 3, 4])
  159. 重點 slicing 2 維陣列列就抓住「先列列後⾏行行」的精神! x[:,1:3] !159 x = np.array([[0, 1,

    2, 3, 4], [5, 6, 7, 8, 9]]) 輸出: array([[1, 2], [6, 7]])
  160. 12 sympy 
 和平⽇數學 習慣⼀樣 !160

  161. 重點 導⼊ sympy !161 import sympy as sp

  162. 來個「正常」加法 sp.Rational(1,3) + sp.Rational(1,2) !162 輸出: 這種打法也太麻煩了!

  163. 重點 Sympy 化 !163 sp.S(1)/3 + sp.S(1)/2 有個 symplify (SymPy

    化) 的指令, 縮寫是⼤寫 S! 輸出:
  164. 插播 美美的輸出 !164 sp.init_printing() 讓 SymPy 輸出更像⼀般數學⽅式。

  165. 例⼦ 試個簡單的數學 !165 sp.sqrt(2) * sp.sqrt(3) 注意這時 SymPy 突然知道我們要什麼。 輸出:

  166. !166 SymPy 中設 「符號變數」 是⾮常重要的!

  167. 重點 符號變數之⼀ 第⼀種設法。 x = symbols('x') !167

  168. 例⼦ 微分 我們來算個微分。 sp.diff(sp.sin(x)) !168 輸出:

  169. 重點 兩個以上變數 兩個以上變數同時設。 alpha, beta = symbols(r'\alpha, \beta') !169

  170. 例⼦ 微分再⼀次 我們來算個⾼級⼀點的微分。 sp.diff(beta * sp.sin(x), x) !170 輸出: 超炫!

  171. 重點 符號變數之⼆ SymPy 中有個叫 abc 的⼦套件庫, 功能就是讓 你設變數。 from sympy.abc

    import y !171
  172. 例⼦ 展開 來算個展開... sp.expand((x+y)**2) !172 輸出:

  173. 設個式⼦來玩玩 f = beta*x + cos(x) !173

  174. 重點 代⼊ 我們常常會做的, 代⼊⼀個數字! f.subs(x,sp.pi) !174 輸出:

  175. 重點 代⼊ 可以⽤字典型態 (或 list) 帶⼊多個數字。 f.subs({x:pi, beta:3}) !175 輸出:

  176. 13 當紅的
 深度學習 !176

  177. !177 問題化為函數 f 然後⽤深度學習找到這個函數

  178. !178 問題 答案 台灣⿊熊 蟒蛇 我們有部份解答

  179. !179 問題 答案 台灣⿊熊 蟒蛇 但我們還沒碰過的情況可能有無限多題 ?

  180. !180 深度學習找出完整的函數!

  181. !181 深度學習 (神經網路) 
 三⼤天王 標準 NN CNN RNN

  182. !182 我們先問⼀個問題 在野外看到⼀隻動物, 我想知道是什麼? 1

  183. !183 化成函數的形式 f 台灣⿊熊 2

  184. 準備訓練資料 ( , "台灣⿊熊") ( , "蠎蛇") , , ...

    x k+1 , y k+1 x k , y k x1 , y1 x n , y n 訓練資料 測試資料 3
  185. !185 強化學習 ⽣成對抗模式 (GAN) VAE 膠囊 標準 NN CNN RNN

    架構我們的神經網路 4
  186. !186 我們架好了神經網路, 就剩⼀些參數要調。 θ = {wi , bj } 決定好這些參數的值,

    就會出現⼀個函數。
  187. !187 學習 5 學習都是⽤我們訓練資料送進我們的神經網路,調整 我們的參數, 然後⽤個 loss function 看我們和觀察值 差多少。

  188. !188 基本上就是⽤ gradient descent 因神經網路的特性, 叫 backpropagation

  189. !189 我想知道某位 MLB 選⼿ 2018 球季可以 打幾隻全壘打?

  190. !190 第 t-1 年資料
 
 [Age, G, PA, AB, R,

    H, 2B, 3B, HR, RBI, SB, BB, SO, OPS+, TB] 15 個 features! f 第 t 年全壘打數 RNN
  191. !191 不要猜精確數⽬, 猜區 間即可! 分五段: 0-9, 10-19, 20-29, 30-39, 40+

  192. !192 Mike Trout (LAA) 預測 30-39 實際 33 Mookie Betts

    (BOS) 預測 20-29 實際 24 Jose Altuve (HOU) 預測 20-29 實際 24 Kris Bryant (CHC) 預測 30-39 (第⼆⾼ 20-29) 實際 29 Daniel Murphy (WSH) 預測 20-29 實際 23 Corey Seager (LAD) 預測 20-29 實際 22 2017 預測結果 (2016 年 6 ⽉預測)
  193. !193 對話機器⼈

  194. !194 f ⽬前的字 下⼀個字 RNN

  195. !195 字1 字2 回1 EOS 回1 回2 回k EOS 注意這樣的模式,

    每次輸⼊和輸出都不是固定的⻑度!
  196. !196 我想讓 AI ⾃⼰玩遊 戲 (開⾞, 泡咖啡...)

  197. !197 π 最好的動作 CNN + NN

  198. !198 Q 評分 Reinforcement Learning + 往左

  199. !199 我喜歡的字型有缺 字, 我想要這個字!

  200. !200 f 字型A 字型B CNN, VAE, GAN

  201. 14 AI 核⼼技術— 神經網路的原理 !201

  202. 記得我們就是要學個函數 !202 f x1 x2 xn y1 y2 ym

  203. !203 函數學習三部曲 真實世界我們要問的問題化做函數。 收集我們知道「正確答案」的訓練資料。 找出這個函數!

  204. 暗⿊學習法 真的有學任意函數的技法 !204

  205. 就是「神經網路」! !205

  206. 在 1980-1990 左右是 很潮的東⻄ !206

  207. !207 Hidden Layer Output Layer Input Layer 暗⿊魔法

  208. 厲害的是神經網路什麼都 學得會! ⽽且你完全不⽤告訴它函數應該⻑什麼樣⼦: 線性 啦、⼆次多項式啦等等。 !208

  209. 打開暗⿊世界 !209

  210. !210 Fully Connected Neural Networks 1980 年代就⽕紅的 model 標準 NN

  211. !211

  212. 每個神經元動作基本上是 ⼀樣的! !212

  213. !213 每個神經元就是接 受若⼲個輸⼊, 然後 送出⼀個輸出。

  214. !214 輸⼊做加權和。

  215. !215 加上偏值 (bias)。

  216. !216 再⽤激活函數作⽤上去, 即為輸出。

  217. !217 幾個 activation functions ReLU Sigmoid Gaussian

  218. !218 變數就是 weights, biases

  219. !219 「學成的」神經網路 1 2 1 2 1 1

  220. !220 假設輸⼊ 2 1 1 (x1 ,x2 ) = (1,3)

    1 3 1 3 8 1 2 1
  221. !221 假設⽤ ReLU 1 3 1 2 1

  222. !222 神經網路需要經過訓練 把我們的「考古題」⼀次次拿給 神經網路學。 學習法叫 backpropagation。 神經網路訓練法

  223. 當⼀個神經網路結構決定、activation functions 也決定, 那可以調的就是 weights, biases。我們把 這些參數的集合叫 , 每⼀個 就定義⼀個函數,

    我 們把它看成⼀個集合。 固定結構神經網路的函數空間 !223
  224. 我們就是要找 使得   和⽬標函數最接近 !224

  225. 「最近」是什麼意思 就是 “loss function” 的值最⼩ !225

  226. 假設我們有訓練資料 !226

  227. !227 我們希望它越⼩越好 最常⽤ loss function 這什麼啊?

  228. !228 x 網路路輸出 真正的 誤差 1 2 3 1 2

    5 2 -3 3 6 8 2 4 7 2 -5 5 6 6 0 6 4 8 4 7 8 9 1 總誤差怎麼算?
  229. !229 x 網路路輸出 真正的 誤差 1 2 3 1 2

    5 2 -3 3 6 8 2 4 7 2 -5 5 6 6 0 6 4 8 4 7 8 9 1 加總 = 0!! 加總可以嗎?
  230. !230 x 網路路輸出 真正的 誤差 1 2 3 1 2

    5 2 -3 3 6 8 2 4 7 2 -5 5 6 6 0 6 4 8 4 7 8 9 1 平⽅和 1 9 4 25 0 16 1 加總是 56
  231. !231 基本上這樣調 learning rate

  232. 這可怕的東⻄是什麼意思 ? !232

  233. 記得 L 是 w1 , w2 , b1 , …

    的函數 !233 希望越⼩越好
  234. 為了簡化, 我們先把 L 想 成只有⼀個變數 w !234

  235. !235 w ⽬前的值 如何⾛到最⼩值?

  236. !236 w ⽬前的值 我知道, a 點要 向右移動!

  237. !237 電腦怎麼「看」出來?

  238. !238 切線是關鍵!

  239. !239 切線斜率 < 0

  240. !240 切線斜率 > 0

  241. 切線斜率指向 (局部) 最 ⼤值的⽅向!! !241

  242. !242 符號 切線斜率 切線斜率

  243. !243 切線斜率是變化率 切線斜率 切線斜率

  244. !244 切線斜率合理的符號 符號 因為是變化率, 合理的符號可以是: ⼜醜⼜不潮!

  245. !245 切線斜率合理的符號 符號 萊布尼茲說我們要潮就這樣寫: y 對 w 在 a 點的變化率

  246. !246 對任意的 w, 我們會寫成: 簡潔就是潮! 切線斜率函數 切線斜率合理的符號 符號

  247. !247 正負指向 (局部) 極⼤ 切線斜率 切線斜率

  248. !248 往 (局部) 極⼩值移動 重點 我們想調整 w 的值, 往極⼩值移動, 應該讓新的

    w 變成:
  249. !249 往 (局部) 極⼩值移動 重點 ⽐如現在在 w=a, 要調整為

  250. !250 調整⽰意圖 切線斜率

  251. !251 有時會跑過頭! 切線斜率

  252. !252 往 (局部) 極⼩值移動 重點 為了不要⼀次調太⼤, 我們會乘上⼀個⼩⼩的數, 叫 Leraning Rate:

  253. !253 求切線斜率的動作, 就是 微分

  254. !254 可是, 變數不只⼀個...

  255. !255 例⼦ 假設這時我們在: ⼀樣準備往 (局部) 極⼩值移動。

  256. !256 假裝只有⼀個變數! ⽐如說 w1

  257. !257 如果除了 w1, 其他變數不動... ⼀個變數的函數! 例⼦

  258. !258 同理, 例⼦

  259. !259 於是我們⼜會調整 w1, w2, b1, 讓 L 慢慢⾛向 (局 部)

    極⼩。 w1 w2 b1 例⼦
  260. !260 寫在⼀起看來更有學問! 新的 這叫 L 的 gradient 例⼦

  261. !261 但這符號有點麻煩 還要新創函數

  262. !262 偏微分 定義 我們有 L(w1, w2, b1) 這三個變數的函數, 當我們 只把

    w1 當變數, 其他 w2, b1 當常數的微分。
  263. !263 同理, 偏微分 定義

  264. !264 梯度 (gradient) 符號 函數 L 的 gradient 就變成:

  265. !265 Gradient 當然要有很酷的符號: 梯度 (gradient) 符號

  266. !266 我們調整 w1, w2, b1 的⽅法就變成: 梯度 (gradient) 符號

  267. 這「學習法」有個很潮的名字 (SBEJFOU%FTDFOU !267 梯度下降

  268. !268 Deep Learning 
 三⼤天王 標準 NN CNN RNN

  269. !269 真⼼不騙

  270. !270 Convolutional Neural Network 圖形辨識的超級天王 CNN

  271. !271 台灣⿊熊 圖形辨識 f ( ) =

  272. !272 電腦打電動 ⽬前狀態 「最佳」動作 π ( ) = 搭配 reinforcement

    learning
  273. !273 filter 1 filter 2 input 每個 filter 看⼀一個特徵, 掃過每

    ⼀一個點, 紀錄該點附近的「特 徵強度」。 Convolutional Neural Network (CNN)
  274. !274 Convolutional Layer 1

  275. !275 例例如 3x3 的⼤大⼩小 我們要做 filters

  276. !276 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 想成這是⼀張圖所成的矩陣 filter 內積 這學來的 W=
  277. !277 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 27 filter 右移⼀一格 還是⼀樣的矩陣 W=
  278. !278 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 27 44 32 36 38 36 36 37 36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 filter ⼀一路路到最後 W=
  279. !279 35 27 44 32 36 38 36 36 37

    36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 最後就是⼀個 6x6 的矩陣 有時我們會把它弄成還是 8x8 基本上和原矩陣⼀樣⼤ ⽽且我們通常 filter 會很多!
  280. !280 神經元是這樣看的

  281. !281 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 27 44 32 36 38 36 36 37 36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 filter 圖⽚上的點是⼀個個輸 ⼊層神經元 W=
  282. !282 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 27 44 32 36 38 36 36 37 36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 filter Conv 層也是⼀個個神經元 W=
  283. !283 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 27 44 32 36 38 36 36 37 36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 filter 兩層中沒有完全相連 W=
  284. !284 2 5 5 2 5 2 0 1 2

    3 4 0 4 2 1 5 4 3 1 3 5 5 4 3 5 3 4 5 0 2 1 5 2 3 1 1 1 0 1 3 4 4 1 1 5 1 1 4 2 3 2 2 0 4 2 4 0 5 4 5 3 4 1 4 35 27 44 32 36 38 36 36 37 36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 filter 再來 share 同樣的 weights W=
  285. !285 35 27 44 32 36 38 36 36 37

    36 36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 最後就是⼀個 6x6 的矩陣 有時我們會把它弄成還是 8x8 基本上和原矩陣⼀樣⼤ ⽽且我們通常 filter 會很多!
  286. !286 Max-Pooling Layer 2

  287. !287 看我們要多⼤大區選⼀一個代表, 例例如 2x2 基本上就是「投票」

  288. 35 27 44 32 36 38 36 36 37 36

    36 43 37 37 23 26 17 35 29 25 22 18 14 27 27 25 24 21 24 32 31 38 27 34 25 40 !288 36 44 43 37 26 35 38 34 40 每區投出最⼤的!!
  289. !289 convolution, max-pooling, convolution, 
 max-pooling… 可以不斷重覆

  290. !290 做完再送到「正常的」神經網路

  291. !291 Recurrent Neural Network 「有記憶」的神經網路 RNN

  292. !292 ⼀般的神經網路⼀筆輸⼊和下⼀筆是 沒有關係的...

  293. !293 RNN 會偷偷把上⼀次的輸出也當這⼀ 次的輸⼊。

  294. !294 很多⼈畫成這樣。

  295. !295 Recurrent Neural Network (RNN) ht 1 = σ (w1

    xt 1 + w2 xt 2 + w3 h3 t−1 + w4 h4 t−1 + b1 ) 會加入上⼀一次的 outputs 當這次的 inputs。
  296. !296 ሣ࿩ػثਓ ⽬前的字 下⼀個字 f ( ) =

  297. !297 f ⽬前的字 下⼀個字

  298. !298 字1 字2 回1 EOS 回1 回2 回k EOS 對話機器⼈

    應⽤
  299. !299 其實輸⼊不⼀定要⽂字, 是影 ⽚ (⼀張⼀張的圖) 也是可以 的! 輸出還是可以為⽂字, 最常 ⾒的⼤概是讓電腦說影⽚中發

    ⽣什麼事。
  300. !300 翻譯。 Video Captioning ⽣成影⽚敘述。 ⽣成⼀段⽂字。 畫⼀半的圖完成它。 同樣型式的應⽤

  301. !301 Andrej Karpathy ⽣出代數幾何介紹 "Stacks" 的⽂字 http://karpathy.github.io/2015/05/21/rnn- effectiveness/

  302. !302 潘達洛斯: 唉,我想他應該過來接近⼀天 當⼩的⼩⿆變成從不吃的時候, 誰是他的死亡鏈條和⾂⺠, 我不應該睡覺。 第⼆位參議員: 他們遠離了我⼼中產⽣的這些苦難, 當我滅亡的時候,我應該埋葬和堅強 許多國家的地球和思想。

    電腦仿的莎⼠⽐ 亞作品。
  303. !303 注意 為了讓⼤家更容易瞭解, 我們會⽤較簡 單的圖⽰。請注意輸⼊都是個向量、會 有權重; 輸出都是純量。 xt = ⎡

    ⎢ ⎢ ⎢ ⎣ xt,1 xt,2 . . . xt,n ⎤ ⎥ ⎥ ⎥ ⎦ 可能⻑這樣
  304. !304 注意 為了讓⼤家更容易瞭解, 我們會⽤較簡 單的圖⽰。請注意輸⼊都是個向量、會 有權重; 輸出都是純量。 實際輸⼊⻑這樣

  305. !305 注意 為了讓⼤家更容易瞭解, 我們會⽤較簡 單的圖⽰。請注意輸⼊都是個向量、會 有權重; 輸出都是純量。 同理 h 也是這樣

  306. !306 對同⼀層第 k 個 cell, 就⼀個輸出。 輸⼊可能是向量 。 第 k

    號 RNN Cell
  307. !307 真正連結的樣⼦, 注意 RNN Cell 會把記憶傳給同⼀層其 他 RNN Cells。

  308. !308 標準 RNN ⼀個 Cell 的輸出

  309. !309 LSTM GRU Long Short Term Memory Gated Recurrent Unit

    事實上現在⼤家說到 RNN 是想到...
  310. !310 LSTM Long Short Term Memory RNN 系的王牌救援

  311. !311 編號 k 的
 LSTM 多⼀個「cell 狀態」

  312. !312 Gate 控制閥 重要概念

  313. !313 輸出 0 到 1 間的⼀個數 sigmoid 只是決定「閥」要開多⼤

  314. !314 LSTM 有三個 Gates

  315. !315 忘記⾨ 輸⼊⾨ 輸出⾨

  316. !316 插播 tanh sigmoid

  317. !317 -1 1

  318. !318 0 1 σ(x) = 1 1 + e−x

  319. !319 編號 k 的
 LSTM LSTM 再⼀次 多出來的 cell state

    是屬於這個 cell 的 ⼀個 cell 的 output 還是會 和同⼀層分享
  320. !320 「新的」狀態資訊

  321. !321

  322. !322 真要弄得那麼複雜? 要忘多少和要記多少難道不能⼀一起...

  323. !323 GRU Gated Recurrent Unit LSTM 的簡化版

  324. !324 雖然名稱有 gated 只留兩個 Gates

  325. !325 記憶⾨ 重設⾨

  326. !326 input 可不考慮從前

  327. !327

  328. !328 重點 RNN 的名字 現在說到 RNN, 其實包括原始 RNN, LSTM, GRU

    等各種變形。 特別要叫原始的 RNN, 我們習慣叫它 Vanilla RNN, 在 Keras 中是 SimpleRNN。