---
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)之間的歐幾里得距離為

2. `曼哈頓距離(Manhattan distance)`:現實世界中,點跟點的最短距離不一定是可以被實際執行的。點跟點之間先計算水平距離,再計算垂直距離。

在機器學習中,我們經常會計算兩點最短距離來作為分類的依據,又,使用歐幾里得距離的計算為最常見,關於歐幾里得距離的敘述,何者正確?
- [ ] 英文是 Euclidean Distance
- [ ] 點跟點之間先計算水平距離,再計算垂直距離。
- [ ] 計算兩點之差的平方和的平方根
- [ ] 為兩點間最短的距離
# 7-2 KNN 分類器
> ML工廠要開始訓練模型了,這款模型叫作分類器,它會將資料以數值化的方式表示,且要丟入分類器的每筆資料都要事先標籤,也就是有相對應的所屬類別。
> 這款分類器在碰到一筆新的資料,會找出該筆資料最接近的K個資料。這種方法就像「投票表決」一樣,當K個資料中的某個類別的數量較多時,則新的資料會歸屬於該類別。

> 假設圓形紅點為 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) 吧!

執行結果(參考):

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