libsvm總結

1. 訓練

格式:

model = libsvmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

這個函數有三個參數,其中

  • -training_label_vector:訓練樣本的類標,如果有m個樣本,就是m x 1的矩陣(類型必須為double)。這里可以是二分類和多分類,類標是(-1,1)、(1,2,3)或者其他任意用來表示不同的類別的數字,要轉成double類型。
  • -training_instance_matrix:訓練樣本的特征,如果有m個樣本,每個樣本特征是n維,則為m x n的矩陣(類型必須為double)。
  • -libsvm_options:訓練的參數,在第3點詳細介紹。

libsvmtrain函數返回訓練好的SVM分類器模型model是一個結構體,包含以下成員:

  • -Parameters: 一個5 x 1的矩陣,從上到下依次表示:
        -s SVM類型(默認0);
        -t 核函數類型(默認2)
        -d 核函數中的degree設置(針對多項式核函數)(默認3);
        -g 核函數中的r(gamma)函數設置(針對多項式/rbf/sigmoid核函數) (默認類別數目的倒數);
        -r 核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
  • -nr_class: 表示數據集中有多少類別,比如二分類時這個值即為2。
  • -totalSV: 表示支持向量的總數。
  • -rho: 決策函數wx+b中的常數項的相反數(-b)。
  • -Label: 表示數據集中類別的標簽,比如二分類常見的1和-1。
  • -ProbA: 使用-b參數時用于概率估計的數值,否則為空。
  • -ProbB: 使用-b參數時用于概率估計的數值,否則為空。
  • -nSV: 表示每類樣本的支持向量的數目,和Label的類別標簽對應。如Label=[1; -1],nSV=[63; 67],則標簽為1的樣本有63個支持向量,標簽為-1的有67個。
  • -sv_coef: 表示每個支持向量在決策函數中的系數。
  • -SVs: 表示所有的支持向量,如果特征是n維的,支持向量一共有m個,則為m x n的稀疏矩陣。

另外,如果在訓練中使用了-v參數進行交叉驗證時,返回的不是一個模型,而是交叉驗證的分類的正確率或者回歸的均方根誤差。

當構建完成model后,還要為上述參數選擇合適的值,方法主要有Gridsearch,其他的感覺不常用,Gridsearch說白了就是窮舉。

?

網格參數尋優函數(分類問題):SVMcgForClass

? ?[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)

輸入:

  • train_label:訓練集的標簽,格式要求與svmtrain相同。
  • train:訓練集,格式要求與svmtrain相同。
  • cmin,cmax:懲罰參數c的變化范圍,即在[2^cmin,2^cmax]范圍內尋找最佳的參數c,默認值為cmin=-8,cmax=8,即默認懲罰參數c的范圍是[2^(-8),2^8]。
  • gmin,gmax:RBF核參數g的變化范圍,即在[2^gmin,2^gmax]范圍內尋找最佳的RBF核參數g,默認值為gmin=-8,gmax=8,即默認RBF核參數g的范圍是[2^(-8),2^8]。
  • v:進行Cross Validation過程中的參數,即對訓練集進行v-fold Cross Validation,默認為3,即默認進行3折CV過程。?
  • cstep,gstep:進行參數尋優是c和g的步進大小,即c的取值為2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值為2^gmin,2^(gmin+gstep),…,2^gmax,默認取值為cstep=1,gstep=1。
  • accstep:最后參數選擇結果圖中準確率離散化顯示的步進間隔大小([0,100]之間的一個數),默認為4.5。

輸出:

  • bestCVaccuracy:最終CV意義下的最佳分類準確率。
  • bestc:最佳的參數c。
  • bestg:最佳的參數g。

?

網格參數尋優函數(回歸問題):SVMcgForRegress

? [bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)

其輸入輸出與SVMcgForClass類似,這里不再贅述。


SVM?怎樣能得到好的結果

1.???對數據做歸一化(simple scaling)

2.???應用?RBF kernel?

3.???用cross-validation和grid-search?得到最優的c和g

