機器學習知識地圖 · 監督式學習

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 考題練習」直接實戰。

應用場景

推薦系統模式識別異常檢測

評估指標

準確率F1-Score

iPAS 歷屆考題詳解(3 題)

先自行作答,再展開詳解。題目出處均為 iPAS AI 應用規劃師正式考題,著作權屬原主辦單位。

第四梯次初級AI應用規劃師第一科人工智慧基礎概論 第15題

某模型使用 K 近鄰演算法(KNN)進行分類,K 設為 3。一筆新的測試資料輸入後,與其最接近的 3 筆資料的類別如下:鄰近樣本 1:類別 A、鄰近樣本 2:類別 B、鄰近樣本 3:類別 A。請問模型會將這筆資料預測為哪一類別?

  1. A類別 A
  2. B類別 B
  3. C類別 A 與 B 各一半,無法分類
  4. D類別 A 或 B,視距離遠近加權而定
看正解與逐選項詳解

正解:A

正確答案:(A) 【正解解析】 標準 K 近鄰演算法(KNN)的分類規則是多數決:找出與測試資料最接近的 K 筆訓練樣本,統計其類別,以出現次數最多者作為預測結果。本題 K = 3,三個鄰居的類別為 A、B、A,類別 A 得 2 票、類別 B 得 1 票,依多數決模型將這筆資料預測為類別 A。 【為何其他選項錯了?】 - (B):類別 B 僅獲 1 票,少於類別 A 的 2 票;多數決之下,票數較少的類別不會成為預測結果。 - (C):「各一半」與事實不符,2 比 1 已有明確多數;票數平手需要額外處理規則(如調整 K 值或依距離決定)的情況,在本題並未發生。 - (D):依距離遠近加權是加權 KNN(Weighted KNN)的變形作法;題目指明使用標準 KNN,K 個鄰居內每筆樣本的票值相同,不因距離而異。 提示:標準 KNN=K 個鄰居多數決;題目未提及加權時,不應自行套用距離加權規則。
114年第二梯次中級AI應用規劃師第三科機器學習技術與應用 第47題

研究人員對 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 資料集進行訓練並輸出準確率?

  1. A程式碼A、程式碼B、程式碼C、程式碼D
  2. B程式碼A、程式碼C
  3. C程式碼A、程式碼B
  4. D程式碼C、程式碼D
看正解與逐選項詳解

正解:B

正確答案:(B) 【正解解析】 逐組檢查:程式碼A 以 StratifiedKFold(n_splits=5, shuffle=True) 搭配 scoring="accuracy",語法正確,輸出的是準確率。程式碼C 直接指定 cv=5,cross_val_score 對分類器預設即採用分層 K 折(Stratified KFold),搭配 scoring="accuracy" 同樣能正確輸出準確率。因此程式碼A 與程式碼C 皆能正確完成題目要求。 【為何其他選項錯了?】 - (A):程式碼B 與 D 使用 scoring="f1",而 digits 是 10 個類別的多元分類;"f1" 預設採 binary 平均,遇到多類別資料會直接拋出錯誤,必須改用 f1_macro、f1_micro 等指定平均方式;且 F1 分數也不是題目要求輸出的準確率。 - (C):包含程式碼B,其 scoring="f1" 在多類別資料上無法執行,理由同上。 - (D):程式碼D 同樣因 "f1" 設定而失敗,且此選項還遺漏了正確的程式碼A。 提示:多類別分類的 F1 必須指定平均方式(f1_macro/f1_micro);cv 給整數時,分類任務預設自動分層。
115年第一次中級AI應用規劃師第二科大數據處理分析與應用 第40題

以下為一段分類演算法的 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 最可能對應下列哪一種演算法?

  1. AK-近鄰(K-Nearest Neighbors, KNN)
  2. BK-means 分群(K-means Clustering)
  3. C支援向量機(Support Vector Machine, SVM)
  4. D隨機森林分類器(Random Forest Classifier)
看正解與逐選項詳解

正解:A

正確答案:(A) 【正解解析】 此 pseudocode 的流程完全對應 KNN:對測試點計算它與每一筆訓練樣本的距離,依距離升序排序後取最近的 X(即 K)個鄰居,再以多數決投票決定預測類別。KNN 屬於懶惰學習(Lazy Learning):沒有顯式的訓練階段,預測時才進行距離計算,pseudocode 中「不建立模型、直接計算距離加投票」的結構正是其典型寫法。 【為何其他選項錯了?】 - (B):K-means 是非監督式分群,流程為「初始化 K 個群心、指派樣本、更新群心、迭代至收斂」,不使用標籤也沒有投票機制,與本流程不符。 - (C):SVM 的訓練是求解最大間隔超平面,預測時計算樣本落在超平面哪一側,沒有「尋找最近鄰加多數決」的步驟。 - (D):隨機森林需先訓練多棵決策樹,預測時由各樹投票;雖有投票概念,但投票主體是樹而非鄰居,且此 pseudocode 中沒有任何建樹流程。 提示:看到「計算所有距離、取前 K 近、多數決」即為 KNN;K-means 是無標籤分群,KNN 是以鄰居投票的分類。

相關節點