KNN算法:從原理到實戰全解析

一 算法介紹

????????K近鄰(K-Nearest Neighbors, KNN)是一種基于實例的監督學習算法,適用于分類和回歸任務。其核心思想是通過計算待預測樣本與訓練集中樣本的距離,選取距離最近的K個鄰居,根據這些鄰居的標簽進行投票(分類)或均值計算(回歸)來預測結果。

二 原理

  1. 距離度量:常用歐氏距離(Euclidean Distance)計算樣本間的相似性,公式為:

    ,這里表示a,b兩點間的距離。其他可選距離包括曼哈頓距離、余弦相似度等。

  2. K值選擇:K是用戶定義的超參數,影響模型復雜度。較小的K容易過擬合,較大的K可能忽略局部特征。通常通過交叉驗證確定最優K值。

  3. 決策規則

    • 分類:統計K個鄰居中最多數的類別作為預測結果。
    • 回歸:取K個鄰居目標值的平均值作為預測輸出。

三 具象化

根據上面原理我們知道主要是依據距離來判斷的,可能會有點模糊,下面我來舉例說明:

在圖中表示有多個圈圈,每個圈圈都有各自的價格和顏色。

1 分類

????????在這個中,這里我們k=4,意思就是找具體他們最近的四個元素,如何找其中一個顏色最多的那個就把我們這個未知的歸為那一類,這里我們距離是按坐標算的。我們可以想一下,這里每個圈圈的坐標就是它的特征,如果是其他類型的數據,我們也可以用他們的特征之間的差距,去找臨近的一個,如何去分類

2 回歸?

????????這個和上面差不多,在找到最近的幾個,如何依據他們的值,如何去求平均,就可以得到他們的具體值了。

四 代碼實現

1 分類

# 導入庫
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加載數據
iris = load_iris()
X, y = iris.data, iris.target# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 創建KNN分類器(K=5)
knn_classifier = KNeighborsClassifier(n_neighbors=5)# 訓練模型
knn_classifier.fit(X_train, y_train)# 預測并評估
y_pred = knn_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"分類準確率: {accuracy:.2f}")  # 示例輸出:分類準確率: 0.98[4,11](@ref)
  • 使用sklearn.neighbors.KNeighborsClassifier實現分類。
  • 通過n_neighbors參數控制鄰居數量(K值),默認K=5。

2 回歸

# 導入庫
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error# 生成模擬數據
np.random.seed(0)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])# 劃分訓練集和測試集
X_train, X_test = X[:80], X[80:]
y_train, y_test = y[:80], y[80:]# 創建KNN回歸器(K=3)
knn_regressor = KNeighborsRegressor(n_neighbors=3, weights='distance')# 訓練模型
knn_regressor.fit(X_train, y_train)# 預測并評估
y_pred = knn_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"均方誤差(MSE): {mse:.4f}")  # 示例輸出:均方誤差(MSE): 0.0123[6,7](@ref)

?我們會發現,python的sklearn包封裝的特別好,我們幾乎可以不用了解內部計算過程,只需要他是解決什么問題,有個大致了解就可以使用了。

擴展

我們從sklearn的官網上查看這個,有很多參數,下面我們拓展的講幾項。

KNeighborsClassifiern_neighbors=5,?*,?weights='uniform',?algorithm='auto',?leaf_size=30?p=2,?metric='minkowski',?metric_params=,?n_jobs=)[來源]

1 weights權重

這個就是,在我們計算的過程中,某些東西可能影響比較大,那么就會對最終結果印象較大。

用于預測的權重函數。可能的值:

  • 'uniform' :統一的權重。每個鄰域中的所有點 權重相等。

  • 'distance' :按距離的倒數加權點。 在這種情況下,查詢點的更近鄰居將有一個 比距離較遠的鄰居具有更大的影響力。

  • [callable] :一個用戶定義的函數,它接受 距離數組,并返回相同形狀的數組 包含權重。

