【機器學習】之 K-最近鄰(KNN)算法原理及實現

K-最近鄰(K-Nearest Neighbors, KNN)是一種簡單且直觀的監督學習算法,廣泛應用于分類和回歸任務。本文將介紹KNN算法的基本概念、實現細節以及Python代碼示例。

基本概念

KNN算法的核心思想是:給定一個測試樣本,根據其在特征空間中與訓練樣本的距離,找到距離最近的K個訓練樣本(鄰居),然后通過這些鄰居的標簽來決定測試樣本的標簽。在分類任務中,KNN通過對K個鄰居的標簽進行投票,選擇出現次數最多的標簽作為預測結果;在回歸任務中,KNN通過對K個鄰居的標簽進行平均來預測結果。

算法步驟

  1. 計算距離:計算測試樣本與每個訓練樣本之間的距離。
  2. 選擇最近的K個鄰居:根據距離選擇K個最近的訓練樣本。
  3. 投票:在K個最近鄰居中,選擇出現次數最多的類別作為預測結果。

距離度量

在KNN算法中,通常使用歐氏距離(Euclidean Distance)來度量樣本之間的距離。

實現代碼

下面是一個使用 numpy 實現的 KNN 分類器的示例代碼:

import numpy as np
from collections import Counterclass KNN:def __init__(self, k=3):self.k = kdef fit(self, X_train, y_train):"""訓練KNN分類器,保存訓練數據。參數:- X_train: 訓練樣本特征,形狀 (num_samples, num_features)- y_train: 訓練樣本標簽,形狀 (num_samples,)"""self.X_train = X_trainself.y_train = y_traindef predict(self, X_test):"""對測試樣本進行預測。參數:- X_test: 測試樣本特征,形狀 (num_samples, num_features)返回值:- y_pred: 預測標簽,形狀 (num_samples,)"""y_pred = [self._predict(x) for x in X_test]return np.array(y_pred)def _predict(self, x):"""對單個測試樣本進行預測。參數:- x: 單個測試樣本特征,形狀 (num_features,)返回值:- 預測標簽"""# 計算所有訓練樣本與測試樣本之間的距離distances = np.linalg.norm(self.X_train - x, axis=1)# 獲取距離最近的k個訓練樣本的索引k_indices = np.argsort(distances)[:self.k]# 獲取k個最近鄰居的標簽k_nearest_labels = [self.y_train[i] for i in k_indices]# 返回出現次數最多的標簽most_common = Counter(k_nearest_labels).most_common(1)return most_common[0][0]# 示例用法
if __name__ == "__main__":# 創建示例數據X_train = np.array([[1, 2], [2, 3], [3, 4], [6, 7], [7, 8], [8, 9]])y_train = np.array([0, 0, 0, 1, 1, 1])X_test = np.array([[2, 3], [3, 5], [8, 8]])# 創建KNN實例knn = KNN(k=3)knn.fit(X_train, y_train)predictions = knn.predict(X_test)print("測試樣本預測結果:", predictions)

代碼解釋

  1. 初始化

    • __init__ 方法初始化KNN分類器,并設置K值。
  2. 訓練模型

    • fit 方法保存訓練樣本的特征和標簽,供后續預測使用。
  3. 預測

    • predict 方法對一組測試樣本進行預測,返回預測標簽。
    • _predict 方法對單個測試樣本進行預測:
      • 計算測試樣本與每個訓練樣本之間的歐氏距離。
      • 找到距離最近的K個訓練樣本的索引。
      • 獲取K個最近鄰居的標簽。
      • 返回出現次數最多的標簽作為預測結果。
  4. 示例用法

    • 創建示例訓練數據和測試數據。
    • 實例化KNN分類器,并設置K值為3。
    • 調用 fit 方法訓練模型。
    • 調用 predict 方法對測試樣本進行預測,并輸出預測結果。

超參數選擇

K值是KNN算法的一個關鍵超參數,其選擇會直接影響模型的性能。一般來說,較小的K值會導致模型對噪聲敏感,而較大的K值會使模型過于平滑,導致欠擬合。可以通過交叉驗證來選擇最優的K值。

優缺點

優點

  • 簡單直觀,易于理解和實現。
  • 不需要顯式的訓練過程,只需保存訓練數據。
  • 對于小規模數據集效果較好。

缺點

  • 計算復雜度高,對大規模數據集不適用。
  • 對噪聲和不相關特征敏感。
  • 需要保存所有訓練數據,存儲開銷大。

總結

K-最近鄰(KNN)是一種經典的機器學習算法,適用于分類和回歸任務。盡管其簡單性和直觀性使其在許多應用中表現良好,但在處理大規模數據集和高維數據時,KNN的計算復雜度和存儲需求成為其主要限制因素。通過合理選擇K值和使用適當的距離度量,KNN可以在許多實際問題中取得令人滿意的效果。

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

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

相關文章

上位機圖像處理和嵌入式模塊部署(f407 mcu vs f103)

【 聲明:版權所有,歡迎轉載,請勿用于商業用途。 聯系信箱:feixiaoxing 163.com】 對于一部分嵌入式場景來說,f103其實已經足夠了,特別是要求不高的低速場合。如果開發的代碼比較多,還可以選用更…

黑馬es集群

1、為什么要做es集群 單機的elasticsearch做數據存儲,必然面臨兩個問題:海量數據存儲問題、單點故障問題 海量數據存儲問題:將索引庫從邏輯上拆分為N個分片(shard),存儲到多個節點 單點故障問題:將分片數據在不同節點備份(replica) 2、搭建es集群 1、用…

Python 數據庫編程(Mysql)

