OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
cv::ml::SVM 類參考抽象

支援向量機。 更多...

#include <opencv2/ml.hpp>

cv::ml::SVM 的協作圖

類  Kernel(核心)
 

公共型別

列舉  核型別 {
  CUSTOM =-1 ,
  線性 =0 ,
  多項式核 (POLY) =1 ,
  徑向基函式核 (RBF) =2 ,
  Sigmoid核 (SIGMOID) =3 ,
  卡方核 (CHI2) =4 ,
  交叉核 (INTER) =5
}
 SVM 核型別 更多...
 
列舉  引數型別 {
  C =0 ,
  伽馬 (GAMMA) =1 ,
  P =2 ,
  Nu (NU) =3 ,
  係數 (COEF) =4 ,
  度 (DEGREE) =5
}
 SVM 引數型別 更多...
 
列舉  型別 {
  C-支援向量分類 (C_SVC) =100 ,
  Nu-支援向量分類 (NU_SVC) =101 ,
  一類 SVM (ONE_CLASS) =102 ,
  Epsilon-支援向量迴歸 (EPS_SVR) =103 ,
  Nu-支援向量迴歸 (NU_SVR) =104
}
 SVM 型別 更多...
 
- 繼承自 cv::ml::StatModel 的公共型別
列舉  標誌 {
  UPDATE_MODEL = 1 ,
  RAW_OUTPUT =1 ,
  COMPRESSED_INPUT =2 ,
  PREPROCESSED_INPUT =4
}
 

公共成員函式

virtual double getC () const =0
 
virtual cv::Mat getClassWeights () const =0
 
virtual double getCoef0 () const =0
 
virtual double getDecisionFunction (int i, OutputArray alpha, OutputArray svidx) const =0
 檢索決策函式。
 
virtual double getDegree () const =0
 
virtual double getGamma () const =0
 
virtual int getKernelType () const =0
 
virtual double getNu () const =0
 
virtual double getP () const =0
 
virtual Mat getSupportVectors () const =0
 檢索所有支援向量。
 
virtual cv::TermCriteria getTermCriteria () const =0
 
virtual int getType () const =0
 
virtual Mat getUncompressedSupportVectors () const =0
 檢索線性 SVM 的所有未壓縮支援向量。
 
virtual void setC (double val)=0
 
virtual void setClassWeights (const cv::Mat &val)=0
 
virtual void setCoef0 (double val)=0
 
virtual void setCustomKernel (const Ptr< Kernel > &_kernel)=0
 
virtual void setDegree (double val)=0
 
virtual void setGamma (double val)=0
 
virtual void setKernel (int kernelType)=0
 
virtual void setNu (double val)=0
 
virtual void setP (double val)=0
 
virtual void setTermCriteria (const cv::TermCriteria &val)=0
 
virtual void setType (int val)=0
 
virtual bool trainAuto (const Ptr< TrainData > &data, int kFold=10, ParamGrid Cgrid=getDefaultGrid(C), ParamGrid gammaGrid=getDefaultGrid(GAMMA), ParamGrid pGrid=getDefaultGrid(P), ParamGrid nuGrid=getDefaultGrid(NU), ParamGrid coeffGrid=getDefaultGrid(COEF), ParamGrid degreeGrid=getDefaultGrid(DEGREE), bool balanced=false)=0
 使用最優引數訓練 SVM。
 
virtual bool trainAuto (InputArray samples, int layout, InputArray responses, int kFold=10, Ptr< ParamGrid > Cgrid=SVM::getDefaultGridPtr(SVM::C), Ptr< ParamGrid > gammaGrid=SVM::getDefaultGridPtr(SVM::GAMMA), Ptr< ParamGrid > pGrid=SVM::getDefaultGridPtr(SVM::P), Ptr< ParamGrid > nuGrid=SVM::getDefaultGridPtr(SVM::NU), Ptr< ParamGrid > coeffGrid=SVM::getDefaultGridPtr(SVM::COEF), Ptr< ParamGrid > degreeGrid=SVM::getDefaultGridPtr(SVM::DEGREE), bool balanced=false)=0
 使用最優引數訓練 SVM。
 
