利用knn算法實現手寫數字分類

利用knn算法實現手寫數字分類

  • 1.作者介紹
  • 2.KNN算法
    • 2.1KNN(K-Nearest Neighbors)算法核心思想
    • 2.2KNN算法的工作流程
    • 2.3優缺點
    • 2.4 KNN算法圖示介紹
  • 3.實驗過程
    • 3.1安裝所需庫
    • 3.2 MNIST數據集
    • 3.3 導入手寫數字圖像進行分類
    • 3.4 完整代碼
    • 3.5 實驗結果

1.作者介紹

王鵬飛,男,西安工程大學電子信息學院,2024級研究生
研究方向:機器視覺與人工智能
電子郵件:2018659934@QQ.com

王海博, 男 , 西安工程大學電子信息學院, 2024級研究生, 張宏偉人工智能課題組
研究方向:模式識別與人工智能
電子郵件:1137460680@qq.com

2.KNN算法

2.1KNN(K-Nearest Neighbors)算法核心思想

將訓練數據保存下來,對于一個新的數據點,通過查看其在特征空間中最近的K個鄰居來預測其類別或值。針對分類任務:如果K個鄰居中多數屬于某個類別,那么新數據點也被歸為該類別。

2.2KNN算法的工作流程

(1) 數據準備
特征提取:將數據集中的每個樣本表示為特征向量。
數據標準化:由于KNN依賴距離計算,因此需要對特征進行標準化(如歸一化或Z分數標準化),以消除不同特征量綱的影響。

(2) 距離計算
對于一個新的數據點,計算它與數據集中每個點之間的距離。常用的距離度量方式包括:歐氏距離、曼哈頓距離和明可夫斯基距離。

(3) 確定最近鄰
根據計算出的距離,找出與新數據點距離最近的K個點,這K個點稱為“最近鄰”。
K是一個超參數,需要根據具體問題選擇合適的值。K值過小可能導致過擬合,K值過大可能導致模型過于平滑。

(4) 進行預測
分類任務:統計K個最近鄰中每個類別的出現頻率,選擇出現次數最多的類別作為新數據點的預測類別。

2.3優缺點

(1) 優點
簡單易實現:原理直觀,實現代碼簡單。
無需訓練:KNN不需要像其他算法那樣進行復雜的訓練過程,只需在預測時計算距離。
對復雜數據集表現良好:可以很好地處理多類別問題和非線性數據。
(2) 缺點
計算效率低:每次預測都需要計算新數據點與所有訓練數據點之間的距離,計算量大。
存儲需求高:需要存儲整個訓練數據集。
對K值和距離度量敏感:K值的選擇和距離度量方式對模型性能影響較大。

2.4 KNN算法圖示介紹

在這里插入圖片描述
見上圖所示,五角星為新輸入的數據,原訓練數據有Class A和Class B兩類,對于新輸入的數據,根據特征向量計算新輸入數據點與訓練集數據點之間的距離,根據所選K值確定出,新數據最鄰近K個點,圖示第一次k值選取為3時,其中Class B類占2/3,所以新數據將被分類為Class B類。
當k值選取為6時,見上圖所示,Class A類占4/6,所以此時對于新數據點將被歸為Class A類。由此可見K值的選擇對于分類的結果存在一定的影響,因此k值的選擇對于結果有重要的作用。

3.實驗過程

3.1安裝所需庫

import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import cv2
from PIL import Image
import matplotlib.pyplot as plt

在編寫代碼前需要安裝上述的庫和所需的函數。

3.2 MNIST數據集

MNIST數據集來自美國國家標準與技術研究所。訓練集由來自250個不同人手寫的數字構成,測試集也是同樣的手寫數字數據,保證了測試集和訓練集的作者集不相交。MNIST數據集一共有7萬張圖片,其中6萬張是訓練集,1萬張是測試集。每張圖片是28 × 28像素 的0 ? 9的手寫數字圖片組成。每個圖片是黑底白字的灰度圖像。MNIST數據集可以導入fetch_openml函數從OpenML平臺加載數據集。

3.3 導入手寫數字圖像進行分類

# 導入自定義圖像并進行預測
def preprocess_image(image_path):image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)image = cv2.resize(image, (28, 28))image = cv2.bitwise_not(image)image = image.reshape(1, -1)image = scaler.transform(image)return image
def predict_image(image_path):image = preprocess_image(image_path)prediction = knn.predict(image)return prediction[0]
print("Testing custom image...")
image_path = "d:/wenjian/1.jpg"  #更改為自己的路徑
prediction = predict_image(image_path)
print(f"Predicted digit: {prediction}")
# 顯示圖像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (28, 28))
image = cv2.bitwise_not(image)
plt.imshow(image, cmap="gray")
plt.title(f"Predicted Digit: {prediction}")
plt.show()

導入一張白底黑字的手寫數字圖像,并對圖像進行預處理使得格式和灰度值與其訓練集相同,本次實驗導入的是白底黑字的手寫數字圖像,因為距離計算是依據灰度圖像的灰度值進行計算,訓練集的圖像是黑底白字的灰度圖像,因此需要對灰度值進行反轉,否則會造成預測誤差較大。導入圖像路徑需更改為自己圖像路徑。

