SVM算法實戰應用

目錄

用 SVM 實現鳶尾花數據集分類:從代碼到可視化全解析

一、算法原理簡述

二、完整代碼實現

三、代碼解析

1. 導入所需庫

2. 加載并處理數據

3. 劃分訓練集和測試集

4. 訓練 SVM 模型

5. 計算決策邊界參數

6. 生成決策邊界數據

7. 繪制樣本點

8. 繪制決策邊界

9. 設置坐標軸范圍

10. 標記支持向量

11. 顯示圖像

用 SVM 實現鳶尾花數據集分類:從代碼到可視化全解析

支持向量機(SVM)是一種經典的機器學習算法,特別適合處理小樣本、高維空間的分類問題。本文將通過鳶尾花(Iris)數據集,從零開始實現基于 SVM 的分類任務,并通過可視化直觀展示分類效果。

一、算法原理簡述

SVM 的核心思想是尋找最大間隔超平面,通過這個超平面將不同類別的數據分開。對于線性可分的數據,存在無數個可分超平面,SVM 會選擇距離兩類數據最近點(支持向量)距離最大的那個超平面,從而獲得更好的泛化能力。

當數據線性不可分時,SVM 可以通過核函數將低維數據映射到高維空間,使其在高維空間中線性可分。本文使用線性核(kernel='linear')進行演示,適合處理線性可分的鳶尾花數據集。

二、完整代碼實現

下面是基于鳶尾花數據集的 SVM 分類完整代碼,包含數據加載、模型訓練、決策邊界可視化等功能:部分數據集如下:

import pandas as pd
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import metrics# 1. 加載數據
f = pd.read_csv('iris.csv')  # 讀取鳶尾花數據集# 2. 數據劃分(按類別拆分用于可視化)
data = f.iloc[:50,:]   # 第一類數據(前50條)
data1 = f.iloc[50:,:]  # 后兩類數據(第50條之后)# 3. 準備特征和標簽
x = f.iloc[:,[1,3]]    # 選擇第2列和第4列作為特征(萼片寬度和花瓣寬度)
y = f.iloc[:,-1]       # 最后一列為標簽(花的類別)# 4. 劃分訓練集和測試集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)  # 20%數據作為測試集# 5. 初始化并訓練SVM模型
svm = SVC(kernel='linear', C=1, random_state=0)  # 線性核,正則化參數C=1
svm.fit(x_train, y_train)# 6. 獲取模型參數(用于繪制決策邊界)
w = svm.coef_[0]  # 權重系數
b = svm.intercept_[0]  # 偏置項# 7. 生成決策邊界數據
x1 = np.linspace(0,7,300)  # 生成300個從0到7的均勻點
x2 = -(w[0]*x1 + b)/w[1]   # 決策邊界公式:w0*x1 + w1*x2 + b = 0 → 求解x2
x3 = 1 + x2  # 邊界1(決策邊界+1)
x4 = -1 + x2 # 邊界2(決策邊界-1)# 8. 繪制散點圖(樣本點)
plt.scatter(data.iloc[:,1], data.iloc[:,3], marker='+', color='b', label='第一類')
plt.scatter(data1.iloc[:,1], data1.iloc[:,3], marker='*', color="r", label='其他類別')# 9. 繪制決策邊界
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--', label='邊界1')
plt.plot(x1, x2, linewidth=2, color='r', label='決策邊界')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--', label='邊界2')# 10. 設置坐標軸范圍
plt.xlim(4,7)
plt.ylim(0,5)# 11. 標記支持向量
vets = svm.support_vectors_  # 獲取支持向量
plt.scatter(vets[:,0], vets[:,1], c='b', marker='x', label='支持向量')# 12. 添加圖例和標題
plt.legend()
plt.title('SVM分類鳶尾花數據集(線性核)')
plt.show()# 13. 模型評估
y_pred = svm.predict(x_test)
print("模型準確率:", metrics.accuracy_score(y_test, y_pred))

三、代碼解析

1. 導入所需庫

import pandas as pd                  # 用于數據處理和分析
from sklearn.svm import SVC          # 從sklearn庫導入支持向量分類器
import numpy as np                   # 用于數值計算
import matplotlib.pyplot as plt      # 用于數據可視化
from sklearn.model_selection import train_test_split  # 用于劃分訓練集和測試集
from sklearn import metrics          # 用于模型評估

