網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
支持向量機(jī)
支持向量機(jī)(Support Vector Machine, SVM)是一種二分類模型,目標(biāo)是尋找一個(gè)標(biāo)準(zhǔn)(稱為超平面)對(duì)樣本數(shù)據(jù)進(jìn)行分割,分割的原則是確保分類最優(yōu)化(類別之間的間隔最大)。
當(dāng)數(shù)據(jù)集較小時(shí),使用支持向量機(jī)進(jìn)行分類非常有效。
支持向量機(jī)是最好的現(xiàn)成分類器之一,“現(xiàn)成”是指分類器不加修改即可直接使用。
在對(duì)原始數(shù)據(jù)分類的過(guò)程中,可能無(wú)法使用線性方法實(shí)現(xiàn)分割。支持向量機(jī)在分類時(shí),把無(wú)法線性分割的數(shù)據(jù)映射到高維空間,然后在高維空間找到分類最優(yōu)的線性分類器。
Python支持向量機(jī)的庫(kù): sk-learn , LIBSVM等
OpenCV也提供了對(duì)支持向量機(jī)的支持
理論基礎(chǔ)
用于劃分不同類別的直線,就是分類器。
構(gòu)造分類器時(shí),非常重要的一項(xiàng)工作就是找到最優(yōu)分類器。
找到支持向量機(jī):在已有數(shù)據(jù)中,找到離分類器最近的點(diǎn),確保它們離分類器盡可能地遠(yuǎn)。
離分類器最近的點(diǎn)到分類器的距離稱為間隔(margin)。希望間隔盡可能地大,這樣分類器在處理數(shù)據(jù)時(shí),就會(huì)更準(zhǔn)確。
離分類器最近的那些點(diǎn)叫作支持向量(support vector)。 決定了分類器所在的位置。
將不可分變?yōu)榭煞?/p>
支持向量機(jī)會(huì)將不那么容易分類的數(shù)據(jù)通過(guò)函數(shù)映射變?yōu)榭煞诸惖摹?/p>
支持向量機(jī)在處理數(shù)據(jù)時(shí),如果在低維空間內(nèi)無(wú)法完成分類,就會(huì)自動(dòng)將數(shù)據(jù)映射到高維空間,使其變?yōu)椋ň€性)可分的。簡(jiǎn)單地講,就是對(duì)當(dāng)前數(shù)據(jù)進(jìn)行函數(shù)映射操作。
例如: 在分類時(shí),通過(guò)函數(shù)f的映射,讓左圖中本來(lái)不能用線性分類器分類的數(shù)據(jù)變?yōu)橛覉D中線性可分的數(shù)據(jù)。
同時(shí): 支持向量機(jī)能夠通過(guò)核函數(shù)有效地降低計(jì)算復(fù)雜度。
實(shí)際上支持向量機(jī)可以處理任何維度的數(shù)據(jù)。在不同的維度下,支持向量機(jī)都會(huì)盡可能尋找類似于二維空間中的直線的線性分類器。
例如,在二維空間,支持向量機(jī)會(huì)尋找一條能夠劃分當(dāng)前數(shù)據(jù)的直線;在三維空間,支持向量機(jī)會(huì)尋找一個(gè)能夠劃分當(dāng)前數(shù)據(jù)的平面(plane);在更高維的空間,支持向量機(jī)會(huì)嘗試尋找一個(gè)能夠劃分當(dāng)前數(shù)據(jù)的超平面(hyperplane)。
一般情況下,把能夠可以被一條直線(更一般的情況,即一個(gè)超平面)分割的數(shù)據(jù)稱為線性可分的數(shù)據(jù),所以超平面是線性分類器。
“支持向量機(jī)”是由“支持向量”和“機(jī)器”構(gòu)成的。
- “支持向量”是離分類器最近的那些點(diǎn),這些點(diǎn)位于最大“間隔”上。通常情況下,分類僅依靠這些點(diǎn)完成,而與其他點(diǎn)無(wú)關(guān)。
- “機(jī)器”指的是分類器。
支持向量機(jī)是一種基于關(guān)鍵點(diǎn)的分類算法。
SVM使用介紹
在使用支持向量機(jī)模塊時(shí),需要先使用函數(shù)cv2.ml.SVM_create()生成用于后續(xù)訓(xùn)練的空分類器模型。
語(yǔ)法格式:
svm = cv2.ml.SVM_create()
獲取了空分類器svm后,針對(duì)該模型使用svm.train()函數(shù)對(duì)訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練
語(yǔ)法格式
訓(xùn)練結(jié)果= svm.train(訓(xùn)練數(shù)據(jù),訓(xùn)練數(shù)據(jù)排列格式,訓(xùn)練數(shù)據(jù)的標(biāo)簽)
- 訓(xùn)練數(shù)據(jù):表示原始數(shù)據(jù),用來(lái)訓(xùn)練分類器。
- 訓(xùn)練數(shù)據(jù)排列格式:原始數(shù)據(jù)的排列形式有按行排列(cv2.ml.ROW_SAMPLE,每一條訓(xùn)練數(shù)據(jù)占一行)和按列排列(cv2.ml.COL_SAMPLE,每一條訓(xùn)練數(shù)據(jù)占一列)兩種形式
- 訓(xùn)練數(shù)據(jù)的標(biāo)簽:原始數(shù)據(jù)的標(biāo)簽。
- 訓(xùn)練結(jié)果:訓(xùn)練結(jié)果的返回值。
例如: 用于訓(xùn)練的數(shù)據(jù)為data,其對(duì)應(yīng)的標(biāo)簽為label,每一條數(shù)據(jù)按行排列,對(duì)分類器模型svm進(jìn)行訓(xùn)練,所使用的語(yǔ)句為:
返回值 = svm.train(data, cv2.ml.ROW_SAMPLE, label)
完成對(duì)分類器的訓(xùn)練后,使用svm.predict()函數(shù)即可使用訓(xùn)練好的分類器模型對(duì)測(cè)試數(shù)據(jù)進(jìn)行分類,其語(yǔ)法格式為:
(返回值,返回結(jié)果) = svm.predict(測(cè)試數(shù)據(jù))
OpenCV支持對(duì)多個(gè)參數(shù)的自定義,例如:可以通過(guò)setType()函數(shù)設(shè)置類別,通過(guò)setKernel()函數(shù)設(shè)置核類型,通過(guò)setC()函數(shù)設(shè)置支持向量機(jī)的參數(shù)C ( 懲罰系數(shù),即對(duì)誤差的寬容度,默認(rèn)值為0 )。
例子介紹
題目: 已知員工的筆試成績(jī)、面試成績(jī)及對(duì)應(yīng)的等級(jí)表現(xiàn),根據(jù)新入職員工的筆試成績(jī)、面試成績(jī)預(yù)測(cè)其可能的表現(xiàn)。
首先構(gòu)造一組隨機(jī)數(shù),并將其劃分為兩類,然后使用OpenCV自帶的支持向量機(jī)模塊完成訓(xùn)練和分類工作,最后將運(yùn)算結(jié)果顯示出來(lái)。
具體步驟:
-
生成模擬數(shù)據(jù)
模擬生成入職一年后表現(xiàn)為A級(jí)的員工入職時(shí)的筆試和面試成績(jī)。
構(gòu)造20組筆試和面試成績(jī)都分布在[95, 100)區(qū)間的數(shù)據(jù)對(duì):
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
上述模擬成績(jī),在一年后對(duì)應(yīng)的工作表現(xiàn)為A級(jí)。
模擬生成入職一年后表現(xiàn)為B級(jí)的員工入職時(shí)的筆試和面試成績(jī)。
構(gòu)造20組筆試和面試成績(jī)都分布在[90, 95)區(qū)間的數(shù)據(jù)對(duì):
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
上述模擬成績(jī),在一年后對(duì)應(yīng)的工作表現(xiàn)為B級(jí)。
最后,將兩組數(shù)據(jù)合并,并使用numpy.array對(duì)其進(jìn)行類型轉(zhuǎn)換:
data = np.vstack((a, b)) data = np.array(data, dtype='float32')
-
構(gòu)造分組標(biāo)簽
為對(duì)應(yīng)表現(xiàn)為A級(jí)的分布在[95, 100)區(qū)間的數(shù)據(jù),構(gòu)造標(biāo)簽“0”:
aLabel=np.zeros((20,1))
為對(duì)應(yīng)表現(xiàn)為B級(jí)的分布在[90, 95)區(qū)間的數(shù)據(jù),構(gòu)造標(biāo)簽“1”:
bLabel=np.ones((20,1))
將上述標(biāo)簽合并,并使用numpy.array對(duì)其進(jìn)行類型轉(zhuǎn)換:
label = np.vstack((aLabel, bLabel)) label = np.array(label, dtype='int32')
-
訓(xùn)練
用支持向量機(jī)模塊對(duì)已知的數(shù)據(jù)和其對(duì)應(yīng)的標(biāo)簽進(jìn)行訓(xùn)練:
svm = cv2.ml.SVM_create() result = svm.train(data, cv2.ml.ROW_SAMPLE, label)
-
分類
生成兩個(gè)隨機(jī)的數(shù)據(jù)對(duì)(筆試成績(jī),面試成績(jī))用于測(cè)試。
test = np.vstack([[98,90], [90,99]]) test = np.array(test, dtype='float32')
使用函數(shù)svm.predict()對(duì)隨機(jī)成績(jī)分類:
(p1, p2) = svm.predict(test)
-
顯示分類結(jié)果
將基礎(chǔ)數(shù)據(jù)(訓(xùn)練數(shù)據(jù))、用于測(cè)試的數(shù)據(jù)(測(cè)試數(shù)據(jù))在圖像上顯示出來(lái):
plt.scatter(a[:,0], a[:,1], 80, 'g', 'o') plt.scatter(b[:,0], b[:,1], 80, 'b', 's') plt.scatter(test[:,0], test[:,1], 80, 'r', '*') plt.show()
將測(cè)試數(shù)據(jù)及預(yù)測(cè)分類結(jié)果顯示出來(lái):
print(test) print(p2)
完整程序
import cv2 import numpy as np import matplotlib.pyplot as plt # 準(zhǔn)備數(shù)據(jù) a = np.random.randint(95,100, (20, 2)).astype(np.float32) b = np.random.randint(90,95, (20, 2)).astype(np.float32) data = np.vstack((a, b)) data = np.array(data, dtype='float32') # 建立分組標(biāo)簽,0代表A級(jí),1代表B級(jí) aLabel=np.zeros((20,1)) bLabel=np.ones((20,1)) label = np.vstack((aLabel, bLabel)) label = np.array(label, dtype='int32') # 訓(xùn)練 svm = cv2.ml.SVM_create() # 屬性設(shè)置,直接采用默認(rèn)值即可 #svm.setType(cv2.ml.SVM_C_SVC) # svm type #svm.setKernel(cv2.ml.SVM_LINEAR) # line #svm.setC(0.01) result = svm.train(data, cv2.ml.ROW_SAMPLE, label) #預(yù)測(cè) test = np.vstack([[98,90], [90,99]]) test = np.array(test, dtype='float32') (p1, p2) = svm.predict(test) # test 是 [[數(shù)據(jù)1],[數(shù)據(jù)2]] 結(jié)構(gòu)的 # 結(jié)果 print(test) print("res1",p2[0]) print("res2",p2[1]) plt.scatter(a[:,0], a[:,1], 80, 'g', 'o') plt.scatter(b[:,0], b[:,1], 80, 'b', 's') plt.scatter(test[:,0], test[:,1], 80, 'r', '*') plt.show()
原文鏈接:https://juejin.cn/post/7072647491044245512
相關(guān)推薦
- 2022-04-23 Python中ini配置文件讀寫(xiě)的實(shí)現(xiàn)_python
- 2022-06-08 nacos項(xiàng)目啟動(dòng)報(bào)錯(cuò):Connection refused: no further informa
- 2022-09-20 C#先判斷是否存在再創(chuàng)建文件夾或文件與遞歸計(jì)算文件夾大小_C#教程
- 2022-10-04 Qt實(shí)現(xiàn)右擊菜單項(xiàng)_C 語(yǔ)言
- 2022-09-09 C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解_C 語(yǔ)言
- 2022-12-24 C++中STL容器的主要使用及含義說(shuō)明_C 語(yǔ)言
- 2022-04-02 教你在windows下搭建MQTT服務(wù)器的方法_win服務(wù)器
- 2022-12-28 jquery點(diǎn)擊獲取動(dòng)態(tài)數(shù)據(jù)進(jìn)行傳參問(wèn)題_jquery
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支