- 繼承自 cv::ml::StatModel 的公共成員函式
virtual float calcError (const Ptr< TrainData > &data, bool test, OutputArray resp) const
 計算訓練或測試資料集上的誤差。
 
virtual bool empty () const CV_OVERRIDE
 如果 演算法 為空(例如,在最開始或讀取不成功後),則返回 true。
 
virtual int getVarCount () const =0
 返回訓練樣本中變數的數量。
 
virtual bool isClassifier () const =0
 如果模型是分類器,則返回 true。
 
virtual bool isTrained () const =0
 如果模型已訓練,則返回 true。
 
virtual float predict (InputArray samples, OutputArray results=noArray(), int flags=0) const =0
 預測提供的樣本的響應
 
virtual bool train (const Ptr< TrainData > &trainData, int flags=0)
 訓練統計模型。
 
virtual bool train (InputArray samples, int layout, InputArray responses)
 訓練統計模型。
 
- 繼承自 cv::Algorithm 的公共成員函式
 Algorithm ()
 
virtual ~Algorithm ()
 
virtual void clear ()
 清除演算法狀態。
 
virtual String getDefaultName () const
 
virtual void read (const FileNode &fn)
 從檔案儲存中讀取演算法引數。
 
virtual void save (const String &filename) const
 
void write (const Ptr< FileStorage > &fs, const String &name=String()) const
 
virtual void write (FileStorage &fs) const
 將演算法引數儲存到檔案儲存中。
 
void write (FileStorage &fs, const String &name) const
 

靜態公共成員函式

static Ptr< SVMcreate ()
 
static ParamGrid getDefaultGrid (int param_id)
 為 SVM 引數生成網格。
 
static Ptr< ParamGridgetDefaultGridPtr (int param_id)
 為 SVM 引數生成網格。
 
static Ptr< SVMload (const String &filepath)
 從檔案中載入並建立一個序列化的 SVM。
 
- 繼承自 cv::ml::StatModel 的靜態公共成員函式
template<typename _Tp >
static Ptr< _Tptrain (const Ptr< TrainData > &data, int flags=0)
 使用預設引數建立並訓練模型。
 
- 繼承自 cv::Algorithm 的靜態公共成員函式
template<typename _Tp >
static Ptr< _Tpload (const String &filename, const String &objname=String())
 從檔案中載入演算法。
 
template<typename _Tp >
static Ptr< _TploadFromString (const String &strModel, const String &objname=String())
 從字串載入演算法。
 
template<typename _Tp >
static Ptr< _Tpread (const FileNode &fn)
 從檔案節點讀取演算法。
 

其他繼承成員

- 繼承自 cv::Algorithm 的保護成員函式
void writeFormat (FileStorage &fs) const
 

詳細描述

支援向量機。

另請參見
支援向量機

成員列舉文件

◆ 核型別

SVM 核型別

在以下具有四個類別的 2D 測試用例中,對不同核的比較。使用 auto_train 訓練了四個 SVM::C_SVC SVM(一對多訓練)。對三種不同核進行評估(SVM::CHI2SVM::INTERSVM::RBF)。顏色表示得分最高的類別。亮色表示最大得分 > 0,深色表示最大得分 < 0。

列舉器
自定義 (CUSTOM) 

當設定了自定義核時,由 SVM::getKernelType 返回

線性 (LINEAR) 

線性核。不進行對映,線上性特徵空間中進行線性判別(或迴歸)。這是最快的選項。 \(K(x_i, x_j) = x_i^T x_j\)。

多項式 (POLY) 

多項式核: \(K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0\)。

徑向基函式 (RBF) 

徑向基函式 (RBF),在大多數情況下是一個不錯的選擇。 \(K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0\)。