3.4 完整代碼

import numpy as np
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report
import cv2
from PIL import Image
import matplotlib.pyplot as plt# 加載MNIST數據集
print("Loading MNIST dataset...")
mnist = fetch_openml('mnist_784', version=1)
X, y = mnist["data"], mnist["target"]
y = y.astype(np.uint8)
# 數據預處理
print("Preprocessing data...")
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 訓練KNN模型
print("Training KNN model...")
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
# 評估模型
print("Evaluating model...")
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
print(classification_report(y_test, y_pred))
# 導入自定義圖像并進行預測
def preprocess_image(image_path):image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)image = cv2.resize(image, (28, 28))image = cv2.bitwise_not(image)image = image.reshape(1, -1)image = scaler.transform(image)return image
def predict_image(image_path):image = preprocess_image(image_path)prediction = knn.predict(image)return prediction[0]
print("Testing custom image...")
image_path = "d:/wenjian/1.jpg"  #更改為自己的路徑
prediction = predict_image(image_path)
print(f"Predicted digit: {prediction}")
# 顯示圖像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
image = cv2.resize(image, (28, 28))
image = cv2.bitwise_not(image)
plt.imshow(image, cmap="gray")
plt.title(f"Predicted Digit: {prediction}")
plt.show()

3.5 實驗結果

在這里插入圖片描述

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

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

相關文章

C語言-適配器模式詳解與實踐

文章目錄 C語言適配器模式詳解與實踐1. 什么是適配器模式?2. 為什么需要適配器模式?3. 實際應用場景4. 代碼實現4.1 UML 關系圖4.2 頭文件 (sensor_adapter.h)4.3 實現文件 (sensor_adapter.c)4.4 使用示例 (main.c) 5. 代碼分析5.1 關鍵設計點5.2 實現特…

Rust函數、條件語句、循環

文章目錄 函數**語句與表達式**條件語句循環 函數 Rust的函數基本形式是這樣的 fn a_func(a: i32) -> i32 {}函數名是蛇形風格,rust不在意函數的聲明順序,只需要有聲明即可 函數參數必須聲明參數名稱和類型 語句與表達式 這是rust非常重要的基礎…

maptalks圖層交互 - 模擬 Tooltip

maptalks圖層交互 - 模擬 Tooltip 圖層交互-模擬tooltip官方文檔 <!DOCTYPE html> <html><meta charsetUTF-8 /><meta nameviewport contentwidthdevice-width, initial-scale1 /><title>圖層交互 - 模擬 Tooltip</title><style typet…

好吧好吧,看一下達夢的模式與用戶的關系

單憑個人感覺&#xff0c;模式在達夢中屬于邏輯對象合集&#xff0c;回頭再看資料 應該是一個用戶可以對應多個模式 問題來了&#xff0c;模式的ID和用戶的ID一樣嗎&#xff1f; 不一樣 SELECT USER_ID,USERNAME FROM DBA_USERS WHERE USERNAMETEST1; SELECT ID AS SCHID, NA…

python socket模塊學習記錄

python黑馬程序員 通過python內置socket模塊&#xff0c;在電腦本地開發一個服務器&#xff0c;一個客戶端&#xff0c;連接后進行連續的聊天。服務器和客戶端均可輸入exit&#xff0c;主動退出連接。 服務器開發.py import socket# 創建Socket對象 socket_server socket.s…

7-2 sdut-C語言實驗-逆序建立鏈表

7-2 sdut-C語言實驗-逆序建立鏈表 分數 20 全屏瀏覽 切換布局 作者 馬新娟 單位 山東理工大學 輸入整數個數N&#xff0c;再輸入N個整數&#xff0c;按照這些整數輸入的相反順序建立單鏈表&#xff0c;并依次遍歷輸出單鏈表的數據。 輸入格式: 第一行輸入整數N;&#xff…

針對永磁電機(PMM)的d軸和q軸電流,考慮交叉耦合補償,設計P1控制器并推導出相應的傳遞函數

電流控制回路:針對永磁電機(PMM)的d軸和q軸電流&#xff0c;考慮交叉耦合補償&#xff0c;設計P1控制器并推導出相應的傳遞函數。 1. 永磁電機&#xff08;PMM&#xff09;的數學模型 在同步旋轉坐標系&#xff08; d ? q d - q d?q 坐標系&#xff09;下&#xff0c;永磁同…

ROS多機通信(四)——Ubuntu 網卡 Mesh 模式配置指南

引言 使用Ad-hoc加路由協議和直接Mesh模式配置網卡實現的網絡結構是一樣的&#xff0c;主要是看應用選擇&#xff0c; Ad-Hoc模式 B.A.T.M.A.N. / OLSR 優點&#xff1a;靈活性高&#xff0c;適合移動性強或需要優化的復雜網絡。 缺點&#xff1a;配置復雜&#xff0c;需手動…

