機器學習 => 讓機器自己學習如何進步並解決問題
“A computer program is said to learn from experience E with respect to some task T and some performance measure P, if its performance on T, as measured by P, improves with experience E.”
今天檸檬想要使用Machine Learning,辨識跟他聊天的是真的女生還是真的男生。根據他遇到一些好的或不太好ㄉ體驗結果,他記下每次的聊天對象的性別,希望能夠改良程式使他獲得更好的聊天體驗。
請問在這個情境下,Task(T)是哪個選項?
(A) 看檸檬到底遇到了幾個男生
(B) 程式正確預測檸檬會不會遇到女生的準確度
(C) 將檸檬的聊天對象以比較可能是男生還是女生做分類
(D) 以上皆非,他不會遇到女生,這根本不是ML可解決ㄉ問題
差別在於
資料是否有標準答案
資料是有標準答案ㄉ那個
e.g. 房價預測、圖像辨識
資料是沒有標準答案ㄛ
e.g. 人聲分離、顧客分析
透過數學和程式語言
而程式語言將會使用Python <3
我們會上一些數學方面的東東
我很抱歉啦,數學其實還蠻重要ㄉ
喔喔 但我不會讓一整節課都是數學啦 放心
你們主要會學到的:線性代數、微積分(微分)
我應該不會講得太難懂
btw 這堂課也有放一點數學 QAQ
其實別的程式語言也可以用啦
e.g. Octave, Matlab, 甚至 Java script 和 C++
但Python編寫容易、功能強大,現在幾乎是最熱門的選擇ㄌ
尤其我們這次會大量使用到Python提供的函式庫
肯定是直接用爆Python的啊
順帶一提
如果不會Python語法的話
可以考慮上禮拜四的小社ㄛ
Framework => 框架
簡單來說,就是有電神幫忙寫好
方便開發、使用的大型程式庫
e.g. PyTorch, Tensorflow, Keras
但我們沒有要用這個 ㄎㄎ
cuz 這樣比較難以了解背後的原理
這是一個 3-dimensional vector
一個數字就是一個維度 => 三圍維向量
我們通常以小寫字母表示一個向量
對於一個\(n\)維向量\(v\),我們寫作\(v \in R^{n}\)
這是一個 3 by 2-dimensional matrix
有三列(row, 橫的)、兩行(column, 直的)
我們通常以大寫字母表示一個矩陣
對於一個\(n \times m\)的矩陣\(M\),我們寫作\(M \in R^{n \times m}\)
明顯地,當\(n \neq m,\ R^{n \times m}\ \neq R^{m \times n}\)
看看左邊的向量,我們可以發現:
它是一個 3-dimensional vector
也是一個 3 by 1-dimensional matrix
這是替身攻擊!
也就是說
我們可以把向量看成是一種矩陣的特殊情況
所以後面我都只講矩陣(摸頭燦笑
矩陣和向量是可以跟一般的常數做乘法
其實就把矩陣中的每個東西都拿來乘而已
直接加(減)就對ㄌ (\(M_1的維度要等於M_2\))
乘法比較麻煩 QAQ
只有在 \(A \in R^{n \times m}\ 且\ B \in R^{m \times k}\) 乘法才有意義
得到的結果 \( A \times B \in R^{n \times k}\)
上面的栗子:
來個小測驗(確定大家的腦袋還沒燒掉
假設 \(a \in R^{20},\ B \in R^{15 \times 20}\)
因為檸檬不太會這題
請告訴檸檬 \(a \times B\ 和\ B \times a\ 的維度\)是多少?
(A) \(R^{20 \times 15},\ R^{15 \times 1}\)
(B) \(R^{15 \times 20},\ 無意義\)
(C) \(無意義,\ R^{15}\)
(D) 我知道答案,但我不想告訴他
所以矩陣乘法到底怎麼算?
先看最左上角那一個交點
先由最遠的開始相乘,之後加起來
\(3 \times 3 + 1 \times 4 = 13\)
btw 我們沒有要教除法
但還有一個很重要的東西要說
Transpose => 轉置
再來個小測驗(這是最後ㄌ
請你告訴檸檬 \(a \times b^T =\ ?\)
(A) \(\begin{bmatrix}2&3&2\\6&9&6\\8&12&8\end{bmatrix}\)
(B) 無意義
(C) \(19\)
(D) 學長我想回家ㄌ
import numpy as np #引入NumPy
#建立兩個矩陣
A = np.array([
[1, 2],
[3, 4]
])
B = np.array([
[5, 6],
[7, 8]
])
print(A+B)
print("--------------")
print(A-B)
print("--------------")
print(A*B)
覺得矩陣很難ㄇ
NumPy早就想到這點了
話不多說,用用看就知道ㄌ
運行剛剛的程式碼
你會發現輸出結果是:
[[ 6 8]
[10 12]]
--------------
[[-4 -4]
[-4 -4]]
--------------
[[ 5 12]
[21 32]]
這是因為NumPy的+ - * /預設是element-wise
也就是讓每一格的元素分別+ - * /後輸出一個新的矩陣
我們可以試試下面的程式碼:
print(np.add(A,B))
print("--------------")
print(np.subtract(A,B))
print("--------------")
print(np.dot(A,B))
其實矩陣的加減本來就是element-wise
至於為什麼會用到不同的函式來做同一件事
其實它不完全一樣
為了知道到底差在哪
我們可以先來了解
NumPy的Broadcast
a = np.array([
[1],
[2]
])
print(A)
print(f"shape = {A.shape}")#輸出A的維度
print("---------------")
print(a)
print(f"shape = {a.shape}")#輸出a的維度
print("---------------")
print(A+a)
print(f"shape = {(A+a).shape}")#輸出A+a的維度
運算會根據給定的矩陣
自動的延伸、廣播
讓+ - * /有更強的擴充性
Broadcast對其他的- * /也是適用的
這個技巧很方便ㄉ
感覺很常用到(?
print(A+a)
print("--------------")
print(A-a)
print("--------------")
print(A*a)
print("--------------")
print(A/a)
今後的程式練習
我們會用Google的Colab
今天的部分就是讓你們熟悉一下NumPy和Colab
這是李連杰(不好笑
檔案 => 在雲端硬碟中儲存副本
然後就可以開始寫ㄌ
喔喔 我前面有放我上課講的Code
可以去看看ㄛ <3
下禮拜就可以做出簡單的人工智慧ㄌ
大家一定要來喔
不會那麼數學了啦 (茶