4.???用得到的最優c和g訓練訓練數據

5.???測試


?

關于svm的C以及核函數參數設置----------------------


C一般可以選擇為:10^t , t=- 4..4就是0.0001?到10000

?選擇的越大,表示對錯誤例懲罰程度越大,可能會導致模型過擬合

?

在LIBSVM中-t用來指定核函數類型(默認值是2)。

0)線性核函數

(無其他參數)

1)多項式核函數

(重點是階數的選擇,即d,一般選擇1-11:1 3 5 7 9 11,也可以選擇2,4,6…)

2)RBF核函數

(徑向基RBF內核,exp{-|xi-xj|^2/均方差},其中均方差反映了數據波動的大小。

參數通常可選擇下面幾個數的倒數:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默認的是類別數的倒數,即1/k,2分類的話就是0.5)

3)sigmoid核函數?又叫做S形內核

兩個參數g以及r:g一般可選1 2 3 4,r選0.2 0.4 0.60.8 1

4)自定義核函數

?

與核函數相對應的libsvm參數:

1)對于線性核函數,沒有專門需要設置的參數

2)對于多項式核函數,有三個參數。-d用來設置多項式核函數的最高此項次數,也就是公式中的d,默認值是3。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。

3)對于RBF核函數,有一個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。

4)對于sigmoid核函數,有兩個參數。-g用來設置核函數中的gamma參數設置,也就是公式中的第一個r(gamma),默認值是1/k(k是類別數)。-r用來設置核函數中的coef0,也就是公式中的第二個r,默認值是0。


2. 預測

格式:

[predicted_label, accuracy, decision_values/prob_estimates]?
    = libsvmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);

這個函數包括四個參數,其中

  • -testing_label_vector:測試樣本的類標,如果有m個樣本,就是m x 1的矩陣(類型必須為double)。如果類標未知,可以初始化為任意m x 1的double數組。
  • -testing_instance_matrix:測試樣本的特征,如果有m個樣本,每個樣本特征是n維,則為m x n的矩陣(類型必須為double)。
  • -model:使用libsvmtrain返回的模型
  • -libsvm_options:預測的參數,與訓練的參數形式一樣。

libsvmpredict函數有三個返回值,不需要的值在Matlab可以用 ~ 進行代替。

  • -predicted_label:第一個返回值,表示樣本的預測類標號。
  • -accuracy:第二個返回值,一個3 x 1的數組,表示分類的正確率、回歸的均方根誤差、回歸的平方相關系數。
  • -decision_values/prob_estimates:第三個返回值,一個矩陣包含決策的值或者概率估計。對于n個預測樣本、k類的問題,如果指定“-b 1”參數,則n x k的矩陣,每一行表示這個樣本分別屬于每一個類別的概率;如果沒有指定“-b 1”參數,則為n x k*(k-1)/2的矩陣,每一行表示k(k-1)/2個二分類SVM的預測結果。

3. 訓練的參數