2. 加載并處理數據

f = pd.read_csv('iris.csv')  # 讀取鳶尾花數據集(CSV格式)

鳶尾花數據集包含 100?條樣本,分為 2類鳶尾花,每條樣本有 4 個特征(花萼長度、花萼寬度、花瓣長度、花瓣寬度)和 1 個標簽(花的類別)。

data = f.iloc[:50,:]   # 取前50條數據(第一類鳶尾花,通常是setosa)
data1 = f.iloc[50:,:]  # 取第50條之后的數據(后兩類鳶尾花,通常是versicolor和virginica)

這里按行索引拆分數據,用于后續可視化時區分不同類別。

x = f.iloc[:,[1,3]]    # 選擇特征:取所有行的第2列(索引1)和第4列(索引3)
y = f.iloc[:,-1]       # 選擇標簽:取所有行的最后一列(花的類別)
  • 特征選擇第 2 列和第 4 列(通常對應花萼寬度和花瓣寬度),便于二維可視化
  • 標簽為最后一列(花的種類)

3. 劃分訓練集和測試集

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)  # 劃分數據集
  • x_train:訓練集特征(80% 的數據)
  • x_test:測試集特征(20% 的數據)
  • y_train:訓練集標簽
  • y_test:測試集標簽
  • test_size=0.2:測試集占比 20%
  • random_state=0:隨機種子,保證每次運行劃分結果一致

4. 訓練 SVM 模型

svm = SVC(kernel='linear', C=1, random_state=0)  # 初始化SVM模型
svm.fit(x_train, y_train)  # 用訓練集訓練模型
  • kernel='linear':使用線性核函數(適用于線性可分數據)
  • C=1:正則化參數,控制對誤分類的懲罰程度(值越大懲罰越重)
  • random_state=0:隨機種子,保證結果可復現
  • fit():訓練模型,通過訓練集學習特征與標簽的關系

5. 計算決策邊界參數

w = svm.coef_[0]  # 獲取權重系數(對于線性核,shape為[特征數])
b = svm.intercept_[0]  # 獲取偏置項(截距)

對于線性 SVM,決策邊界是一個超平面,二維情況下是一條直線,公式為:

(其中(w0, w1)是權重,b是偏置,(x1, x2)是兩個特征)

6. 生成決策邊界數據

x1 = np.linspace(0,7,300)  # 生成300個從0到7的均勻點(作為x軸數據)
x2 = -(w[0]*x1 + b)/w[1]   # 計算決策邊界的y值(由超平面公式推導)
x3 = 1 + x2  # 決策邊界上方的輔助線(間隔邊界)
x4 = -1 + x2 # 決策邊界下方的輔助線(間隔邊界)
  • x1是橫軸坐標,x2是決策邊界在對應x1處的縱軸坐標
  • x3x4是決策邊界兩側的間隔邊界,用于展示 SVM 的 "最大間隔" 特性

7. 繪制樣本點

# 繪制第一類樣本(藍色+號)
plt.scatter(data.iloc[:,1], data.iloc[:,3], marker='+', color='b')
# 繪制后兩類樣本(紅色*號)
plt.scatter(data1.iloc[:,1], data1.iloc[:,3], marker='*', color="r")
  • scatter():繪制散點圖
  • data.iloc[:,1]data.iloc[:,3]:分別取第一類樣本的第 2 列和第 4 列特征作為 x、y 坐標
  • marker:指定點的形狀(+ 號和 * 號區分不同類別)

8. 繪制決策邊界

plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')  # 上方間隔邊界(虛線)
plt.plot(x1, x2, linewidth=2, color='r')                  # 決策邊界(實線)
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')  # 下方間隔邊界(虛線)
  • plot():繪制直線
  • 紅色實線是 SVM 找到的最優決策邊界,虛線是間隔邊界,兩條虛線之間的距離是 "最大間隔"

9. 設置坐標軸范圍

plt.xlim(4,7)  # x軸范圍設置為4到7
plt.ylim(0,5)  # y軸范圍設置為0到5

