K 值選對,準確率翻倍:KNN 算法調參的黃金法則

目錄

?

一、背景介紹

二、KNN 算法原理

2.1 核心思想

2.2 距離度量方法

2.3 算法流程

2.4算法結構:

三、KNN 算法代碼實現

3.1 基于 Scikit-learn 的簡單實現

3.2 手動實現 KNN(自定義代碼)

四、K 值選擇與可視化分析

4.1 K 值對分類結果的影響

4.2 交叉驗證選擇最優 K 值

五、KNN 算法的優缺點與優化

5.1 優點

5.2 缺點

5.3 優化方法

六、KNN 算法的應用場景

七、KNN 與其他算法的對比

八、小結


?

一、背景介紹

K 近鄰算法(K-Nearest Neighbors, KNN)是機器學習中最簡單、最直觀的算法之一,其核心思想源于人類對相似事物的判斷邏輯 ——“近朱者赤,近墨者黑”。該算法無需復雜的訓練過程,直接通過計算樣本間的距離來進行分類或回歸,廣泛應用于圖像識別、文本分類、推薦系統等領域。

二、KNN 算法原理

2.1 核心思想

KNN 的核心思想是:對于一個待預測樣本,找到訓練數據中與其最相似的 K 個樣本(近鄰),根據這 K 個樣本的類別(分類問題)或數值(回歸問題)進行投票或平均,從而確定待預測樣本的類別或數值。

關鍵點

相似性度量:通過距離函數衡量樣本間的相似性。

K 值選擇:近鄰數量 K 對結果影響顯著。

投票機制:分類問題通常采用多數投票,回歸問題采用均值或加權平均。

2.2 距離度量方法

常見的距離度量方法包括:

歐氏距離:適用于連續變量,計算兩點間的直線距離。

曼哈頓距離:適用于城市網格路徑等場景,計算兩點間的折線距離。

余弦相似度:適用于文本、圖像等高維數據,衡量向量間的方向相似性。

2.3 算法流程

KNN 算法的典型流程如下:

1·數據預處理:對數據進行清洗、歸一化,避免特征量綱影響距離計算。

2·計算距離:計算待預測樣本與所有訓練樣本的距離。

3·選擇近鄰:按距離升序排列,選取前 K 個最近鄰樣本。

4·分類 / 回歸決策

分類:統計 K 個近鄰的類別,選擇出現次數最多的類別。

回歸:計算 K 個近鄰數值的平均值或加權平均值。

2.4算法結構:

三、KNN 算法代碼實現

3.1 基于 Scikit-learn 的簡單實現

以鳶尾花數據集(Iris Dataset)為例,演示 KNN 分類的完整流程。

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加載鳶尾花數據集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 僅取前兩個特征,便于可視化
y = iris.target
feature_names = iris.feature_names[:2]# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 數據標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)# 創建KNN分類器(K=5)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)# 預測測試集
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy with K=5: {accuracy:.2f}")  # 輸出:Accuracy with K=5: 0.98

3.2 手動實現 KNN(自定義代碼)

為深入理解算法原理,我們手動實現 KNN 分類器:

class CustomKNN:def __init__(self, n_neighbors=3):self.n_neighbors = n_neighborsdef fit(self, X_train, y_train):self.X_train = X_trainself.y_train = y_traindef predict(self, X_test):predictions = []for x in X_test:# 計算距離distances = [np.sqrt(np.sum((x - x_train)**2)) for x_train in self.X_train]# 獲取最近的K個樣本索引k_indices = np.argsort(distances)[:self.n_neighbors]# 獲取對應的類別k_nearest_labels = self.y_train[k_indices]# 多數投票most_common = np.bincount(k_nearest_labels).argmax()predictions.append(most_common)return np.array(predictions)# 使用自定義KNN
custom_knn = CustomKNN(n_neighbors=3)
custom_knn.fit(X_train, y_train)
y_pred_custom = custom_knn.predict(X_test)
print(f"Custom KNN Accuracy: {accuracy_score(y_test, y_pred_custom):.2f}")  # 輸出:0.96