不要與最近鄰搜索、最近鄰插值或?k?均值聚類混淆。

在統計學中,k-最近鄰算法k-NN)是一種非參數監督學習方法。它最初由?Evelyn Fix?和?Joseph Hodges?于 1951 年開發,[1]后來由?Thomas Cover?擴展。[2]大多數情況下,它用于分類,作為?k-NN?分類器,其輸出是類成員資格。對象通過其鄰居的多個投票進行分類,該對象被分配給其?k 個最近鄰中最常見的類(k?是正整數,通常很小)。如果?k?= 1,則對象被簡單地分配給該單個最近鄰的類。

k-NN?算法也可以推廣用于回歸。在?k-NN?回歸(也稱為最近鄰平滑)中,輸出是對象的屬性值。該值是?k?個最近鄰值的平均值。如果?k?= 1,則輸出將簡單地分配給該單個最近鄰的值,也稱為最近鄰插值

對于分類和回歸,一種有用的技術是為鄰居的貢獻分配權重,以便較近的鄰居比遠鄰對平均值的貢獻更大。例如,常見的加權方案包括為每個鄰居提供 1/d?的權重,其中?d?是到鄰居的距離。[3]

輸入由數據集中最接近的?k?個訓練示例組成。 鄰居取自一組對象,其類(用于 k-NN 分類)或對象屬性值(用于?k-NN?回歸)已知。這可以被認為是算法的訓練集,盡管不需要顯式訓練步驟。

k-NN 算法的一個特點(有時甚至是一個缺點)是它對數據的局部結構敏感。 在?k-NN?分類中,函數僅在局部近似,所有計算都推遲到函數評估。由于該算法依賴于距離,如果特征代表不同的物理單位或尺度差異很大,那么對訓練數據進行特征歸一化可以大大提高其準確性。[4]

參數選擇

k?的最佳選擇取決于數據;通常,較大的 k?值會降低噪聲對分類的影響,[8]但使類之間的邊界不那么明顯。可以通過各種啟發式技術選擇一個好的?k(參見超參數優化)。該類被預測為最接近訓練樣本的類(即當?k?= 1 時)的特殊情況稱為最近鄰算法。

k-NN 算法的準確性可能會因存在嘈雜或不相關的特征,或者如果特征尺度與其重要性不一致而嚴重下降。在選擇或縮放特征以改進分類方面投入了大量研究工作。一種特別流行的[需要引用]方法是使用進化算法來優化特征縮放。[9]另一種流行的方法是通過訓練數據與訓練類的互信息來縮放特征。[需要引用]

在二元(兩類)分類問題中,選擇?k?作為奇數是有幫助的,因為這可以避免平局投票。在此設置中選擇經驗最優?k?的一種流行方法是通過引導方法。[10]

?距離計算方法

1.?歐氏距離(Euclidean Distance)

2.?曼哈頓距離(Manhattan Distance)

3.?閔可夫斯基距離(Minkowski Distance)

4.?切比雪夫距離(Chebyshev Distance)

5.?馬氏距離(Mahalanobis Distance)

6.?余弦相似度(Cosine Similarity)

7.?漢明距離(Hamming Distance)

8.?杰卡德距離(Jaccard Distance)

9.?布雷葉距離(Bray-Curtis Distance)

10.?馬氏重合距離(Mahalanobis–Ovchinnikov Distance)

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

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

相關文章

醫療器械:DFEMA和PFEMA

在醫療器械行業,DFMEA(Design FMEA,設計失效模式及影響分析)和 PFMEA(Process FMEA,過程失效模式及影響分析)是核心的風險管理工具,旨在通過系統性識別潛在風險、分析影響并采取預防…

Qt 與 SQLite 嵌入式數據庫開發