chap1:統計學習方法概論

第1章 統計學習方法概論 文章目錄 第1章 統計學習方法概論前言章節目錄導讀 實現統計學習方法的步驟統計學習分類基本分類監督學習無監督學習強化學習 按模型分類概率模型與非概率模型 按算法分類按技巧分類貝葉斯學習核方法 統計學習方法三要素模型模型是什么? 策略損失函數與…

爬蟲案例-爬取某站視頻

文章目錄 1、下載FFmpeg2、爬取代碼3、效果圖 1、下載FFmpeg FFmpeg是一套可以用來記錄、轉換數字音頻、視頻&#xff0c;并能將其轉化為流的開源計算機程序。 點擊下載: ffmpeg 安裝并配置 FFmpeg 步驟&#xff1a; 1.下載 FFmpeg&#xff1a; 2.訪問 FFmpeg 官網。 3.選擇 Wi…

車載以太網網絡測試-22【傳輸層-DOIP協議-5】

目錄 1 摘要2 DoIP時間參數2.1 ISO 13400定義的時間參數2.2 參數示例 3 DoIP節點內部狀態機4 UDSonIP概述5 總結 1 摘要 本文繼續對DOIP協議進行介紹&#xff0c;主要是DOIP相關的時間參數、時間參數定義以及流程示例。推薦大家對上文專題進行回顧&#xff0c;有利于系統性學習…

(論文總結)思維鏈激發LLM推理能力

研究背景&動機 背景:擴大模型規模已被證實具有提升模型性能和模型效率的功效&#xff0c;但是LLM對于完成推理、算術任務仍有較大不足。 動機:從之前的應用和研究中得知&#xff0c;可以用生成自然語言解釋、使用神經符號等形式語言的方法來提高大模型的算術推理能力&…

前后端開發概述:架構、技術棧與未來趨勢

一、前后端開發的基本概念 1.1 什么是前后端開發&#xff1f; 前后端開發是 Web 開發的兩個核心部分&#xff0c;各自承擔不同的職責&#xff1a; 前端&#xff08;Frontend&#xff09; 負責網頁的用戶界面&#xff08;UI&#xff09;和用戶體驗&#xff08;UX&#xff09;…

anythingLLM結合searXNG實現聯網搜索

1、docker-compose 部署searXNG GitHub - searxng/searxng-docker: The docker-compose files for setting up a SearXNG instance with docker. cd /usr/local git clone https://github.com/searxng/searxng-docker.git cd searxng-docker 2、修改 .env文件 # By default…

人形機器人科普

人形機器人&#xff08;Humanoid Robot&#xff09;是一種模仿人類外形和行為的機器人&#xff0c;通常具有頭部、軀干、雙臂和雙腿等結構。它們的設計目標是與人類環境無縫交互&#xff0c;執行復雜的任務&#xff0c;甚至在某些領域替代人類工作。 1. 人形機器人的定義與特點…

【CICD】Ansible知識庫

一、主機清單配置 1. 配置文件路徑 默認路徑 /etc/ansible/hosts 這是 Ansible 的全局默認庫存文件路徑&#xff0c;但許多用戶可能不會直接使用它。項目目錄或自定義路徑 用戶通常會為不同項目創建獨立的庫存文件&#xff0c;例如&#xff1a; 當前目錄下的 hosts、inventor…

ArkUI-List組件

列表是一個復雜的容器&#xff0c;當列表項達到一定數量&#xff0c;使得列表內容超出其范圍的時候&#xff0c;就會自動變為可以滾動。列表適合用來展現同類數據類型。 List的基本使用方法 List組件的構建聲明是這個樣子的 List(value?: {space?:number | string, initial…

Ubuntu實時讀取音樂軟件的音頻流

文章目錄 一. 前言二. 開發環境三. 具體操作四. 實際效果 一. 前言 起因是這樣的&#xff0c;我需要在Ubuntu中&#xff0c;實時讀取正在播放音樂的音頻流&#xff0c;然后對音頻進行相關的處理。本來打算使用的PipewireHelvum的方式實現&#xff0c;好處是可以直接利用Helvum…

【yolo】YOLO訓練參數輸入之模型輸入尺寸

模型輸入尺寸是YOLO訓練和推理過程中非常重要的參數之一。YOLO要求輸入圖像的尺寸是固定的&#xff0c;通常為正方形&#xff08;如416416、640640等&#xff09;。這個尺寸直接影響模型的性能和速度。以下是對模型輸入尺寸的詳細介紹&#xff1a; 1. 模型輸入尺寸的作用 統一…

【TI MSPM0】Timer學習

一、計數器 加法計數器&#xff1a;每進入一個脈沖&#xff0c;就加一減法計算器&#xff1a;每進入一個脈沖&#xff0c;就減一 當計數器減到0&#xff0c;觸發中斷 1.最短計時時間 當時鐘周期為1khz時&#xff0c;最短計時時間為1ms&#xff0c;最長計時時間為65535ms 當時…