四、K 值選擇與可視化分析

4.1 K 值對分類結果的影響

K 值是 KNN 算法的核心超參數,其大小直接影響分類結果:

  • K 值過小:模型復雜度高,易受噪聲影響,導致過擬合。
  • K 值過大:模型趨于平滑,可能忽略局部特征,導致欠擬合。

示例:在鳶尾花數據集上,不同 K 值的分類邊界差異如下:

def plot_decision_boundary(clf, X, y, title, k=None):plt.figure(figsize=(8, 6))x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),np.arange(y_min, y_max, 0.02))Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.8)# 繪制散點圖for i, color in zip([0, 1, 2], ['r', 'g', 'b']):idx = np.where(y == i)plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i], edgecolor='k')plt.xlabel(feature_names[0])plt.ylabel(feature_names[1])plt.title(f"KNN Decision Boundary (K={k})")plt.legend()plt.show()# K=1(過擬合)
knn1 = KNeighborsClassifier(n_neighbors=1)
knn1.fit(X_train, y_train)
plot_decision_boundary(knn1, X_test, y_test, "K=1", k=1)# K=15(欠擬合)
knn15 = KNeighborsClassifier(n_neighbors=15)
knn15.fit(X_train, y_train)
plot_decision_boundary(knn15, X_test, y_test, "K=15", k=15)

4.2 交叉驗證選擇最優 K 值

通過交叉驗證可以有效選擇最優 K 值:

from sklearn.model_selection import cross_val_score# 候選K值
k_values = range(1, 31)
cv_scores = []for k in k_values:knn = KNeighborsClassifier(n_neighbors=k)scores = cross_val_score(knn, X_train, y_train, cv=5, scoring='accuracy')cv_scores.append(scores.mean())# 繪制K值與準確率曲線
plt.plot(k_values, cv_scores, marker='o', linestyle='--', color='b')
plt.xlabel('K Value')
plt.ylabel('Cross-Validation Accuracy')
plt.title('K Value Selection via Cross-Validation')
plt.show()

五、KNN 算法的優缺點與優化

5.1 優點

簡單易懂:原理直觀,無需復雜數學推導。

無需訓練:直接使用訓練數據進行預測。

泛化能力強:對非線性數據分布有較好的適應性。

5.2 缺點

計算復雜度高:預測時需計算與所有訓練樣本的距離。

存儲成本高:需存儲全部訓練數據。

對噪聲敏感:K 值過小時,異常值可能顯著影響結果。

5.3 優化方法

數據預處理:歸一化、特征選擇。

近似最近鄰搜索:KD 樹、球樹等加速算法。

加權投票:根據距離賦予不同權重。

六、KNN 算法的應用場景

  • 圖像識別與分類:常用于手寫數字識別、人臉識別等任務。
  • ?推薦系統:基于用戶或物品的相似度進行推薦。
  • ?醫療診斷:根據患者的臨床指標預測疾病類別。
  • ?異常檢測:通過判斷樣本與近鄰的距離識別異常點。

七、KNN 與其他算法的對比

算法核心思想優點缺點適用場景
KNN基于相似性投票 / 平均簡單直觀、無需訓練計算慢、存儲成本高、高維性能差小規模數據、實時預測
邏輯回歸基于概率的線性分類訓練快、可解釋性強僅適用于線性可分數據、需調參二分類、概率預測
決策樹基于特征劃分的樹結構分類可解釋性強、能處理非線性數據易過擬合、對噪聲敏感分類規則提取、快速預測

八、小結

KNN 算法以其簡單性和直觀性成為機器學習入門的經典算法,適用于小規模、低維數據的快速分類 / 回歸任務。盡管存在計算效率和高維性能的局限,但其思想為許多復雜算法提供了基礎。通過數據預處理、近似搜索和加權機制,KNN 的實用性可進一步提升;未來,隨著硬件計算能力的提升和近似搜索算法的發展,KNN 在大規模數據中的應用可能迎來新突破。結合深度學習的特征提取能力,可構建更強大的混合模型。