限制坐標軸范圍,使圖像聚焦在樣本密集區域,更清晰地展示分類效果。

10. 標記支持向量

vets = svm.support_vectors_  # 獲取支持向量(距離決策邊界最近的樣本點)
plt.scatter(vets[:,0], vets[:,1], c='b', marker='x')  # 用x標記支持向量
  • 支持向量是決定決策邊界位置的關鍵樣本,SVM 的決策僅由這些點決定
  • vets[:,0]vets[:,1]:支持向量的兩個特征值

11. 顯示圖像

plt.show()  # 顯示繪制的圖像

總結

這段代碼的核心邏輯是:

  1. 加載鳶尾花數據集并選擇特征
  2. 劃分訓練集和測試集
  3. 訓練線性 SVM 模型
  4. 計算并繪制決策邊界、間隔邊界
  5. 可視化樣本點和支持向量

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

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

相關文章

深度虛值期權合約有什么特點?

本文主要介紹深度虛值期權合約有什么特點?深度虛值期權合約是期權市場中一類特殊且風險收益特征鮮明的合約,其核心特點可歸納為以下六點。深度虛值期權合約有什么特點?一、定義:執行價與標的價差距極大深度虛值期權是指執行價&…

(LeetCode 面試經典 150 題) 86. 分隔鏈表(鏈表+雙指針)

