K 近鄰算法(K-Nearest Neighbors, KNN)詳解及案例

K近鄰算法(K-Nearest Neighbors, KNN)詳解及案例

一、基本原理

K近鄰算法是一種監督學習算法,核心思想是“物以類聚,人以群分”:對于一個新樣本,通過計算它與訓練集中所有樣本的“距離”,找出距離最近的K個樣本(即“近鄰”),再根據這K個近鄰的標簽(分類問題)或數值(回歸問題)推斷新樣本的結果。

KNN屬于“惰性學習(Lazy Learning)”,它沒有顯式的“訓練過程”,不會提前構建模型,而是在預測時直接依賴訓練數據進行計算,因此也被稱為“實例-based學習”。

二、核心要素與關鍵步驟

1. 距離度量

距離用于衡量樣本間的相似性,距離越小,樣本越相似。常用的距離度量包括:

  • 歐氏距離(最常用):適用于連續特征,計算n維空間中兩個點的直線距離。
    公式:對于樣本x=(x1,x2,...,xn)x=(x_1,x_2,...,x_n)x=(x1?,x2?,...,xn?)y=(y1,y2,...,yn)y=(y_1,y_2,...,y_n)y=(y1?,y2?,...,yn?),歐氏距離為:
    d(x,y)=∑i=1n(xi?yi)2d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}d(x,y)=i=1n?(xi??yi?)2?

  • 曼哈頓距離:適用于高維數據,計算坐標軸上的“城市街區距離”。
    公式:d(x,y)=∑i=1n∣xi?yi∣d(x,y)=\sum_{i=1}^{n}|x_i-y_i|d(x,y)=i=1n?xi??yi?

  • 余弦相似度:適用于高維稀疏數據(如文本),衡量向量方向的相似性(與模長無關)。
    公式:cos?θ=x?y∣∣x∣∣?∣∣y∣∣=∑i=1nxiyi∑i=1nxi2?∑i=1nyi2\cos\theta=\frac{x\cdot y}{||x||\cdot||y||}=\frac{\sum_{i=1}^{n}x_i y_i}{\sqrt{\sum_{i=1}^{n}x_i^2}\cdot\sqrt{\sum_{i=1}^{n}y_i^2}}cosθ=∣∣x∣∣?∣∣y∣∣x?y?=i=1n?xi2???i=1n?yi2??i=1n?xi?yi??

2. K值選擇

K值是KNN的核心超參數,直接影響預測結果:

  • K值過小:近鄰數量少,易受噪聲樣本影響,導致“過擬合”(模型對訓練數據太敏感)。
  • K值過大:近鄰包含過多無關樣本,導致“欠擬合”(模型忽略局部特征,偏向全局平均)。
  • 常見選擇:通常取奇數(避免投票平局),如3、5、7等;實際應用中通過交叉驗證(如5折交叉驗證)選擇最優K值。

3. 決策規則

  • 分類問題:對K個近鄰的標簽進行“多數投票”(少數服從多數),得票最多的標簽即為新樣本的預測類別。
  • 回歸問題:對K個近鄰的數值取“平均值”(或加權平均值),作為新樣本的預測值。

4. 核心步驟

  1. 確定距離度量方式(如歐氏距離)和K值;
  2. 計算新樣本與訓練集中所有樣本的距離;
  3. 按距離從小到大排序,選取前K個樣本作為“近鄰”;
  4. 根據K個近鄰的標簽(分類)或數值(回歸),得到新樣本的預測結果。

三、優缺點

優點

  • 簡單直觀:無需復雜的模型訓練,原理易懂,實現難度低;
  • 適應性強:可處理非線性數據,對特征分布無嚴格假設;
  • 擴展性好:可通過優化距離計算(如KD樹、球樹)提升效率。

缺點

  • 計算成本高:預測時需與所有訓練樣本計算距離,樣本量過大時速度慢;
  • 對不平衡數據敏感:若某類樣本占比極高,K近鄰易被其主導;
  • 對噪聲和異常值敏感:離群點可能被誤判為“近鄰”,影響預測結果;
  • 依賴距離度量:高維數據中“距離”的意義會弱化(維度災難)。

四、案例詳情(分類問題:電影類型預測)

問題描述

已知4部電影的特征(搞笑鏡頭數、打斗鏡頭數)和標簽(喜劇片/動作片),預測一部新電影的類型。

訓練數據

電影ID搞笑鏡頭數(特征1)打斗鏡頭數(特征2)標簽
A3010喜劇片
B205喜劇片
C540動作片
D1030動作片

新樣本

待預測電影E:搞笑鏡頭數=25,打斗鏡頭數=20,需預測其類型。

預測步驟

步驟1:確定參數

選擇歐氏距離作為度量方式,K=3(奇數,避免平局)。