?

?

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

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

相關文章

Azure DevOps Server 2022.2 補丁(Patch 5)

微軟Azure DevOps Server的產品組在4月8日發布了2022.2 的第5個補丁。下載路徑為:https://aka.ms/devops2022.2patch5 這個補丁的主要功能是修改了代理(Agent)二進制安裝文件的下載路徑;之前,微軟使用這個CND(域名為vstsagentpackage.azuree…

PHP7+MySQL5.6 查立得輕量級公交查詢系統

# PHP7MySQL5.6 查立得輕量級公交查詢系統 ## 系統簡介 本系統是一個基于PHP7和MySQL5.6的輕量級公交查詢系統(40KB級),支持線路查詢、站點查詢和換乘查詢功能。系統采用原生PHPMySQL開發,無需第三方框架,適合手機端訪問。 首發版本&#x…

Vue-Cropper:全面掌握圖片裁剪組件

Vue-Cropper 完全學習指南:Vue圖片裁剪組件 🎯 什么是 Vue-Cropper? Vue-Cropper 是一個簡單易用的Vue圖片裁剪組件,支持Vue2和Vue3。它提供了豐富的配置選項和回調方法,可以滿足各種圖片裁剪需求。 🌟 …

[Go] Option選項設計模式 — — 編程方式基礎入門

[Go] Option選項設計模式 — — 編程方式基礎入門 全部代碼地址,歡迎?? Github:https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-option 1 介紹 在 Go 開發中,我們經常遇到需要處理多參數配置的場景。傳統方…

【Unity開發】控制手機移動端的震動

🐾 個人主頁 🐾 阿松愛睡覺,橫豎醒不來 🏅你可以不屠龍,但不能不磨劍🗡 目錄 一、前言二、Unity的Handheld.Vibrate()三、調用Android原生代碼四、NiceVibrations插件五、DeviceVibration插件六、控制游戲手…

Linux 軟件安裝方式全解(適用于 CentOS/RHEL 系統)

🐧 Linux 軟件安裝方式全解(適用于 CentOS/RHEL 系統) 在 Linux 系統中,軟件安裝方式豐富多樣,常見于以下幾種方式: 安裝方式命令/工具說明軟件包管理器(推薦)yum, dnf, apt, zypp…

前端面試題-HTML篇

1. 請談談你對 Web 標準以及 W3C 的理解和認識。 我對 Web 標準 的理解是,它就像是互聯網世界的“交通規則”,由 W3C(World Wide Web Consortium,萬維網聯盟) 這樣一個國際性組織制定。這些規則規范了我們在編寫 HTML、CSS 和 JavaScript 時應該遵循的語法和行為,比如要…

ERROR: column cl.udt_name does not exist LINE 1 navicat打開金倉表報錯

描述: ERROR: column cl.udt_name does not exist LINE 1: …a.columns cl LEFT JOlN pg type ty ON ty.typname cl.udt nam. navicat連上金倉數據庫之后,想打開一張表看看,每張表都報這個錯,打不開 解決方案: 網上…

2025年- H61-Lc169--74.搜索二維矩陣(二分查找)--Java版