題目:86. 分隔鏈表 思路:雙指針,時間復雜度0(n)。 雙指針來維護小于x的鏈表和不小于x的鏈表即可,后面將兩個鏈表連起來即可。 C版本: /*** Definition for singly-linked list.* struct ListNode {* int val;* …

安全掃描:檢測到目標站點存在javascript框架庫漏洞問題(vue)

如果升級Vue版本有限制或者時間比較緊急,可以暫時用下面方式來,規避檢測到目標站點存在javascript框架庫vue漏洞。 在 vue.config.js 中配置: module.exports {configureWebpack: {optimization: {minimizer: [new (require(terser-webpack-plugin))({t…

【性能測試】-2- JMeter工具的使用

一、基礎腳本搭建🎯 核心目標:用 JMeter 搭性能測試 “骨架”(測試計劃、線程組、取樣器、監聽器)📋 測試計劃:整個測試的 “容器”,所有測試組件都放這里🧵 線程組:模擬…

從零構建桌面寫作軟件的書籍管理系統:Electron + Vue 3 實戰指南

📚 從零構建桌面寫作軟件的書籍管理系統:Electron Vue 3 實戰指南 💡 本文深入探討了基于 Electron Vue 3 技術棧的桌面寫作軟件中書籍管理系統的設計與實現,涵蓋了書籍的創建、編輯、刪除等核心功能的完整技術方案,…

2025華數杯數學建模A題【 多孔膜光反射性能的優化與控制】原創論文講解(含完整python代碼)

大家好呀,從發布賽題一直到現在,總算完成了2025華數杯數學建模A題【 多孔膜光反射性能的優化與控制】完整的成品論文。本論文可以保證原創,保證高質量。絕不是隨便引用一大堆模型和代碼復制粘貼進來完全沒有應用糊弄人的垃圾半成品論文。A題論…

網絡相關(AI回答)

網管交換機都支持帶tag的以太幀嗎DeepSeek-R1 回答完成深度思考完成 用時24秒,搜索全網20篇資料是的,所有網管交換機都支持處理和轉發帶Tag(802.1Q VLAN標簽)的以太網幀,這是其核心功能之一。以下是關鍵要點&#xff1…

每日五個pyecharts可視化圖表-bars(5)

探索pyecharts庫中條形圖的高級用法與定制技巧,打造精美數據可視化圖表 在數據可視化中,條形圖是最常用的圖表類型之一。它能夠清晰地展示不同類別的數據對比,幫助我們快速理解數據特征。本文將為您介紹pyecharts庫中條形圖的5種高級用法&…

分布式版本控制工具Git

一.開發中為什么需要Git因為在多人開發中Git可以管理代碼,而且每個人都可以從庫里面下載代碼進行修改,每個人上傳和修改Git都會有記錄,如果出現大錯誤,還可以回退到正常版本。二.Git原理我們首先從代碼庫(Remote)下載代碼到工作區…

OpenAI重磅開源GPT-oss:首款支持商用的AI Agent專屬模型

今日凌晨,OpenAI宣布開源兩款全新大模型——GPT-oss-120B(1168億參數)與GPT-oss-20B(209億參數),成為全球首個支持商業化應用的開放權重推理模型。該模型專為AI智能體(Agent)設計&am…

【STM32】GPIO的輸入輸出

GPIO是通用的輸入輸出接口,可配置8種輸入模式,輸出模式下可控制端口輸出高低電平,用于點亮LED、控制蜂鳴器、模擬通信協議等;輸入模式下可以讀取端口的高低電平或者電壓,用于讀取按鍵、外接模塊的電平信號、ADC的電壓采…

5分鐘了解OpenCV

在數字化時代,圖像和視頻已經成為信息傳遞的核心載體。從手機拍照的美顏功能到自動駕駛的路況識別,從醫學影像分析到安防監控系統,視覺技術正深刻改變著我們的生活。而在這背后,OpenCV 作為一款強大的開源計算機視覺庫&#xff0c…

Oracle 關閉 impdp任務

Oracle 關閉 impdp任務 執行 impdp system/123456 attachSYS_EXPORT_TABLE_01 執行 stop_jobimmediate

數據結構——鏈表2

1.2 實現單鏈表 在上一篇文章中&#xff0c;單鏈表的實現只有一少部分&#xff0c;這一篇接著來了解單鏈表剩下的接口實現。 SList.h#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>//定義單鏈表就是定義節點&#xff0c;因為單鏈表…

Windows和Linux應急響應以及IP封堵

目錄 1、Windows入侵排查思路 1.1 檢查系統賬號安全 1.2 檢查異常端口、進程 1.3 檢查啟動項、計劃任務、服務 1.4 檢查系統相關信息 1.5 自動化查殺 1.6 日志分析 系統日志分析 Web 訪問日志 2、Linux 入侵排查思路 2.1 賬號安全 2.1.1、基本使用 2.1.2、入侵排查…

MIT成果登上Nature!液態神經網絡YYDS

2025深度學習發論文&模型漲點之——液態神經網絡液態神經網絡&#xff08;Liquid Neural Networks&#xff0c;LNN&#xff09;是一種受生物神經系統啟發的連續時間遞歸神經網絡&#xff08;RNN&#xff09;&#xff0c;其核心創新在于將靜態神經網絡轉化為由微分方程驅動的…

AI 對話高效輸入指令攻略(四):AI+Apache ECharts:生成各種專業圖表

- **AI與數據可視化的革命性結合**:介紹AI如何降低數據可視化門檻,提升效率。 - **Apache ECharts:專業可視化的利器**:使用表格對比展示ECharts的特點、優勢和適用場景。 - **四步實現AI驅動圖表生成**:通過分步指南講解從環境準備到圖表優化的全流程,包含多個代碼示例及…

vue2 基礎學習 day04 (結構/樣式/邏輯、組件通信、進階語法)下

一、非父子通信-event bus 事件總線1.作用非父子組件之間&#xff0c;進行簡易消息傳遞。(復雜場景→ Vuex)2.步驟創建一個都能訪問的事件總線 &#xff08;空Vue實例&#xff09;import Vue from vue const Bus new Vue() export default BusA組件&#xff08;接受方&#xf…

ubuntu 20.04 C和C++的標準頭文件都放在哪個目錄?

在 Ubuntu 20.04 中&#xff0c;C 和 C 標準頭文件的存放目錄主要由編譯器&#xff08;如 GCC&#xff09;的安裝路徑決定&#xff0c;通常分為以下兩類&#xff1a;?1. C 標準頭文件?C 語言的標準頭文件&#xff08;如 <stdio.h>、<stdlib.h> 等&#xff09;默認…

change和watch

是的&#xff0c;你理解得很對&#xff01; change 與 v-model 的結合&#xff1a;change 事件通常用于監聽 表單元素的變化&#xff0c;但它并不一定意味著值發生了變化。它主要是當 用戶與輸入框交互時&#xff08;如點擊選項、選擇文本框內容、提交表單等&#xff09;觸發的…