步驟2:計算新樣本與訓練樣本的距離

電影E(25,20)與A、B、C、D的歐氏距離:

  • 與A(30,10)的距離:(25?30)2+(20?10)2=(?5)2+102=25+100=125≈11.18\sqrt{(25-30)^2+(20-10)^2}=\sqrt{(-5)^2+10^2}=\sqrt{25+100}=\sqrt{125}\approx11.18(25?30)2+(20?10)2?=(?5)2+102?=25+100?=125?11.18
  • 與B(20,5)的距離:(25?20)2+(20?5)2=52+152=25+225=250≈15.81\sqrt{(25-20)^2+(20-5)^2}=\sqrt{5^2+15^2}=\sqrt{25+225}=\sqrt{250}\approx15.81(25?20)2+(20?5)2?=52+152?=25+225?=250?15.81
  • 與C(5,40)的距離:(25?5)2+(20?40)2=202+(?20)2=400+400=800≈28.28\sqrt{(25-5)^2+(20-40)^2}=\sqrt{20^2+(-20)^2}=\sqrt{400+400}=\sqrt{800}\approx28.28(25?5)2+(20?40)2?=202+(?20)2?=400+400?=800?28.28
  • 與D(10,30)的距離:(25?10)2+(20?30)2=152+(?10)2=225+100=325≈18.03\sqrt{(25-10)^2+(20-30)^2}=\sqrt{15^2+(-10)^2}=\sqrt{225+100}=\sqrt{325}\approx18.03(25?10)2+(20?30)2?=152+(?10)2?=225+100?=325?18.03
步驟3:排序并選K=3個近鄰

距離從小到大排序:
A(11.18)→ B(15.81)→ D(18.03)→ C(28.28)
前3個近鄰為:A、B、D。

步驟4:多數投票
  • 近鄰A的標簽:喜劇片;
  • 近鄰B的標簽:喜劇片;
  • 近鄰D的標簽:動作片;
  • 投票結果:喜劇片(2票)>動作片(1票)。
預測結果

電影E被預測為喜劇片

五、總結

KNN是一種基于“相似性”的簡單算法,核心依賴距離度量和K值選擇。盡管存在計算成本高的問題,但因其直觀性和適應性,在推薦系統、圖像識別、文本分類等領域仍被廣泛應用(如推薦系統中“相似用戶喜歡的商品”推薦)。實際使用時需注意優化樣本量和距離計算,以提升效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92407.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解 Redis 集群化看門狗機制:原理、實踐與風險

在分布式系統中,我們常常需要執行一些關鍵任務,這些任務要么必須成功執行,要么失敗后需要明確的狀態(如回滾),并且它們的執行時間可能難以精確預測。如何確保這些任務不會被意外中斷,或者在長時…

Python機器學習:從零基礎到項目實戰

目錄第一部分:思想與基石——萬法歸宗,筑基問道第1章:初探智慧之境——機器學習世界觀1.1 何為學習?從人類學習到機器智能1.2 機器學習的“前世今生”:一部思想與技術的演進史1.3 為何是Python?——數據科學…

數據庫:庫的操作

1:查看所有數據庫SHOW DATABASES;2:創建數據庫CREATE DATABASE [ IF NOT EXISTS ] 數據庫名 [ CHARACTER SET 字符集編碼 | COLLATE 字符集校驗規則 | ENCRYPTION { Y | N } ];[]:可寫可不寫{}:必選一個|:n 選 1ENCR…

AngularJS 動畫

AngularJS 動畫 引言 AngularJS 是一個流行的JavaScript框架,它為開發者提供了一種構建動態Web應用的方式。在AngularJS中,動畫是一個強大的功能,可以幫助我們創建出更加生動和引人注目的用戶界面。本文將詳細介紹AngularJS動畫的原理、用法以及最佳實踐。 AngularJS 動畫…

SonarQube 代碼分析工具

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 ??全面掌握 SonarQube:企業代碼質量保障的利器 ?? 在當今 DevOps 流水線中,代碼…

vmware vsphere esxi6.5 使用工具導出鏡像

注:為什么使用這個工具,我這邊主要因為esxi6.5自身bug導致web導出鏡像會失敗一、下載VMware-ovftool到本地系統(根據你的操作系統版本到官網下載安裝,此處略)以下內容默認將VMware-ovftool安裝到windows 本地系統為例。…

ES 踩坑記:Set Processor 字段更新引發的 _source 污染

問題背景 社區的一個伙伴想對一個 integer 的字段類型添加一個 keyword 類型的子字段,然后進行精確匹配的查詢優化,提高查詢的速度。 整個索引數據量不大,并不想進行 reindex 這樣的復雜操作,就想到了使用 update_by_query 的存量…

