1. 程式人生 > >libsvm原始碼分析(一):svm.h檔案

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
如果value 為0.00,該特徵將不會被儲存,如125,256,0,256,16,128,1,其中(特徵3)被跳過:
1 2 4 5 6 -1
125 256 256 16 128
0.00 不保留的好處在於,做點乘的時候,可以加快計算速度,對於稀疏矩陣,更能充分體現這種
資料結構的優勢。但做歸一化時,操作就比較麻煩了。

因此,svm_node **x中儲存了資料,

svm_node **x = Malloc(svm_node *,l);


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 原始碼中陣列預設的初始容量