python中opencv支持向量機的實現(xiàn)
支持向量機
支持向量機(Support Vector Machine, SVM)是一種二分類模型,目標是尋找一個標準(稱為超平面)對樣本數(shù)據(jù)進行分割,分割的原則是確保分類最優(yōu)化(類別之間的間隔最大)。
當數(shù)據(jù)集較小時,使用支持向量機進行分類非常有效。
支持向量機是最好的現(xiàn)成分類器之一,“現(xiàn)成”是指分類器不加修改即可直接使用。
在對原始數(shù)據(jù)分類的過程中,可能無法使用線性方法實現(xiàn)分割。支持向量機在分類時,把無法線性分割的數(shù)據(jù)映射到高維空間,然后在高維空間找到分類最優(yōu)的線性分類器。
Python支持向量機的庫: sk-learn , LIBSVM等
OpenCV也提供了對支持向量機的支持
理論基礎(chǔ)
用于劃分不同類別的直線,就是分類器。
構(gòu)造分類器時,非常重要的一項工作就是找到最優(yōu)分類器。
找到支持向量機:在已有數(shù)據(jù)中,找到離分類器最近的點,確保它們離分類器盡可能地遠。
離分類器最近的點到分類器的距離稱為間隔(margin)。希望間隔盡可能地大,這樣分類器在處理數(shù)據(jù)時,就會更準確。
離分類器最近的那些點叫作支持向量(support vector)。 決定了分類器所在的位置。
將不可分變?yōu)榭煞?/p>
支持向量機會將不那么容易分類的數(shù)據(jù)通過函數(shù)映射變?yōu)榭煞诸惖摹?/p>
支持向量機在處理數(shù)據(jù)時,如果在低維空間內(nèi)無法完成分類,就會自動將數(shù)據(jù)映射到高維空間,使其變?yōu)椋ň€性)可分的。簡單地講,就是對當前數(shù)據(jù)進行函數(shù)映射操作。
例如: 在分類時,通過函數(shù)f的映射,讓左圖中本來不能用線性分類器分類的數(shù)據(jù)變?yōu)橛覉D中線性可分的數(shù)據(jù)。
同時: 支持向量機能夠通過核函數(shù)有效地降低計算復雜度。
實際上支持向量機可以處理任何維度的數(shù)據(jù)。在不同的維度下,支持向量機都會盡可能尋找類似于二維空間中的直線的線性分類器。
例如,在二維空間,支持向量機會尋找一條能夠劃分當前數(shù)據(jù)的直線;在三維空間,支持向量機會尋找一個能夠劃分當前數(shù)據(jù)的平面(plane);在更高維的空間,支持向量機會嘗試尋找一個能夠劃分當前數(shù)據(jù)的超平面(hyperplane)。
一般情況下,把能夠可以被一條直線(更一般的情況,即一個超平面)分割的數(shù)據(jù)稱為線性可分的數(shù)據(jù),所以超平面是線性分類器。
“支持向量機”是由“支持向量”和“機器”構(gòu)成的。
- “支持向量”是離分類器最近的那些點,這些點位于最大“間隔”上。通常情況下,分類僅依靠這些點完成,而與其他點無關(guān)。
- “機器”指的是分類器。
支持向量機是一種基于關(guān)鍵點的分類算法。
SVM使用介紹
在使用支持向量機模塊時,需要先使用函數(shù)cv2.ml.SVM_create()生成用于后續(xù)訓練的空分類器模型。
語法格式:
svm = cv2.ml.SVM_create()
獲取了空分類器svm后,針對該模型使用svm.train()函數(shù)對訓練數(shù)據(jù)進行訓練
語法格式
訓練結(jié)果= svm.train(訓練數(shù)據(jù),訓練數(shù)據(jù)排列格式,訓練數(shù)據(jù)的標簽)
- 訓練數(shù)據(jù):表示原始數(shù)據(jù),用來訓練分類器。
- 訓練數(shù)據(jù)排列格式:原始數(shù)據(jù)的排列形式有按行排列(cv2.ml.ROW_SAMPLE,每一條訓練數(shù)據(jù)占一行)和按列排列(cv2.ml.COL_SAMPLE,每一條訓練數(shù)據(jù)占一列)兩種形式
- 訓練數(shù)據(jù)的標簽:原始數(shù)據(jù)的標簽。
- 訓練結(jié)果:訓練結(jié)果的返回值。
例如: 用于訓練的數(shù)據(jù)為data,其對應的標簽為label,每一條數(shù)據(jù)按行排列,對分類器模型svm進行訓練,所使用的語句為:
返回值 = svm.train(data, cv2.ml.ROW_SAMPLE, label)
完成對分類器的訓練后,使用svm.predict()函數(shù)即可使用訓練好的分類器模型對測試數(shù)據(jù)進行分類,其語法格式為:
(返回值,返回結(jié)果) = svm.predict(測試數(shù)據(jù))
OpenCV支持對多個參數(shù)的自定義,例如:可以通過setType()函數(shù)設(shè)置類別,通過setKernel()函數(shù)設(shè)置核類型,通過setC()函數(shù)設(shè)置支持向量機的參數(shù)C ( 懲罰系數(shù),即對誤差的寬容度,默認值為0 )。
例子介紹
題目: 已知員工的筆試成績、面試成績及對應的等級表現(xiàn),根據(jù)新入職員工的筆試成績、面試成績預測其可能的表現(xiàn)。
首先構(gòu)造一組隨機數(shù),并將其劃分為兩類,然后使用OpenCV自帶的支持向量機模塊完成訓練和分類工作,最后將運算結(jié)果顯示出來。
具體步驟:
生成模擬數(shù)據(jù)
模擬生成入職一年后表現(xiàn)為A級的員工入職時的筆試和面試成績。
構(gòu)造20組筆試和面試成績都分布在[95, 100)區(qū)間的數(shù)據(jù)對:
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
上述模擬成績,在一年后對應的工作表現(xiàn)為A級。
模擬生成入職一年后表現(xiàn)為B級的員工入職時的筆試和面試成績。
構(gòu)造20組筆試和面試成績都分布在[90, 95)區(qū)間的數(shù)據(jù)對:
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
上述模擬成績,在一年后對應的工作表現(xiàn)為B級。
最后,將兩組數(shù)據(jù)合并,并使用numpy.array對其進行類型轉(zhuǎn)換:
data = np.vstack((a, b)) data = np.array(data, dtype='float32')
構(gòu)造分組標簽
為對應表現(xiàn)為A級的分布在[95, 100)區(qū)間的數(shù)據(jù),構(gòu)造標簽“0”:
aLabel=np.zeros((20,1))
為對應表現(xiàn)為B級的分布在[90, 95)區(qū)間的數(shù)據(jù),構(gòu)造標簽“1”:
bLabel=np.ones((20,1))
將上述標簽合并,并使用numpy.array對其進行類型轉(zhuǎn)換:
label = np.vstack((aLabel, bLabel)) label = np.array(label, dtype='int32')
訓練
用支持向量機模塊對已知的數(shù)據(jù)和其對應的標簽進行訓練:
svm = cv2.ml.SVM_create() result = svm.train(data, cv2.ml.ROW_SAMPLE, label)
分類
生成兩個隨機的數(shù)據(jù)對(筆試成績,面試成績)用于測試。
test = np.vstack([[98,90], [90,99]]) test = np.array(test, dtype='float32')
使用函數(shù)svm.predict()對隨機成績分類:
(p1, p2) = svm.predict(test)
顯示分類結(jié)果
將基礎(chǔ)數(shù)據(jù)(訓練數(shù)據(jù))、用于測試的數(shù)據(jù)(測試數(shù)據(jù))在圖像上顯示出來:
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()
將測試數(shù)據(jù)及預測分類結(jié)果顯示出來:
print(test) print(p2)
完整程序
import cv2 import numpy as np import matplotlib.pyplot as plt # 準備數(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') # 建立分組標簽,0代表A級,1代表B級 aLabel=np.zeros((20,1)) bLabel=np.ones((20,1)) label = np.vstack((aLabel, bLabel)) label = np.array(label, dtype='int32') # 訓練 svm = cv2.ml.SVM_create() # 屬性設(shè)置,直接采用默認值即可 #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) #預測 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()
到此這篇關(guān)于python中opencv支持向量機的實現(xiàn)的文章就介紹到這了,更多相關(guān)opencv 向量機內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mac安裝python3后使用pip和pip3的區(qū)別說明
這篇文章主要介紹了mac安裝python3后使用pip和pip3的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09python async with和async for的使用
這篇文章主要介紹了python async with和async for的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06Django haystack實現(xiàn)全文搜索代碼示例
這篇文章主要介紹了Django haystack實現(xiàn)全文搜索代碼示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11python?numpy庫之如何使用matpotlib庫繪圖
Numpy的主要對象是同構(gòu)多維數(shù)組,它是一個元素表,所有類型都相同,由非負整數(shù)元組索引,在Numpy維度中稱為軸,這篇文章主要介紹了python?numpy庫?使用matpotlib庫繪圖,需要的朋友可以參考下2022-10-10