利用LIBSVM估計概率

2021-07-11 15:12:20 字數 1562 閱讀 1108

在研究分類問題時,可能會遇到需要分類器返回樣本屬於每一類的概率,而不是直接輸出該樣本的類別的情況。因為之前一直使用opencv庫進行開發,所以也想在opencv的ml模組尋找是否有對應功能的svm分類器,無果。最後發現最新的libsvm庫提供類似功能的函式。於是,借助libsvm,實現了樣本的概率估計。過程如下:

開啟cmd,進入libsvm -> windows。

訓練之前,建議採用svm-train進行歸一化。語法如下:svm-scale -l lower -u upper data_filename > scale_data_filename

示例如下:

svm-scale-l-

1-u1-s range train > train.scale

這裡需要注意svm_type,kernel_type,probability_estimates這幾個引數。為了得到概率模型,需要將probability_estimates置1。例子如下:

svm-train-s0

-b1 data_file

注:為了方便,可將上述過程儲存為乙個批處理檔案。

4. 訓練完成後,得到model檔案。然後在cpp檔案中呼叫。主要分為載入模型,構造節點,呼叫概率估計函式。**如下:

svm_node* charac = new svm_node[featurenum+1];

if (joint.cols != featurenum)

//特徵向量歸一化

//normalize(joint, joint, 0, 1, norm_minmax, -1);

for (int i = 0; i < joint.rows; i++)

}charac[featurenum].index = -1;

double* prob_estimates = new

double[labelnum];

int* label = new

int[labelnum];

//svm_get_labels(svmmodel[classffierindex], label);

label = svmmodel[classffierindex]->label;

if (svm_check_probability_model(svmmodel[classffierindex]) == 1)

svm_predict_probability(svmmodel[classffierindex], charac, prob_estimates);

double pj = prob_estimates[label[id]];

delete charac;

delete prob_estimates;

return pj;

注:注意模型中的類別順序和訓練時的類別順序的差異性,如果相同則不需要改,否則需要按照模型的類別順序來輸出概率。

在除錯過程中,發現svm概率模型的準確率比直接輸出類別的模型的準確率低。就我自己的樣本而言,前者的準確率為70%左右,而後者的準確率為100%。目前還不清楚原因。

概率密度估計簡介

1 概率密度函式 在分類器設計過程中 尤其是貝葉斯分類器 需要在類的先驗概率和類條件概率密度均已知的情況下,按照一定的決策規則確定判別函式和決策面。但是,在實際應用中,類條件概率密度通常是未知的。那麼,當先驗概率和類條件概率密度都未知或者其中之一未知的情況下,該如何來進行類別判斷呢?其實,只要我們能...

概率密度函式估計筆記

概率密度函式估計是貝葉斯決策的基礎,有兩大類方法 引數法和非引數法。所謂的引數法是指已知引數形式,但不知道引數,我們要對引數進行估計的過程。這裡主要介紹點估計的兩種方法 一種是最大似然估計,一種是貝葉斯估計。最大似然估計 假設 我們要估計的引數 是確定但未知的 樣本之間是獨立同分布的 或者是條件獨立...

先驗概率,似然估計和後驗概率

先驗 根據若干年的統計 經驗 或者氣候 常識 某地方下雨的概率 似然 下雨 果 的時候有烏雲 因 or 證據 or 觀察的資料 的概率,即已經有了果,對證據發生的可能性描述 後驗 根據天上有烏雲 原因或者證據 or 觀察資料 下雨 結果 的概率 後驗 先驗 似然 存在下雨的可能 先驗 下雨之前會有烏...