目錄 知識點 游標 提交事務 檢索數據 回滾 關閉 增刪改查 查詢 新增 修改 刪除 回滾的用法 知識點 游標 在Python中,數據庫游標(cursor)是用于執行SQL語句并檢索數據的對象。游標允許你在數據庫中移動并操作數據。在使用Python進…

請說明Vue的filter的理解與用法

Vue.js 的 filter 是一種特殊的功能,允許你在mustache插值 ({{ }}) 或 v-bind 表達式中預處理文本。然而,需要注意的是,從 Vue 2.x 開始,filter 已被標記為廢棄,并且在 Vue 3.x 中已完全移除。盡管如此,了解…

力扣Hot100-有效的括號(棧stack)

給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的相同類型的左括…

【C++】哈希(2萬字)

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 目錄 前言 unordered系列關聯式容器 unordered_map unordered_map的文檔介紹 unordered_map的接口說明 unordered_set 底層結構 哈希概念 哈希沖突 哈希函數 哈希…

Whisper-AT:抗噪語音識別模型(Whisper)實現通用音頻事件標記(Audio Tagger)

1.概述: Whisper-AT 是建立在 Whisper 自動語音識別(ASR)模型基礎上的一個模型。Whisper 模型使用了一個包含 68 萬小時標注語音的大規模語料庫進行訓練,這些語料是在各種不同條件下錄制的。Whisper 模型以其在現實背景噪音(如音樂…

探究 Meme 的金融與社交屬性

原文標題:《A Social and Financial Study of Memecoins》撰文:Andrew Hong編譯:Chris,Techub News 每一個市場周期都伴隨著 Meme 代幣的出現。一群人圍繞著某個 Meme 集結起來,暫時抬高了某個資產的價格(從…

Github Copilot登錄賬號,完美支持chat

Github Copilot 代碼補全等功能,提高寫代碼的效率 https://web.52shizhan.cn/activity/copilot 登錄授權后,已經可以使用,完美。如圖

flutter 自動生成靜態資源的引用

flutter_gen庫的使用 第一步、項目yarml中dev_dependencies 新增一下flutter_gen_runner 和build_runner dev_dependencies:build_runner: nullflutter_gen_runner: null # flutter packages pub run build_runner build 第二步、新增配置信息 和(dev_dependencies 同級的) …

大話設計模式學習筆記

目錄 工廠模式策略模式備忘錄模式(快照模式)代理模式單例模式迭代器模式訪問者模式觀察者模式解釋器模式命令模式模板方法模式橋接模式適配器模式外觀模式享元模式原型模式責任鏈模式中介者模式裝飾模式狀態模式 工廠模式 策略模式 核心:封裝…

03.k8s常用的資源

3.k8s常用的資源 3.1 創建pod資源 k8s yaml的主要組成 apiVersion: v1 api版本 kind: pod 資源類型 metadata: 屬性 spec: 詳細上傳nginx鏡像文件,并且上傳私有倉庫里面 k8s_pod.yaml apiVersion: v1 kind: Pod metadata:name: nginxlabels:app: we…

prometheus 標簽選擇器 正則表達式 = 、=~

Prometheus expression是一種用于查詢和操作Prometheus時間序列數據的查詢語言。它具有一套豐富的函數和運算符,可以用于提取、聚合和轉換時間序列數據。 正則表達式在Prometheus expresion中也被廣泛使用,可以用于匹配和過濾時間序列。 Prometheus ex…

Tuxera Ntfs For Mac 2023的具體使用方法

大家都知道由于操作系統的原因,在蘋果電腦上不能夠讀寫NTFS磁盤,但是,今天小編帶來的這款tuxera ntfs 2024 mac 破解版,完美的解決了這個問題。這是一款在macOS平臺上使用的磁盤讀寫軟件,能夠實現蘋果Mac OS X系統讀寫…

CSS實驗性功能及CSS4特性

CSS4目前仍然是一個寬泛的概念,因為CSS的發展通常是通過一系列逐步完善的模塊來進行的,而不是一次性推出一個全新的“第四代”。許多所謂的“CSS4”特性實際上是正在開發或已經草案階段的CSS模塊,它們可能在未來的CSS規范中被正式采納。 選擇器4: :is() 和 :where() 偽類允…

Docker的數據管理(數據卷+數據卷容器)

文章目錄 一、Docker的數據管理1、概述2、主要的技術(三種數據掛載方式)2.1、數據卷(Volumes)2.2、綁定掛載(Bind mounts)2.3、tmpfs掛載(Tmpfs mounts)2.4、之間的關系(…

偏微分方程算法之二階雙曲型方程交替方向隱格式(變形一)

目錄 一、研究目標 二、變形 三、算例實現 四、計算結果 本專欄介紹了二階雙曲型偏微分方程的交替方向隱格式的介紹和推導(鏈接如下),本節將進一步研究二維雙曲型方程初邊值問題其它的交替方向隱格式。

示例丨醫學、醫藥類查新點填寫參考案例

根據《科技查新技術規范》GB/T 32003-2015,科學技術要點是必須要包含查新點內容的,而查新點就是科學技術要點中能夠體現查新項目新穎性和技術進步的技術特征點。 在日常查新工作的接待中,我們發現醫學、醫藥類查新合同上查新點的書寫&#x…

計算機tcp/ip網絡通信過程

目錄 (1)同一網段兩臺計算機通信過程 (2)不同網段的兩臺計算機通信過程 (3)目的主機收到數據包后的解包過程 (1)同一網段兩臺計算機通信過程 如果兩臺計算機在同一個局域網中的同…

算法(九)希爾排序

文章目錄 希爾排序簡介代碼實現 希爾排序簡介 希爾排序(shell sort)選定一個小于N(數列長度)的整數gap作為第一增量,然后將所有距離為gap的元素分成一組,然后對每一組的元素進行插入排序。然后再取一個比前…