如何徹底搞定 PyCharm 中 pip install 報錯 ModuleNotFoundError: No module named ‘requests’ 的問題

如何徹底搞定 PyCharm 中 pip install 報錯 ModuleNotFoundError: No module named ‘requests’ 的問題 在使用 PyCharm 開發 Python 項目時,ModuleNotFoundError: No module named requests 是一個常見但令人頭疼的問題。本篇博文將從環境配置、原因分析到多種解…

powerquery如何實現表的拼接主鍵

在做表過程中,有時候沒有基表,這個時候就要構造完整的主鍵,這樣才可以使之后匹配的數據不會因為主鍵不全而丟失數據 我的處理方法是吧多個表的主鍵拼在一起然后去重,構造一個單單之后之間的表作為基表去匹配數據 所以就喲啊用到自…

今日Github熱門倉庫推薦 第八期

今日Github熱門倉庫推薦2025-07-22 如果讓AI分別扮演 后端開發人員和前端開發人員,然后看看他們分別對github每天的trending倉庫感興趣的有哪些,并且給出他感興趣的理由,那會發生什么呢? 本內容通過Python AI生成,項…

Dify-13: 文本生成API端點

本文檔提供了有關 Dify 中與文本生成相關的 API 端點的全面信息。文本生成 API 支持無會話持久性的單次請求文本生成,使其適用于翻譯、摘要、文章寫作等非對話式人工智能應用場景。 概述 文本生成 API 端點允許開發人員將 Dify 的文本生成功能集成到不需要維護對話上…

Leetcode 3620. Network Recovery Pathways

Leetcode 3620. Network Recovery Pathways 1. 解題思路2. 代碼實現 題目鏈接:3620. Network Recovery Pathways 1. 解題思路 這一題我最開始想的是遍歷一下所有的網絡路徑,不過遇到了超時的情況。因此后來調整了一下處理思路,使用二分法的…

鏈路備份技術(鏈路聚合、RSTP)

一、鏈路聚合!鏈路備份技術之一-----鏈路聚合(Link Aggregation)被視為鏈路備份技術,核心原因在于它能通過多條物理鏈路的捆綁,實現 “一條鏈路故障時,其他鏈路自動接管流量” 的冗余備份效果,同…

PyTorch新手實操 安裝

PyTorch簡介 PyTorch 是一個基于 Python 的開源深度學習框架,由 Meta AI(原 Facebook AI)主導開發,以動態計算圖(Define-by-Run)為核心,支持靈活構建和訓練神經網絡模型。其設計理念高度契合科…

Element Plus Table 組件擴展:表尾合計功能詳解

前言在現代數據驅動的社會中,數據分析和統計成為了非常重要的任務。為了更有效地分析數據和展示統計結果,前端開發人員可以使用Vue框架和Element Plus組件庫來實現數據的統計和分析功能。以下是一個關于如何在 Element Plus 的 el-table 組件中實現行匯總…

神經網絡 非線性激活層 正則化層 線性層

神經網絡 非線性激活層 作用:增強模型的非線性擬合能力 非線性激活層網絡: class activateNet(nn.Module):def __init__(self):super(activateNet,self).__init__()self.relu nn.ReLU()self.sigmoid nn.Sigmoid()def forward(self,input):#output sel…

【Vue進階學習筆記】組件通信專題精講

目錄前言props 父傳子原理說明使用場景代碼示例父組件 PropsTest.vue子組件 Child.vue自定義事件 $emit 子傳父原理說明使用場景代碼示例父組件 EventTest.vue子組件 Event2.vueEvent Bus 兄弟/跨層通信原理說明使用場景代碼示例事件總線 bus/index.ts兄弟組件通信示例Child2.v…

【PTA數據結構 | C語言版】求最小生成樹的Prim算法

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 請編寫程序,實現在帶權的無向圖中求最小生成樹的 Prim 算法。 注意:當多個待收錄頂點到當前點集的距離等長時,按編號升序進行收錄。 輸入格式: 輸入首…

【加解密與C】Rot系列(四)RotSpecial

RotSpecial 函數解析RotSpecial 是一個自定義函數,通常用于處理特定的旋轉操作,尤其在圖形變換或數據處理中。該函數可能涉及歐拉角、四元數或其他旋轉表示方法,具體行為取決于實現上下文。以下是關于該函數的通用解釋和可能的使用方法&#…

【機器學習深度學習】LLaMAFactory中的精度訓練選擇——bf16、fp16、fp32與pure_bf16深度解析

目錄 前言 一、 為什么精度如此重要?—— 內存、速度與穩定性的三角博弈 二、 四大精度/模式詳解: bf16, fp16, fp32, pure_bf16 三、 關鍵特性對比表 ▲四大計算類型核心對比表 ▲ 顯存占用對比示例(175B參數模型) ▲LLa…