Qt 與 SQLite 的結合是開發輕量級、跨平臺嵌入式數據庫應用的理想選擇。SQLite 作為一種零配置、文件型數據庫,無需獨立的服務器進程,非常適合集成到 Qt 應用中。本文將深入探討 Qt 與 SQLite 的嵌入式數據庫開發,包括基礎操作、高級特性、性…

Oracle OMF 非OMF 文件 轉化 不需要重建 file#.incarnation#

不需要重建就要重啟, alter database datafile move 就可以在線 file#.incarnation# 是 incarnation 不是dbid Goal How to convert non OMF files to OMF files with ASM storage Datafiles are not deleted at dropping tablespace if files are non-OMF and …

大型微服務項目:聽書——11 Redisson分布式布隆過濾器+Redisson分布式鎖改造專輯詳情接口

11 Redisson分布式布隆過濾器Redisson分布式鎖改造專輯詳情接口 11.1 緩存穿透解決方案&布隆過濾器 緩存穿透解決方案: 布隆過濾器: 布隆過濾器的使用: 11.2 遠程調用查詢所有的專輯id集合 修改: /*** 查詢所有的專輯…

STM32與ADS1220實現多通道數據采集的完整分析和源程序

以下是基于STM32與ADS1220實現多通道數據采集的完整分析和源程序,結合硬件設計、通信協議及軟件優化,提供高精度采集解決方案: 一、系統設計關鍵要點 ADS1220特性 24位高精度ΔΣ ADC,支持4路單端或2路差分輸入 集成PGA(增益1~128)、基準電壓和可編程電流源 多通道限制:…

百特搭AI低代碼平臺助力企業國際化業務敏捷拓展

在全球化浪潮下,企業揚帆出海或服務全球客戶已成為重要戰略。然而,開拓國際市場面臨多重挑戰:語言文化差異顯著、本地化需求復雜多變、智能化應用需求激增、各國IT基礎設施與合規要求各異。企業亟需一個能夠快速響應、靈活適應,并…

epoll_event數據結構及使用案例詳解

epoll_event 數據結構詳解 在 Linux 的 I/O 多路復用機制 epoll 中&#xff0c;epoll_event 是關鍵的數據結構&#xff0c;用于描述文件描述符&#xff08;fd&#xff09;上的事件和關聯數據。其定義在頭文件 <sys/epoll.h> 中&#xff1a; struct epoll_event {uint32_t…

C++11STL容器map和set簡單介紹

一、引言map和set底層結構比較復雜&#xff0c;我認為我們先談基本介紹再談C11&#xff0c;最后再談map和set底層以及map和set封裝。二、簡單介紹一下map和setmap和set底層都是紅黑樹&#xff0c;是二叉搜索樹的一種&#xff0c;查找非常快。不像數組、鏈表一樣一個一個對比&am…

Java線程基礎面試復習筆記

1. 線程與進程的區別進程是正在運行程序的實例&#xff0c;線程是進程中的執行單元。主要區別&#xff1a; 內存空間&#xff1a;不同進程使用不同的內存空間&#xff0c;同一進程下的線程共享內存空間資源開銷&#xff1a;線程更輕量&#xff0c;線程上下文切換成本比進程上下…

面試題(技術面+hr面)

面試技術面HR面后端HR面常見問題*穩定性&#xff0c;上進心&#xff0c;目標感&#xff0c;抗壓能力&#xff0c;學習能力*回答問題時注意體現上面五點&#xff0c;即使瞎扯也盡量往上靠。面經項目相關介紹一下你收獲最大的一個項目你們團隊有多少人&#xff0c;怎么分工的開發…

本地部署Dify教程

克隆 Dify 代碼倉庫克隆 Dify 源代碼至本地。git clone hts://github.com/langgenius/dify.git啟動 Dify進入 Dify 源代碼的 docker 目錄&#xff0c;執行一鍵啟動命令:cd dify/docker #切換到指定目錄 cp .env.example .env #修改文件名 docker compose up -d #啟動

Android Kotlin 協程全面指南

協程是 Kotlin 提供的一套簡化異步編程的輕量級線程操作框架&#xff0c;特別適合 Android 開發中的異步任務處理。以下是 Android 開發中需要掌握的協程核心知識點&#xff1a;1. 協程基礎概念1.1 協程是什么輕量級線程&#xff1a;比線程更高效&#xff0c;可以在單個線程中運…

【Linux】進程切換與優先級

前言&#xff1a; 上文我們講到了操作系統與Linux中進程的狀態【Linux】進程狀態-CSDN博客 本文我們來講進程的優先級、以及進程的切換 進程優先級 什么是優先級&#xff1f; CPU中資源是有限的&#xff0c;而進程的數量一定是遠大于CPU資源的&#xff0c;所以優先級是進程得…

首發即開源!DAWorkBench數據可視化分析軟件正式發布!(附源碼下載網址)

1 系統介紹DAWorkBench是一款面向科研實驗和工程測試場景的數據可視化分析開源軟件&#xff0c;支持實現數據清洗、信號處理和交互式可視化等功能。系統集成文件IO、數據處理以及可視化交互三大模塊&#xff0c;支持多維數據分析與高質量圖表生成&#xff0c;助力用戶高效完成從…

Android Studio歷史版本快速下載(二次修改記錄)

原版&#xff1a;Android Studio歷史版本快速下載_android studio 歷史版本下載-CSDN博客 一. 最新版本 https://developer.android.com/studio?hlzh-cn 二. 歷史版本 中國官網的歷史版本為何不能下載&#xff1f;&#xff08;https://developer.android.com/studio/archi…

The Missing Semester of Your CS Education 學習筆記以及一些拓展知識(六)

文章目錄The Missing Semester of Your CS Education 學習筆記以及一些拓展知識版本控制Git筆記部分Git的基本工作原理Git 的核心工作原理&#xff1a;快照而非差異Git 的三大工作區域Git的核心對象Git的四個對象對象之間的關系與工作流程&#xff1a;對象的引用Git的安裝和基礎…

嵌入式與 Linux 系統中的核心圖形庫全解析

嵌入式與 Linux 系統中的核心圖形庫全解析 圖形庫在嵌入式系統與 Linux 桌面系統中扮演著重要角色。從最底層的 GPU 驅動接口&#xff0c;到上層的圖形渲染與 GUI 工具包&#xff0c;共同構成了完整的圖形顯示棧。本文將系統整理圖形相關的核心組件&#xff0c;按功能分層分類&…

深度學習模塊實踐手冊(第十二期)

56、Ghost 模塊論文《GhostNet: More Features from Cheap Operations》1、作用&#xff1a; Ghost 模塊是一種輕量級的特征提取模塊&#xff0c;旨在通過廉價操作生成更多特征圖&#xff0c;減少計算量的同時保持模型性能。傳統卷積神經網絡在生成特征圖時存在大量冗余計算&am…

自己動手造輪子:如何創建JAR并通過Maven在Spring Boot中引用

讓代碼復用變得簡單優雅——3分鐘學會封裝專屬工具庫作為Java開發者&#xff0c;你是否遇到過這些痛點&#xff1f;多個項目重復編寫相同工具類工具代碼分散難以統一維護團隊協作缺乏標準化工具庫本文將手把手教你創建自己的JAR包&#xff0c;并優雅地集成到Spring Boot項目中&…

使用dea工具 給vue 里面的ts打斷點

在 Vue 項目中使用 TypeScript 時&#xff0c;我們通常會在 IDE&#xff08;如 JetBrains 的 IntelliJ IDEA 或 WebStorm&#xff09;中設置斷點進行調試。以下是詳細步驟&#xff1a; 準備工作 確保項目已配置 source maps&#xff08;Vue CLI 創建的項目默認已配置&#xff0…