Sigmoid (SIGMOID) 

Sigmoid 核: \(K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0)\)。

卡方 (CHI2) 

指數卡方核,類似於 RBF 核: \(K(x_i, x_j) = e^{-\gamma \chi^2(x_i,x_j)}, \chi^2(x_i,x_j) = (x_i-x_j)^2/(x_i+x_j), \gamma > 0\)。

交叉 (INTER) 

直方圖交叉核。一種快速核。 \(K(x_i, x_j) = min(x_i,x_j)\)。

◆ 引數型別

SVM 引數型別

列舉器
GAMMA 
NU 
COEF 
DEGREE 

◆ 型別

SVM 型別

列舉器
C-支援向量分類 (C_SVC) 

C-支援向量分類。n類分類(n \(\geq\) 2),允許對帶有懲罰乘數 C 的異常值進行不完全的類別分離。

Nu-支援向量分類 (NU_SVC) 

\(\nu\)-支援向量分類。可能存在不完全分離的 n 類分類。使用引數 \(\nu\)(範圍 0..1,值越大,決策邊界越平滑)代替 C。

一類 SVM (ONE_CLASS) 

分佈估計(一類 SVM)。所有訓練資料都來自同一個類別,SVM 構建一個邊界,將該類別與特徵空間的其他部分分開。

Epsilon-支援向量迴歸 (EPS_SVR) 

\(\epsilon\)-支援向量迴歸。訓練集中的特徵向量與擬合超平面之間的距離必須小於 p。對於異常值,使用懲罰乘數 C。

Nu-支援向量迴歸 (NU_SVR) 

\(\nu\)-支援向量迴歸。使用 \(\nu\) 代替 p。詳情請參見 [51]

成員函式文件

◆ create()

static Ptr< SVM > cv::ml::SVM::create ( )
static
Python
cv.ml.SVM.create() -> retval
cv.ml.SVM_create() -> retval

建立空模型。使用 StatModel::train 訓練模型。由於 SVM 有多個引數,您可能需要為您的特定問題找到最佳引數,這可以透過 SVM::trainAuto 來實現。

◆ getC()

virtual double cv::ml::SVM::getC ( ) const
純虛擬函式
Python
cv.ml.SVM.getC() -> retval

SVM 最佳化問題的引數 C。適用於 SVM::C_SVCSVM::EPS_SVRSVM::NU_SVR。預設值為 0。

另請參見
setC

◆ getClassWeights()

virtual cv::Mat cv::ml::SVM::getClassWeights ( ) const
純虛擬函式
Python
cv.ml.SVM.getClassWeights() -> retval

SVM::C_SVC 問題中的可選權重,分配給特定類別。它們乘以 C,因此類別 i 的引數 C 變為 classWeights(i) * C。因此,這些權重會影響不同類別的錯誤分類懲罰。權重越大,對應類別資料的錯誤分類懲罰越大。預設值為空的 Mat

另請參見
setClassWeights

◆ getCoef0()

virtual double cv::ml::SVM::getCoef0 ( ) const
純虛擬函式
Python
cv.ml.SVM.getCoef0() -> retval

核函式的引數 coef0。適用於 SVM::POLYSVM::SIGMOID。預設值為 0。

另請參見
setCoef0

◆ getDecisionFunction()

virtual double cv::ml::SVM::getDecisionFunction ( int i,
OutputArray alpha,
OutputArray svidx ) const
純虛擬函式
Python
cv.ml.SVM.getDecisionFunction(i[, alpha[, svidx]]) -> retval, alpha, svidx

檢索決策函式。

引數
i決策函式的索引。如果解決的問題是迴歸、一類或兩類分類,則只有一個決策函式,索引應始終為 0。否則,在 N 類分類的情況下,將有 \(N(N-1)/2\) 個決策函式。
alpha可選的權重輸出向量,對應於不同的支援向量。線上性 SVM 的情況下,所有的 alpha 值都將是 1。
svidx支援向量矩陣中的支援向量索引的可選輸出向量(可以透過 SVM::getSupportVectors 檢索)。線上性 SVM 的情況下,每個決策函式由一個“壓縮”支援向量組成。

