機器學習知識地圖 · 監督式學習
K-近鄰 (KNN)
近朱者赤,近墨者黑
觀念教學
想知道一個人是哪掛的,看他最常跟誰混 — K-近鄰(KNN, K-Nearest Neighbors)把「近朱者赤,近墨者黑」直接寫成演算法。
核心觀念
一筆新資料進來,找出訓練集中距離最近的 K 個鄰居,由它們多數決投票決定類別(回歸任務則取平均)。它是懶惰學習(Lazy Learning):平時不建模型,預測時才臨時計算與所有資料的距離。
白話理解
K 設為 3,新資料的三個最近鄰分別是類別 A、B、A — 兩票對一票,判 A 類。這正是歷屆考題的原型:老老實實數票就對了。推薦系統找相似用戶、小資料集分類、異常檢測,都是它的地盤。
優缺點
- 優點:超簡單直覺、不需要訓練階段、非線性邊界也能處理
- 缺點:預測很慢 — 每次都要跟全部資料算距離,資料量大就吃不消
- 缺點:高維度效果差,即維度詛咒:維度一高,大家的距離都差不多遠
- 缺點:K 值敏感 — K 太小易受雜訊干擾,K 太大邊界過度模糊;常用交叉驗證選 K,並取奇數避免平手
- 距離計算型模型,特徵必先縮放;評估看準確率、F1-Score
🎯 口訣:K 個鄰居投票,多數說了算;平時不讀書,考試才翻書 — 這就是懶惰學習。
iPAS 考點
歷屆直接出「K = 3,最近鄰類別為 A、B、A,預測為何」→ 多數決答 A,送分題但要看清 K 值與票數。特性判斷的關鍵字:不需訓練階段、預測成本高、對 K 值與距離度量敏感、需要特徵縮放。
📝 本節掛載 1 題 iPAS 歷屆試題 — 讀完往下到「iPAS 考題練習」直接實戰。
應用場景
評估指標
iPAS 歷屆考題詳解(3 題)
先自行作答,再展開詳解。題目出處均為 iPAS AI 應用規劃師正式考題,著作權屬原主辦單位。
某模型使用 K 近鄰演算法(KNN)進行分類,K 設為 3。一筆新的測試資料輸入後,與其最接近的 3 筆資料的類別如下:鄰近樣本 1:類別 A、鄰近樣本 2:類別 B、鄰近樣本 3:類別 A。請問模型會將這筆資料預測為哪一類別?
- A類別 A
- B類別 B
- C類別 A 與 B 各一半,無法分類
- D類別 A 或 B,視距離遠近加權而定
看正解與逐選項詳解
正解:A
研究人員對 sklearn 內建的手寫數字資料集 digits(1797 筆、64 維特徵、共 10 個類別)進行分類,決定使用 KNN 並搭配交叉驗證評估模型準確率。他們撰寫了四組程式碼(均已執行 from sklearn.model_selection import StratifiedKFold, cross_val_score、from sklearn.neighbors import KNeighborsClassifier,並設定 X, y = digits.data, digits.target): 程式碼A: model = KNeighborsClassifier(n_neighbors=3) cv = StratifiedKFold(n_splits=5, shuffle=True) scores = cross_val_score(model, X, y, cv=cv, scoring="accuracy") print(scores.mean()) 程式碼B: model = KNeighborsClassifier(n_neighbors=3) cv = StratifiedKFold(n_splits=5, shuffle=True) scores = cross_val_score(model, X, y, cv=cv, scoring="f1") print(scores.mean()) 程式碼C: model = KNeighborsClassifier(n_neighbors=3) scores = cross_val_score(model, X, y, cv=5, scoring="accuracy") print(scores.mean()) 程式碼D: model = KNeighborsClassifier(n_neighbors=3) scores = cross_val_score(model, X, y, cv=5, scoring="f1") print(scores.mean()) 請問哪幾組程式碼能正確使用 KNN 搭配交叉驗證,對 digits 資料集進行訓練並輸出準確率?
- A程式碼A、程式碼B、程式碼C、程式碼D
- B程式碼A、程式碼C
- C程式碼A、程式碼B
- D程式碼C、程式碼D
看正解與逐選項詳解
正解:B
以下為一段分類演算法的 pseudocode: 輸入: - train_data:訓練資料集,每筆包含特徵和標籤 - test_point:要預測的資料點 - X:要考慮的最近鄰個數 輸出: - 預測的分類標籤 演算法: 1. 初始化一個空列表 distances 2. 對於每個訓練資料中的樣本 sample: a. 計算 sample 與 test_point 的距離 distance b. 把 (distance, sample 的標籤) 加到 distances 中 3. 按照距離對 distances 升序排序 4. 取出前 X 個距離最小的項目,記錄它們的標籤 5. 統計這 X 個標籤中出現次數最多的那個標籤 6. 返回該標籤作為 test_point 的預測結果 請問此 pseudocode 最可能對應下列哪一種演算法?
- AK-近鄰(K-Nearest Neighbors, KNN)
- BK-means 分群(K-means Clustering)
- C支援向量機(Support Vector Machine, SVM)
- D隨機森林分類器(Random Forest Classifier)
看正解與逐選項詳解
正解:A