1.題目描述 2.思路 方法一: 定義其實坐標,右上角的元素(0,n-1)。進入while循環(注意邊界條件,行數小于m,列數要>0)從右上角開始開始向左遍歷(比當…

Jupyter MCP服務器部署實戰:AI模型與Python環境無縫集成教程

Jupyter MCP 服務器是基于模型上下文協議(Model Context Protocol, MCP)的 Jupyter 環境擴展組件,它能夠實現大型語言模型與實時編碼會話的無縫集成。該服務器通過標準化的協議接口,使 AI 模型能夠安全地訪問和操作 Jupyter 的核心…

MySQL下載安裝配置環境變量

MySQL下載安裝配置環境變量 文章目錄 MySQL下載安裝配置環境變量一、安裝MySQL1.1 下載1.2 安裝 二、查看MySQL服務是否啟動三、配置環境變量四、驗證 一、安裝MySQL 1.1 下載 官網社區版(免費版):https://dev.mysql.com/downloads/mysql/ …

WSL 安裝 Debian 12 后,Linux 如何安裝 curl , quickjs ?

在 WSL 的 Debian 12 系統中安裝 curl 非常簡單,你可以直接使用 APT 包管理器從官方倉庫安裝。以下是詳細步驟: 1. 更新軟件包索引 首先確保系統的包索引是最新的: sudo apt update2. 安裝 curl 執行以下命令安裝 curl: sudo…

Linux入門(十四)rpmyum

RPM 是RedHat PackManager的縮寫 rpm是用于互聯網下載包的打包及安裝工具 rpm查詢 查詢已安裝的rpm列表 rpm -qa查看系統是否安裝了psmisc rpm -qa | grep psmisc rpm -q psmisc查詢軟件包信息 rpm -qi psmisc查詢軟件包中的文件 rpm -ql psmisc根據文件全路徑 查詢文件所…

[git]忽略.gitignore文件

git rm --cached .gitignore 是一個 Git 命令,主要用于 從版本控制中移除已追蹤的 .gitignore 文件,但保留該文件在本地工作目錄中。以下是詳細解析: 一、命令拆解與核心作用 語法解析 git rm:Git 的刪除命令,用于從版本庫(Repository)中移除文件。--cached:關鍵參數…

Hive SQL 中 BY 系列關鍵字全解析:從排序、分發到分組的核心用法

一、排序與分發相關 BY 關鍵字 1. ORDER BY:全局統一排序 作用:對查詢結果進行全局排序,確保最終結果集完全有序(僅允許單個 Reducer 處理數據)。 語法: SELECT * FROM table_name ORDER BY column1 [A…

網絡爬蟲 - App爬蟲及代理的使用(十一)

App爬蟲及代理的使用 一、App抓包1. App爬蟲原理2. reqable的安裝與配置1. reqable安裝教程2. reqable的配置3. 模擬器的安裝與配置1. 夜神模擬器的安裝2. 夜神模擬器的配置4. 內聯調試及注意事項1. 軟件啟動順序2. 開啟抓包功能3. reqable面板功能4. 夜神模擬器設置項5. 注意事…

【25.06】FISCOBCOS使用caliper自定義測試 通過webase 單機四節點 helloworld等進行測試

前置條件 安裝一個Ubuntu20+的鏡像 基礎環境安裝 Git cURL vim jq sudo apt install -y git curl vim jq Docker和Docker-compose 這個命令會自動安裝docker sudo apt install docker-compose sudo chmod +x /usr/bin/docker-compose docker versiondocker-compose vers…

【基礎】Unity中Camera組件知識點

一、投影模式 (Projection) 1. 透視模式 (Perspective) 原理:模擬人眼,近大遠小(錐形體視錐) 核心參數: Field of View (FOV):垂直視場角 典型值:第一人稱 60-90,駕駛艙 30-45 特…

PCA(K-L變換)人臉識別(python實現)

數據集分析 ORL數據集, 總共40個人,每個人拍攝10張人臉照片 照片格式為灰度圖像,尺寸112 * 92 特點: 圖像質量高,無需灰度運算、去噪等預處理 人臉已經位于圖像正中央,但部分圖像角度傾斜(可…

【Git】View Submitted Updates——diff、show、log

在 Git 中查看更新的內容(即工作區、暫存區或提交之間的差異)是日常開發中的常見操作。以下是常用的命令和場景說明: 文章目錄 1、查看工作區與暫存區的差異2、查看提交歷史中的差異3、查看工作區與最新提交的差異4、查看兩個提交之間的差異5…