該方法返回決策函式的 rho 引數,這是一個從核響應的加權和中減去的標量。

◆ getDefaultGrid()

static ParamGrid cv::ml::SVM::getDefaultGrid ( int param_id)
static

為 SVM 引數生成網格。

引數
param_idSVM 引數 ID,必須是 SVM::ParamTypes 之一。為具有此 ID 的引數生成網格。

此函式為 SVM 演算法的指定引數生成一個網格。該網格可以傳遞給函式 SVM::trainAuto

◆ getDefaultGridPtr()

static Ptr< ParamGrid > cv::ml::SVM::getDefaultGridPtr ( int param_id)
static
Python
cv.ml.SVM.getDefaultGridPtr(param_id) -> retval
cv.ml.SVM_getDefaultGridPtr(param_id) -> retval

為 SVM 引數生成網格。

引數
param_idSVM 引數 ID,必須是 SVM::ParamTypes 之一。為具有此 ID 的引數生成網格。

此函式為 SVM 演算法的指定引數生成一個網格指標。該網格可以傳遞給函式 SVM::trainAuto

◆ getDegree()

virtual double cv::ml::SVM::getDegree ( ) const
純虛擬函式
Python
cv.ml.SVM.getDegree() -> retval

核函式的引數 degree。適用於 SVM::POLY。預設值為 0。

另請參見
setDegree

◆ getGamma()

virtual double cv::ml::SVM::getGamma ( ) const
純虛擬函式
Python
cv.ml.SVM.getGamma() -> retval

核函式的引數 \(\gamma\)。適用於 SVM::POLYSVM::RBFSVM::SIGMOIDSVM::CHI2。預設值為 1。

另請參見
setGamma

◆ getKernelType()

virtual int cv::ml::SVM::getKernelType ( ) const
純虛擬函式
Python
cv.ml.SVM.getKernelType() -> retval

SVM 核的型別。參見 SVM::KernelTypes。預設值為 SVM::RBF

◆ getNu()

virtual double cv::ml::SVM::getNu ( ) const
純虛擬函式
Python
cv.ml.SVM.getNu() -> retval

SVM 最佳化問題的引數 \(\nu\)。適用於 SVM::NU_SVCSVM::ONE_CLASSSVM::NU_SVR。預設值為 0。

另請參見
setNu

◆ getP()

virtual double cv::ml::SVM::getP ( ) const
純虛擬函式
Python
cv.ml.SVM.getP() -> retval

SVM 最佳化問題的引數 \(\epsilon\)。適用於 SVM::EPS_SVR。預設值為 0。

另請參見
setP

◆ getSupportVectors()

virtual Mat cv::ml::SVM::getSupportVectors ( ) const
純虛擬函式
Python
cv.ml.SVM.getSupportVectors() -> retval

檢索所有支援向量。

此方法將所有支援向量作為浮點矩陣返回,其中支援向量儲存為矩陣行。

◆ getTermCriteria()

virtual cv::TermCriteria cv::ml::SVM::getTermCriteria ( ) const
純虛擬函式
Python
cv.ml.SVM.getTermCriteria() -> retval

迭代 SVM 訓練過程的終止準則,該過程解決了受約束二次最佳化問題的部分情況。您可以指定容差和/或最大迭代次數。預設值為 TermCriteria( TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, FLT_EPSILON );

另請參見
setTermCriteria

◆ getType()

virtual int cv::ml::SVM::getType ( ) const
純虛擬函式
Python
cv.ml.SVM.getType() -> retval

SVM 公式的型別。參見 SVM::Types。預設值為 SVM::C_SVC

另請參見
setType

◆ getUncompressedSupportVectors()