LIBSVM訓練時可以選擇的參數很多,包括:

  • -s svm類型:SVM設置類型(默認0)
        0 — C-SVC; 1 –v-SVC; 2 – 一類SVM; 3 — e-SVR; 4 — v-SVR
  • -t 核函數類型:核函數設置類型(默認2)
        0 – 線性核函數:u’v?
        1 – 多項式核函數:(r*u’v + coef0)^degree
        2 – RBF(徑向基)核函數:exp(-r|u-v|^2)
        3 – sigmoid核函數:tanh(r*u’v + coef0)
  • -d degree:核函數中的degree設置(針對多項式核函數)(默認3)
  • -g r(gamma):核函數中的gamma函數設置(針對多項式/rbf/sigmoid核函數)(默認1/k,k為總類別數)
  • -r coef0:核函數中的coef0設置(針對多項式/sigmoid核函數)((默認0)
  • -c cost:設置C-SVC,e -SVR和v-SVR的參數(損失函數)(默認1)
  • -n nu:設置v-SVC,一類SVM和v- SVR的參數(默認0.5)
  • -p p:設置e -SVR 中損失函數p的值(默認0.1)
  • -m cachesize:設置cache內存大小,以MB為單位(默認40)
  • -e eps:設置允許的終止判據(默認0.001)
  • -h shrinking:是否使用啟發式,0或1(默認1)
  • -wi weight:設置第幾類的參數C為weight*C (C-SVC中的C) (默認1)
  • -v n: n-fold交互檢驗模式,n為fold的個數,必須大于等于2

以上這些參數設置可以按照SVM的類型和核函數所支持的參數進行任意組合,如果設置的參數在函數或SVM類型中沒有也不會產生影響,程序不會接受該參數;如果應有的參數設置不正確,參數將采用默認值。

4. 讀取或保存

libsvmread函數可以讀取以LIBSVM格式存儲的數據文件。

[label_vector, instance_matrix] = libsvmread(‘data.txt’);

這個函數輸入的是文件的名字,輸出為樣本的類標和對應的特征。

libsvmwrite函數可以把Matlab的矩陣存儲稱為LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

這個函數有三個輸入,分別為保存的文件名、樣本的類標和對應的特征(必須為double類型的稀疏矩陣)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Head First設計模式》第三章筆記 裝飾者模式

裝飾者模式(Decorator Pattern) *利用組合(composition)和委托(delegation)可以在運行時實現繼承行為的效果,動態地給對象加上新的行為。 *利用繼承擴展子類的行為,是在編譯時靜態決定的&#x…

機器學習中如何解決數據不平衡問題?

文章目錄目錄什么是數據不平衡問題?數據不平衡會造成什么影響?如何處理數據不平衡問題?1、重新采樣訓練集1.1隨機欠抽樣1.2.基于聚類的過采樣2.使用K-fold交叉驗證3.轉化為一分類問題4.組合不同的重采樣數據集5.用不同比例重新采樣6.多模型Ba…

《Head First設計模式》第四章筆記 工廠模式

之前我們一直在使用new操作符,但是實例化這種行為并不應該總是公開的進行,而且初始化經常會造成耦合問題,工廠模式將擺脫這種復雜的依賴,本次內容包括簡單工廠,工廠方法和抽象工廠三種情況。 1 2 3 4 5 6 Duck duck&a…

《Head First設計模式》第五章筆記-單件模式

單件模式 定義:確保一個類只有一個實例,并提供全局訪問點。 編寫格式: 1 2 3 4 5 6 public class MyClass{ private MyClass(){}//構造方法私有化 public static MyClass getInstance(){ //提供全局訪問點 return new My…

處理機器學習大數據的7種方法

文章目錄目錄1.分配更多的內存2.使用較小的樣本3.將數據提交至服務器上4.更改數據格式5.使用數據流方式或者逐行讀入的方法6.使用關系數據庫7.使用大數據平臺目錄 在實際的生產過程中,我們經常會遇到數據文件太大,而無法直接讀入到計算機中進行處理&…

《Head First設計模式》第六章筆記-命令模式

封裝調用-命令模式 命令模式可將“動作的請求者”從“動作的執行者”對象中解耦。 本篇中將不再描述書中所引入的“巴斯特家電自動化公司”的遙控器控制案例,而使用簡單易懂的餐廳案例。 在開始之前,讓我們通過一個現實中的例子來了解命令模式。 理解…

kaggle(04)---avazu_ctr_predictor(baseline)

比賽的目的: 通過分析網上的系統日志和用戶行為信息,來預測某些網頁上項目的點擊率。是一個二分類的問題,只需要預測出用戶是否點擊即可最好能夠輸出某個概率,比如:用戶點擊某個廣告的概率。 比賽官網 文件信息&…

一文讀懂機器學習庫graphLab

文章目錄目錄什么是graphlab為什么使用graphlab?如何安裝graphlab?graphlab的簡單使用。目錄 什么是graphlab GraphLab 是由CMU(卡內基梅隆大學)的Select 實驗室在2010 年提出的一個基于圖像處理模型的開源圖計算框架,框架使用C語言開發實…

《Head First設計模式》第七章-適配器模式、外觀模式

適配器模式 適配器模式是什么,你一定不難理解,因為現實中到處都是。比如說: 如果你需要在歐洲國家使用美國制造的筆記本電腦,你可能需要使用一個交流電的適配器…… 當你不想改變現有的代碼,解決接口不適配問題&#…

《Head First設計模式》第八章筆記-模板方法模式

模板方法模式 之前所學習的模式都是圍繞著封裝進行,如對象創建、方法調用、復雜接口的封裝等,這次的模板方法模式將深入封裝算法塊,好讓子類可以在任何時候都將自己掛接進運算里。 模板方法定義:模板方法模式在一個方法中定義一…

機器學習基礎-吳恩達-coursera-(第一周學習筆記)----Introduction and Linear Regression

課程網址:https://www.coursera.org/learn/machine-learning Week 1 —— Introduction and Linear Regression 目錄 Week 1 Introduction and Linear Regression目錄一 介紹1-1 機器學習概念及應用1-2 機器學習分類 二 單變量的線性回歸2-1 假設函數hypothesis2…

常見8種機器學習算法總結

簡介 機器學習算法太多了,分類、回歸、聚類、推薦、圖像識別領域等等,要想找到一個合適算法真的不容易,所以在實際應用中,我們一般都是采用啟發式學習方式來實驗。通常最開始我們都會選擇大家普遍認同的算法,諸如SVM&a…

redis——數據結構(字典、鏈表、字符串)

1 字符串 redis并未使用傳統的c語言字符串表示,它自己構建了一種簡單的動態字符串抽象類型。 在redis里,c語言字符串只會作為字符串字面量出現,用在無需修改的地方。 當需要一個可以被修改的字符串時,redis就會使用自己實現的S…

Hotspot虛擬機的對象

創建 Step1:類加載檢查 虛擬機遇到一條 new 指令時,首先將去檢查這個指令的參數是否能在常量池中定位到這個類的符號引用,并且檢查這個符號引用代表的類是否已被加載過、解析和初始化過。如果沒有,那必須先執行相應的類加載過程。 Step2:分…

劍指offer(刷題1-10)--c++,Python版本

文章目錄目錄第一題:解題思路:代碼實現:c順序查找二分查找Python第二題:解題思路:代碼實現:cpython第三題:解題思路:代碼實現:c使用棧輔助反轉鏈表python第四題&#xff…

redis——數據結構(整數集合,壓縮列表)

4、整數集合 整數集合(intset)是 Redis 用于保存整數值的集合抽象數據結構, 可以保存 int16_t 、 int32_t 、 int64_t 的整數值, 并且保證集合中不會出現重復元素。 實現較為簡單: typedef struct intset {// 編碼方…

原 劍指offer(刷題11-20)--c++,Python版本

文章目錄目錄第11題:解題思路:代碼實現:cpython第12題:解題思路:代碼實現:cpython第13 題:解題思路:代碼實現:cpython第 14題:解題思路:代碼實現&…

LRU介紹和實現

LRU全稱是Least Recently Used,即最近最久未使用的意思。 LRU算法的設計原則是:如果一個數據在最近一段時間沒有被訪問到,那么在將來它被訪問的可能性也很小。也就是說,當限定的空間已存滿數據時,應當把最久沒有被訪問…

機器學習知識總結系列- 知識圖譜(0-0)

文章目錄目錄機器學習知識圖譜目錄 本系列的文章只是根據個人的習慣進行總結,可能結構與一些書籍上不太一樣,開始的內容比較簡單,會隨著后續的深入,不斷豐富和更新圖譜,同時也期待有相同興趣的朋友一起給我留言一起豐富…

跳表介紹和實現

想慢慢的給大家自然的引入跳表。 想想,我們 1)在有序數列里搜索一個數 2)或者把一個數插入到正確的位置 都怎么做? 很簡單吧 對于第一個操作,我們可以一個一個比較,在數組中我們可以二分,這…