--- title: 第7單元 最短距離、KNN tags: 人工智慧 --- # 7-1 最短距離 > 在標籤島中,有座叫作 ML 的工廠,正在進行人工智慧的核心技術之一,也就是`機器學習(Machine Learning)`的訓練。 接受訓練的資料須先進行`資料數值化`,也就是讓每一個訓練資料皆能展現在空間座標中。 下圖中的資料點`紅色`(貓)、`藍色`(狗)。 橫軸:耳朵的長度 縱軸:鬍鬚的長度 <img src=https://i.imgur.com/v2tiPHy.png width=80%/><br> ### 任務:計算每個類別資料的中心點 計算方式就是將每個類別的 X , Y 資料點做平均。 <img src=https://i.imgur.com/DaAqTkv.png width=80%/> 針對已知的紅點跟藍點類別,找出兩個類別的中心點。下列何者有誤? - [ ] 紅色類別的中心點為 ( X , Y ) = ( 3, 6.25 ) - [ ] 藍色類別的中心點為 ( X , Y ) = ( 6.83, 3 ) - [ ] 紅色類別的資料有(2, 6)、(3, 4)、(3, 8)與(4, 7) - [ ] 藍色類別的資料有(6, 2)、(6, 3)、(7, 3)、(7, 4)、(7, 6)與(8, 5) ans:B # 最短距離 > 在 ML工廠中,正在針對每個類別,計算該類別的中心點到該類別的資料點兩點的最短距離。我們知道計算兩點最短距離的方式有 1. `歐幾里得距離(Euclidean Distance)`:兩點之差的平方和的平方根,兩點間最短的距離。在N維的座標中,點x=(x1....xi),y=(y1...yi)之間的歐幾里得距離為 ![](https://i.imgur.com/bhP5ioA.png) 2. `曼哈頓距離(Manhattan distance)`:現實世界中,點跟點的最短距離不一定是可以被實際執行的。點跟點之間先計算水平距離,再計算垂直距離。 ![](https://i.imgur.com/uQIl965.jpg) 在機器學習中,我們經常會計算兩點最短距離來作為分類的依據,又,使用歐幾里得距離的計算為最常見,關於歐幾里得距離的敘述,何者正確? - [ ] 英文是 Euclidean Distance - [ ] 點跟點之間先計算水平距離,再計算垂直距離。 - [ ] 計算兩點之差的平方和的平方根 - [ ] 為兩點間最短的距離 # 7-2 KNN 分類器 > ML工廠要開始訓練模型了,這款模型叫作分類器,它會將資料以數值化的方式表示,且要丟入分類器的每筆資料都要事先標籤,也就是有相對應的所屬類別。 > 這款分類器在碰到一筆新的資料,會找出該筆資料最接近的K個資料。這種方法就像「投票表決」一樣,當K個資料中的某個類別的數量較多時,則新的資料會歸屬於該類別。 ![](https://i.imgur.com/DlkYrqV.png) > 假設圓形紅點為 A 類,菱形藍點為 B 類,新的資料-黃點屬於哪類? 看圈起來的範圍,以多數決的方式決定。 > 不同的K值,可導致不同的分類結果。那K值要設定多少最好?取決於資料及應用的情境。若兩種類別,建議K值挑奇數,以避免判定類別時出現數量相同狀況。 Q:假設K值設定為1,也就是要找距離黃點最近的1個點。請問黃點屬於哪個分類? - [ ] 找到1個藍點,因此判斷黃點是屬於A分類 - [ ] 找到1個藍點,因此判斷黃點是屬於B分類 ans:B Q:假設K值設定為5,也就是要找距離黃點最近的5個點,請問黃點屬於哪個分類? - [ ] 找到2個藍點及3個紅點,因此判斷黃點屬於A分類 - [ ] 找到2個藍點及3個紅點,因此判斷黃點屬於B分類 ans:A Q:針對 KNN 分類器進行討論,何者有誤? - [ ] k值取太小容易受異常點的影響 - [ ] k值如果取得太大容易受到鄰近點(類別)結果比例影響 - [ ] KNN的缺點:因為每個點都需計算距離造成效率低落 - [ ] 若兩種類別,建議K值挑偶數 ans:D --- # 7-3 實作 > ML工廠即將展開模型訓練、模型預測。 > 我們將使用 kNN 分類器`KNeighborsClassifier`來進行。 執行步驟如下: 1. 建立`KNeighborsClassifier`模組:`模型名稱=KNeighborsClassifier()`或`模型名稱 = KNeighborsClassifier(n_neighbors=k值)` 2. 使用`fit()`丟入訓練集來訓練模型:`模型名稱.fit(訓練用的特徵資料,訓練用的標籤資料)` 3. 利用`predict()`將測試集丟到模型中進行預測:`預測結果=模型名稱.predict(測試用的特徵資料)` 4. 利用`score()`來計算準確度為多少:`模型名稱.score(測試用的特徵資料, 測試用的標籤資料)` 請試著跑跑看下方的 [程式碼](https://ideone.com/k5R59y) 吧! ![](https://i.imgur.com/mQ87G95.png) 執行結果(參考): ![](https://i.imgur.com/7Z48qn9.png) hint~ 從執行結果,可得知整個模型的準確率達96.67%,代表每100筆資料的預測,有96筆與真實的答案相同。 你會發現有幾筆資料有誤差,預測結果有誤。 ## 想想看 ### 1. 如果 k 值不同,會不會有更好或更壞的預測準確值呢? 在建立模型時指定 k 值,假設 k 值為7時,你可以加入參數設定`n_neighbors=7`,例如:`模型名稱 = KNeighborsClassifier(n_neighbors=7) ### 2. 每個鄰居的意見都一樣重要嗎?是否有其他模式?會影響預測準確值呢? 在建立模型時你還可以設定權重 wieght ,其模式有兩種 * `uniform`:在建立模型時,預設為 uniform,表示每個資料點的權重都相同 * `distance`:如果採用 distance 權重計算,表示權重是距離的倒數。 你可以加入參數設定`weight="distance"`,例如: `模型名稱 =KNeighborsClassifier(weight="distance")` 想進一步了解KNN可以到 [scikit-learn官網](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html)看看唷! 下列哪個是sklearn的KNN分類器? - [ ] KNeighborsClassifier - [ ] DecisionTreeClassifier ans:A 請問程式碼中第22行「KNeighborsClassifier ()」代表的是什麼意思? - [ ] 使用KNN分類器,K值為5 - [ ] 也可以寫成 KNeighborsClassifier (5) ans:A