virtual Mat cv::ml::SVM::getUncompressedSupportVectors ( ) const
純虛擬函式
Python
cv.ml.SVM.getUncompressedSupportVectors() -> retval

檢索線性 SVM 的所有未壓縮支援向量。

此方法返回線性 SVM 的所有未壓縮支援向量,預測中使用的壓縮支援向量就是從它們派生而來的。它們以浮點矩陣的形式返回,其中支援向量儲存為矩陣行。

◆ load()

static Ptr< SVM > cv::ml::SVM::load ( const String & filepath)
static
Python
cv.ml.SVM.load(filepath) -> retval
cv.ml.SVM_load(filepath) -> retval

從檔案中載入並建立一個序列化的 SVM。

使用 SVM::saveSVM 序列化並存儲到磁碟。透過呼叫此函式並指定檔案路徑,可以再次從該檔案載入 SVM

引數
filepath序列化 SVM 的路徑

◆ setC()

virtual void cv::ml::SVM::setC ( double val)
純虛擬函式
Python
cv.ml.SVM.setC(val) ->

另請參見
getC

◆ setClassWeights()

virtual void cv::ml::SVM::setClassWeights ( const cv::Mat & val)
純虛擬函式
Python
cv.ml.SVM.setClassWeights(val) ->

另請參見
getClassWeights

◆ setCoef0()

virtual void cv::ml::SVM::setCoef0 ( double val)
純虛擬函式
Python
cv.ml.SVM.setCoef0(val) ->

另請參見
getCoef0

◆ setCustomKernel()

virtual void cv::ml::SVM::setCustomKernel ( const Ptr< Kernel > & _kernel)
純虛擬函式

使用自定義核初始化。有關實現細節,請參見 SVM::Kernel 類。

◆ setDegree()

virtual void cv::ml::SVM::setDegree ( double val)
純虛擬函式
Python
cv.ml.SVM.setDegree(val) ->

另請參見
getDegree

◆ setGamma()

virtual void cv::ml::SVM::setGamma ( double val)
純虛擬函式
Python
cv.ml.SVM.setGamma(val) ->

另請參見
getGamma

◆ setKernel()

virtual void cv::ml::SVM::setKernel ( int kernelType)
純虛擬函式
Python
cv.ml.SVM.setKernel(kernelType) ->

使用預定義核之一進行初始化。參見 SVM::KernelTypes

◆ setNu()

virtual void cv::ml::SVM::setNu ( double val)
純虛擬函式
Python
cv.ml.SVM.setNu(val) ->

另請參見
getNu

◆ setP()

virtual void cv::ml::SVM::setP ( double val)
純虛擬函式
Python
cv.ml.SVM.setP(val) ->

另請參見
getP

◆ setTermCriteria()

virtual void cv::ml::SVM::setTermCriteria ( const cv::TermCriteria & val)
純虛擬函式
Python
cv.ml.SVM.setTermCriteria(val) ->

另請參見
getTermCriteria

◆ setType()

virtual void cv::ml::SVM::setType ( int val)
純虛擬函式
Python
cv.ml.SVM.setType(val) ->

另請參見
getType

◆ trainAuto() [1/2]

virtual bool cv::ml::SVM::trainAuto ( const Ptr< TrainData > & data,
int kFold = 10,
ParamGrid Cgrid = getDefaultGrid(C),
ParamGrid gammaGrid = getDefaultGrid(GAMMA),
ParamGrid pGrid = getDefaultGrid(P),
ParamGrid nuGrid = getDefaultGrid(NU),
ParamGrid coeffGrid = getDefaultGrid(COEF),
ParamGrid degreeGrid = getDefaultGrid(DEGREE),
bool balanced = false )
純虛擬函式
Python
cv.ml.SVM.trainAuto(samples, layout, responses[, kFold[, Cgrid[, gammaGrid[, pGrid[, nuGrid[, coeffGrid[, degreeGrid[, balanced]]]]]]]]) -> retval

