libsvm原始碼分析(一):svm.h檔案
libsvm中svm.h檔案主要定義整個程式要用的結構體svm_node,svm_problem,svm_parameter和一些方法。
1.svm_problem用於儲存本次參加運算的所有樣本(資料集),及其所屬類別。
struct svm_problem
{
int l; //記錄樣本總數
double *y; //指向樣本所屬類別的陣列。
struct svm_node **x; //指向一個儲存內容為指標的陣列
};
如果你的資料的形式如下所示:(libsvm只支援數值型的資料,最後一維表示所屬類別)
125,256,6000,256,16,128,1
29,8000,32000,32,8,32,2
29,8000,32000,32,8,32,3
29,8000,32000,32,8,32,1
29,8000,16000,32,8,16,3
對應的svm_problem的引數:
int l=5,即樣本總數;
double *y ={1.0, 2.0, 3.0, 1.0, 3.0}。
參加多類別計算時,由於使用one-against-one方法,所以參加分類的兩類所對應的y[i]的內容是+1和-1。
很多人在論壇上問如何進行多類別運算,本人在對libsvm的原始碼進行分析,發現svm.cpp中svm_train呼叫svm_group_classes中會計算資料中樣本的類別數,所以,在直接輸入資料後可以自動的進行多類別的分類工作。程式碼如下所示:
for(i=0;i<l;i++) { int this_label = (int)prob->y[i]; int j; for(j=0;j<nr_class;j++) { if(this_label == label[j]) { ++count[j]; break; } } data_label[i] = j; if(j == nr_class) { if(nr_class == max_nr_class) { max_nr_class *= 2; label = (int *)realloc(label,max_nr_class*sizeof(int)); count = (int *)realloc(count,max_nr_class*sizeof(int)); } label[nr_class] = this_label; count[nr_class] = 1; ++nr_class; } }
struct svm_node **x;
struct svm_node
{
int index;
double value;
};
svm_node用於儲存單一向量中的單個特徵,如125,256,6000,256,16,128,1儲存該資料包含7個svm_node:
1 | 2 | 3 | 4 | 5 | 6 | -1 |
125 | 256 | 6000 | 256 | 16 | 128 | 空 |
1 | 2 | 4 | 5 | 6 | -1 |
125 | 256 | 256 | 16 | 128 | 空 |
資料結構的優勢。但做歸一化時,操作就比較麻煩了。
因此,svm_node **x中儲存了資料,
2.svm_parameters是svm引數設定
enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };/* svm_type */
enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
struct svm_parameter
{
int svm_type; /* svm_type */
int kernel_type;/* kernel_type */
int degree; //poly中的d
double gamma; //poly/rbf/sigmoid中的gamma
double coef0; //poly/sigmoid中的r
/* these are for training only */
double cache_size; /* 訓練所需的記憶體,MB */
double eps;
double C; //懲罰因子
int nr_weight; //權重的數目,目前在例項程式碼中只有兩個值,一個是預設0,另外一個是
svm_binary_svc_probability函式中使用數值2。
int *weight_label; //權重,元素個數由nr_weight決定.
double* weight; //
double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */
double p; /* for EPSILON_SVR */
int shrinking; //指明訓練過程是否使用壓縮
int probability; //是否要做概率估計
};
因為我只對C-SVM進行研究,所以部分引數還是不太清楚是什麼意思。 int nr_weight;
int *weight_label;
double* weight;
3.svm_model中儲存訓練模型
struct svm_model
{
struct svm_parameter param; //訓練引數
int nr_class; //類別數
int l; //支援向量數
struct svm_node **SV; //儲存支援向量的指標,至於支援向量的內容,如果是從檔案中讀取,內容會
額外保留;如果是直接訓練得來,則保留在原來的訓練集中。如果訓練完成後需要預報,原來的訓練集記憶體不可以釋放。
double **sv_coef; ///相當於判別函式中的alpha
double *rho; //相當於判別函式中的b
double *probA;
double *probB;
/* for classification only */
int *label; //每類的類標籤
int *nSV; //每類的支援向量數 nSV[0] + nSV[1] + ... + nSV[k-1] = l
int free_sv; /* 1 if svm_model is created by svm_load_model*/
/* 0 if svm_model is created by svm_train */
};
相關推薦
libsvm原始碼分析(一):svm.h檔案
libsvm中svm.h檔案主要定義整個程式要用的結構體svm_node,svm_problem,svm_parameter和一些方法。 1.svm_problem用於儲存本次參加運算的所有樣本(資料集),及其所屬類別。 struct svm_problem {
CI原始碼分析(一)—config配置檔案模組
(一) 使用方式 (a) 系統級配置 語言、字元編碼、session、cookie等配置項 檔案位置: application/config/config.php載入方式: 自動載入呼叫方式: $this->config->item(‘conf
Android7.1 [Camera] cam_board.xml 檔案解析原始碼分析(一)
原始碼平臺:rk3399 RK支援了很多個攝像頭,在驅動目錄hardware/rockchip/camer
SVM原理、公式推導、libsvm原始碼分析
恰好翻到了以前記的cs229的筆記, 其實也想了好久要不要跟風去推導公式, 寫寫就當是複習一下了 說到svm, 按套路就要先說說線性分類器, 如圖, 在特徵維數為2時, 可以用一條線將正負樣本分離開
thinkphp5 原始碼分析一 入口檔案
1 入口檔案原始碼(/public/index.php) // [ 應用入口檔案 ] // 定義應用目錄 define('APP_PATH', __DIR__ . '/../app
區塊鏈教程Fabric1.0原始碼分析Ledger blkstorage block檔案儲存
區塊鏈教程Fabric1.0原始碼分析Ledger blkstorage block檔案儲存,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 Fabric 1.0原始碼筆
NSQ原始碼分析(一)——nsqd的初始化及啟動流程
nsq原始碼地址:https://github.com/nsqio/nsq 版本1.1.0 NSQ原始碼分析系列是我通過閱讀nsq的原始碼及結合網上的相關文章整理而成,由於在網上沒有找到很詳細和完整的文章,故自己親自整理了一份。如果有錯誤的地方,還請指正,希望這系列的文章給您帶來
CTS 原始碼分析(一) --CTS概況
1、什麼是CTS? Compatibility Test Suite 相容性測試套件 說白了,就是一套工具。一套軟體組成的測試工具。 2、哪裡有這套工具? &nb
智聯招聘爬蟲原始碼分析(一)
最近一直在關注秋招,雖然還沒輪到我,不過提前準備總是好的。近期聽聞今年秋招形勢嚴峻,為了更好的準備將來的實習、工作,我決定在招聘網站上爬取一些與資料有關的崗位資訊,藉以給自己將來的職業道路選擇提供參考。 一、原理 &n
Django rest framework 的認證流程(原始碼分析一)
一、基本流程舉例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view()), ] urls
go原始碼分析(一) 通過除錯看go程式初始化過程
參考資料:Go 1.5 原始碼剖析 (書籤版).pdf 編寫go語言test.go package main import ( "fmt" ) func main(){ fmt.Println("Hello World") } 帶除錯的編譯程式碼 go build -
yb-framework原始碼分析(一)
前言 本人非科班出身的java小白一枚,兩年多開發經驗。由於最近部落格看的比較多,聽聞某位大牛曾言:種樹的時機最好是十年前,其次是現在,寫部落格也是這樣。加上最近喜歡研究現公司的框架原始碼,發現大體能知道思路但是很難清晰的掌握,而寫部落格是一個鍛鍊自己的表達能力、記錄學習成果以及有利於幫助自己理清思路的
Glide 原始碼分析(一):圖片壓縮
關於圖片的那點事兒 Q: 一張大小為 55KB, 解析度為 1080 * 480 的 PNG 圖片,它載入近記憶體時所佔的大小是多少呢? 圖片記憶體大小 圖片佔用記憶體大小 = 解析度 * 畫素點大小 其中資料格式不同畫素點大小也不同: ALPHA_8: 1B RGB_565: 2B
spring原始碼分析(二):外部配置檔案的載入
@PropertySource 和@Profile 簡介: @PropertySource:用在類上,載入一個(*.properties)的配置檔案 @Profile:用在類或者方法上,指定元件在哪個環境的情況下才能被註冊到容器中,不指定,任何環境下都能註冊這個元件 使用案例1-
epoll原始碼分析(一)
epoll原始碼分析(一) 文章目錄 epoll原始碼分析(一) @[toc] 主要資料結構 epoll_create()函式實現 總結 主要資料結構
RxJava2原始碼分析一
RxJava 在最近兩年迅速火爆起來,最近學習RxJava2,免不了需要學習它的原始碼,寫下部落格記錄學習結果。 RxJava 的設計理念基於觀察者模式,這裡就需要先了解一下它所涉及的
Glide原始碼分析(一)---基本
吐槽 中秋節啊,自己身為一個單身程式猿又不回家,還是在實驗室學個新的框架吧,畢竟這個框架很實用,之前自己都還沒用過,就很尷尬。 那中秋快樂啊 本文思維導圖 Glide是什麼 答曰:一種安卓平臺上的圖形載入框架,一種很好很好用的框架 然後網上說了下picasso
Glide 原始碼分析(一)
Glide原始碼分析 寫在前面 在專案開發中一直使用Glide進行圖片的載入顯示,知道如何使用,但不清楚Glide內部是如何實現的。所以一直想看看Glide的原始碼實現是如何做的,終於有時間和機會了,寫下來做個筆記,也給大家學習下。 Glide載入基本步驟 一般
Spring-BeanFactory原始碼分析(一)
前言 Spring 版本:5.0.9.RELEASE 正式進入Spring 原始碼分析這個模組了,對於spring這個龐大的工程,如果要一點點的完全分析是非常困難的,對於應用型框架,我還是偏向於掌握思想或者設計,而不是記住程式碼,對於初次看spring原始
JDK1.8集合框架原始碼分析一-------------ArrayList
1.ArrayList初始化 1.1 無參建構函式,預設一個空陣列 1.2 帶容量的有參建構函式:根據容量引數的值範圍來初始化 1.3 原始碼中陣列預設的初始容量