使用最優引數訓練 SVM。

引數
data可以使用 TrainData::createTrainData::loadFromCSV 構建的訓練資料。
kFold交叉驗證引數。訓練集被分成 kFold 個子集。一個子集用於測試模型,其他子集構成訓練集。因此,SVM 演算法將執行 kFold 次。
CgridC 的網格
gammaGridgamma 的網格
pGridp 的網格
nuGridnu 的網格
coeffGridcoeff 的網格
degreeGriddegree 的網格
balanced如果為 true 且問題是二類分類,則該方法會建立更平衡的交叉驗證子集,即子集中類之間的比例接近於整個訓練資料集中的比例。

該方法透過選擇最優引數 C、gamma、p、nu、coef0、degree 自動訓練 SVM 模型。當測試集誤差的交叉驗證估計值最小時,引數被認為是最佳的。

如果不需要最佳化某個引數,應將相應的網格步長設定為小於或等於 1 的任意值。例如,為避免 gamma 的最佳化,請將 gammaGrid.step = 0gammaGrid.minValgamma_grid.maxVal 設定為任意數字。在這種情況下,Gamma 值將用於 gamma。

最後,如果需要最佳化某個引數但不知道相應的網格,您可以呼叫函式 SVM::getDefaultGrid。例如,要為 gamma 生成網格,請呼叫 SVM::getDefaultGrid(SVM::GAMMA)

此函式適用於分類(SVM::C_SVCSVM::NU_SVC)以及迴歸(SVM::EPS_SVRSVM::NU_SVR)。如果它是 SVM::ONE_CLASS,則不進行最佳化,並執行使用 params 中指定引數的常規 SVM。

◆ trainAuto() [2/2]

virtual bool cv::ml::SVM::trainAuto ( InputArray samples,
int layout,
InputArray responses,
int kFold = 10,
Ptr< ParamGrid > Cgrid = SVM::getDefaultGridPtr(SVM::C),
Ptr< ParamGrid > gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA),
Ptr< ParamGrid > pGrid = SVM::getDefaultGridPtr(SVM::P),
Ptr< ParamGrid > nuGrid = SVM::getDefaultGridPtr(SVM::NU),
Ptr< ParamGrid > coeffGrid = SVM::getDefaultGridPtr(SVM::COEF),
Ptr< ParamGrid > degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE),
bool balanced = false )
純虛擬函式
Python
cv.ml.SVM.trainAuto(samples, layout, responses[, kFold[, Cgrid[, gammaGrid[, pGrid[, nuGrid[, coeffGrid[, degreeGrid[, balanced]]]]]]]]) -> retval

使用最優引數訓練 SVM。

引數
samples訓練樣本
layout參見 ml::SampleTypes
responses與訓練樣本關聯的響應向量。
kFold交叉驗證引數。訓練集被分成 kFold 個子集。一個子集用於測試模型,其他子集構成訓練集。因此,SVM 演算法是
CgridC 的網格
gammaGridgamma 的網格
pGridp 的網格
nuGridnu 的網格
coeffGridcoeff 的網格
degreeGriddegree 的網格
balanced如果為 true 且問題是二類分類,則該方法會建立更平衡的交叉驗證子集,即子集中類之間的比例接近於整個訓練資料集中的比例。

該方法透過選擇最優引數 C、gamma、p、nu、coef0、degree 自動訓練 SVM 模型。當測試集誤差的交叉驗證估計值最小時,引數被認為是最佳的。

此函式僅利用 SVM::getDefaultGrid 進行引數最佳化,因此僅提供基本的引數選項。

此函式適用於分類(SVM::C_SVCSVM::NU_SVC)以及迴歸(SVM::EPS_SVRSVM::NU_SVR)。如果它是 SVM::ONE_CLASS,則不進行最佳化,並執行使用 params 中指定引數的常規 SVM。


此類的文件是從以下檔案生成的