1. 程式人生 > >分類演算法 之 支援向量機--原理+案例+程式碼

分類演算法 之 支援向量機--原理+案例+程式碼

分類演算法 之 支援向量機–原理+案例+程式碼

標籤(空格分隔): SPARK機器學習

1. 支援向量機的概述

1.1 解決問題的型別

支援向量機(SVM:support vactor machine)用於解決:
(1)分類問題。最初解決了區分兩類由n維向量表示的成員的一般性學習問題
(2)迴歸預測連續型變數。通過引入可選的,經過修改的,包含距離度量的損失函式,SVM可以被用於迴歸問題。

在分類和迴歸中應用可以用支援向量分類(SVC)與支援向量迴歸(SVR)這兩個術語來區分。

SVM也是一種監督學習演算法,從與標號的訓練資料集中建立學習函式,僅需少量訓練樣本。其函式可以是分類函式(輸出是二元的),或者一般迴歸函式。

1.2 演算法邏輯

模型:支援向量機的模型是定義在特徵空間上的間隔最大的線性分類器,間隔最大使它有別於感知機。

學習策略:間隔最大化。可以形式化為一個求解凸二次規劃的問題。

1.3 模型的分類

當訓練資料線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支援向量機,又稱硬間隔支援向量機

當訓練資料近似線性可分時,通過軟間隔最大化,去學習一個線性分類器,即線性支援向量機,也稱軟間隔支援向量機

當訓練資料線性不可分時,通過使用核技巧及軟間隔最大化,學習非線性向量機

2.線性分類

2.1 如何分類

線性分類器一定意義上也可以叫感知機。

C1和C2是要區分的兩個類別,在二維平面中它們的樣本如下圖所示。中間的直線就是一個分類函式,它可以將兩類樣本完全分開。一般的,如果一個線性函式能夠將樣本完全正確的分開,就稱這些資料是線性可分的,否則稱為非線性可分的。
截圖142.png-3.9kB


什麼叫線性函式呢?在一維空間裡就是一個點,在二維空間裡就是一條直線,三維空間裡就是一個平面,可以如此想象下去,如果不關注空間的維數,這種線性函式還有一個統一的名稱——超平面(Hyper Plane)

實際上,一個線性函式是一個實值函式(即函式的值是連續的實數),而我們的分類問題(例如這裡的二元分類問題——回答一個樣本屬於還是不屬於一個類別的問題)需要離散的輸出值,例如用1表示某個樣本屬於類別C1,而用0表示不屬於(不屬於C1也就意味著屬於C2),這時候只需要簡單的在實值函式的基礎上附加一個閾值即可,通過分類函式執行時得到的值大於還是小於這個閾值來確定類別歸屬。 例如我們有一個線性函式

g(x)=wx+b

我們可以取閾值為0,這樣當有一個樣本xi需要判別的時候,我們就看g(xi)的值。若g(xi)>0,就判別為類別C1,若g(xi)<0,則判別為類別C2(等於的時候我們就拒絕判斷)。此時也等價於給函式g(x)附加一個符號函式sgn(),即f(x)=sgn [g(x)]是我們真正的判別函式。

關於g(x)=wx+b這個表示式要注意三點:
一,式中的x不是二維座標系中的橫軸,而是樣本的向量表示,例如一個樣本點的座標是(3,8),則xT=(3,8) ,而不是x=3(一般說向量都是說列向量,因此以行向量形式來表示時,就加上轉置)。
二,這個形式並不侷限於二維的情況,在n維空間中仍然可以使用這個表示式,只是式中的w成為了n維向量(在二維的這個例子中,w是二維向量,為了表示起來方便簡潔,以下均不區別列向量和它的轉置,聰明的讀者一看便知);
三,g(x)不是中間那條直線的表示式,中間那條直線的表示式是g(x)=0,即wx+b=0,我們也把這個函式叫做分類面。

2.2 尋找最優分類器

實際上很容易看出來,中間那條分界線並不是唯一的,我們把它稍微旋轉一下,只要不把兩類資料分錯,仍然可以達到上面說的效果,稍微平移一下,也可以。此時就牽涉到一個問題,對同一個問題存在多個分類函式的時候,哪一個函式更好呢?顯然必須要先找一個指標來量化“好”的程度,通常使用的都是叫做“分類間隔”的指標。

訓練樣本的格式:
在進行文字分類的時候,我們可以讓計算機這樣來看待我們提供給它的訓練樣本,每一個樣本由一個向量(就是那些文字特徵所組成的向量)和一個標記(標示出這個樣本屬於哪個類別)組成。如下:

Di=(xi,yi)

xi就是文字向量(維數很高),yi就是分類標記。

樣本到超平面的間隔:
在二元的線性分類中,這個表示分類的標記只有兩個值,1和-1(用來表示屬於還是不屬於這個類)。有了這種表示法,我們就可以定義一個樣本點到某個超平面的間隔:

δi=yi(wxi+b)

首先注意到如果某個樣本屬於該類別的話,那麼wxi+b>0(這是因為我們所選的g(x)=wx+b就通過大於0還是小於0來判斷分類),而yi也大於0;若不屬於該類別的話,那麼wxi+b<0,而yi也小於0,這意味著yi(wxi+b)總是大於0的,而且它的值就等於|wxi+b|!(也就是|g(xi)|)。若

歸一化
現在把w和b進行一下歸一化,即用w/||w||和b/||w||分別代替原來的w和b,那麼間隔就可以寫成
截圖143.png-1.1kB
這個公式就是解析幾何中點xi到直線g(x)=0的距離公式!(推廣一下,是到超平面g(x)=0的距離, g(x)=0就是上節中提到的分類超平面)

當用歸一化的w和b代替原值之後的間隔有一個專門的名稱,叫做幾何間隔,幾何間隔所表示的正是點到超平面的歐氏距離,我們下面就簡稱幾何間隔為“距離”。以上是單個點到某個超平面的距離定義,同樣可以定義一個點的集合(就是一組樣本)到某個超平面的距離為此集合中離超平面最近的點的距離。下面這張圖更加直觀的展示出了幾何間隔的現實含義:
截圖144.png-21kB

H是分類面,而H1和H2是平行於H,且過離H最近的兩類樣本的直線,H1與H,H2與H之間的距離就是幾何間隔。
之所以如此關心幾何間隔這個東西,是因為幾何間隔與樣本的誤分次數間存在關係:
截圖145.png-1.5kB
其中的δ是樣本集合到分類面的間隔,R=max ||xi|| i=1,…,n,即R是所有樣本中(xi是以向量表示的第i個樣本)向量長度最長的值(也就是說代表樣本的分佈有多麼廣)。先不必追究誤分次數的具體定義和推導過程,只要記得這個誤分次數一定程度上代表分類器的誤差。而從上式可以看出,誤分次數的上界由幾何間隔決定!

幾何間隔越大的解,它的誤差上界越小。因此最大化幾何間隔成了我們訓練階段的目標

2.3 損失函式

截圖147.png-1.3kB

3. 支援向量機使用例項

資料準備:

將資料預處理格式如下:

label,factor1 factor2 .... factorn

如:
0,1 0 0
0,2 0 0
1,0 1 0
.......

3.1 案例一:來自官網

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.util.MLUtils

// 讀取資料
val data = MLUtils.loadLibSVMFile(sc, "data/mllib/sample_libsvm_data.txt")

// 將資料隨機分成訓練集與測試集,分別為40%與60%
val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0).cache()
val test = splits(1)

// 對訓練集進行訓練模型,迭代次數為100
val numIterations = 100
val model = SVMWithSGD.train(training, numIterations)

// 將訓練好的模型對測試集進行預測,輸出(預測的label,真實的label)
val scoreAndLabels = test.map { point =>
  val score = model.predict(point.features)
  (score, point.label)
}

// 計算ROC值,對模型進評估
val metrics = new BinaryClassificationMetrics(scoreAndLabels)
val auROC = metrics.areaUnderROC()

println("Area under ROC = " + auROC)

// 儲存模型,或者下次再次load模型使用
model.save(sc, "myModelPath")
val sameModel = SVMModel.load(sc, "myModelPath")

3.2 案例二:使用支援向量機分析胃癌轉移

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.MulticlassMetrics
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.{SparkContext,SparkConf}
import org.apahce.spark.mllib.regression.LabeldPoint

object SVMTest {

 def main(agrs:Array[String]{

   //初始化Spark例項
   val conf = new SparkConf()
       .setMaster("local")
       .setAppName("SVMTest")
   val sc = new SparkContext(conf)

   //讀取資料
   val data = MLUtils.loadLibSVMFile(sc,"資料儲存的路徑")

   //將資料隨機分成測試集與訓練集
   val splits = data.randomSplit(Array(0.7,0.3),seed = 11L)
   val trainning = splits(0).cache
   val test = split(1)

   //訓練模型
   val model = SVMWithSGD.train(trainning,50)

   //呼叫模型對測試集做預測
   val predictionAndLabels = test.map{
   case LabeledPoint(label,features)=>
   val score = model.predict(features)=>
   (score,label)
   }

   //計算預測的精度
   val metrics =  new MulticlassMetrics(predictioAndLabels)
   val precision = metrics.precision
   println("precision:"+precision)

   //對某一個未知的人做預測
   val patient = Vector.dense(Array(70,3,180.0,4,3)
   if(patient == 1) println("患者的胃癌有機率轉移")
   else println("患者的胃癌沒有機率轉移")
 }
}

相關推薦

分類演算法 支援向量--原理+案例+程式碼

分類演算法 之 支援向量機–原理+案例+程式碼 標籤(空格分隔): SPARK機器學習 1. 支援向量機的概述 1.1 解決問題的型別 支援向量機(SVM:support vactor machine)用於解決: (1)分類問題。最初解決了

資料探勘---分類演算法支援向量SVM

           這篇來說說支援向量機,說實在的,這個是我的最愛,一直比較看好這個演算法,而且也是花了不少時間在這個上面,下面一起來複習下。同上篇,下面摘自本人的畢業設計論文中,後面給出參考文獻。            基於統計學習理論的支援向量機演算法是現代智慧技術

機器學習支援向量原理和sklearn實踐

1. 場景描述 問題:如何對對下圖的線性可分資料集和線性不可分資料集進行分類? 思路: (1)對線性可分資料集找到最優分割超平面 (2)將線性不可分資料集通過某種方法轉換為線性可分資料集 下面將帶著這兩個問題對支援向量機相關問題進行總結 2. 如何找到最優分割超平面 一般地,當訓練資料集線性可分時,存

機器學習支援向量SVM及程式碼示例

一、線性可分SVM SVM演算法最初是用來處理二分類問題的,是一種有監督學習的分類演算法。 對於線性可分的二分類問題,我們可以找到無窮多個超平面,將兩類樣本進行區分。(超平面:一維中是一個點;二維中是一條線;三維中是一個面……) 在上面的多個超平面中,

機器學習支援向量SVM Support Vector Machine (五) scikit-learn演算法

一、scikit-learn SVM演算法庫概述         scikit-learn中SVM的演算法庫分為兩類,一類是分類演算法庫,包括SVC、 NuSVC和LinearSVC三個類。另一類是迴歸演算法庫,包括SVR、NuSVR和LinearSVR三個類。相關的

機器學習支援向量演算法例項

此例項是利用svm演算法預測乳腺癌腫瘤是良性還是惡性,資料格式如下圖所示:第一列表示編號,2到10列表示資料屬性,第11列表示腫瘤標籤2表示良性4表示惡性。 程式碼如下 from sklearn import svm # x = [[2, 0], [1, 1], [

機器學習支援向量演算法(一)

一、問題引入   支援向量機(SVM,Support Vector Machine)在2012年前還是很牛逼的,但是在12年之後神經網路更牛逼些,但是由於應用場景以及應用演算法的不同,我們還是很有必要了解SVM的,而且在面試的過程中SVM一般都會問到。支援向量機是一個非常經典且高效的分類模型。我們的目標:基

機器學習支援向量演算法(二)

五、SVM求解例項   上面其實已經得出最終的表示式了,下面我們會根據一些具體的點來求解α的值。資料:3個點,其中正例 X1(3,3) ,X2(4,3) ,負例X3(1,1) 如下圖所示       我們需要求解下式的極小值       注意約束條件(在這裡不要忘記了yi代表的是資料

機器學習支援向量(四)

引言:   SVM是一種常見的分類器,在很長一段時間起到了統治地位。而目前來講SVM依然是一種非常好用的分類器,在處理少量資料的時候有非常出色的表現。SVM是一個非常常見的分類器,在真正瞭解他的原理之前我們多多少少都有接觸過他。本文將會詳細的介紹SVM的原理、目標以及計算過程和演算法步驟。我們針對線性可分資

演算法學習——支援向量SVM

SVM現在的公式推導很多,都是現成的,而且寫的也很好,我會提供相關資源,這篇博文主要從思想理解的方面做一個簡單介紹。 1、SVM 是如何工作的? 支援向量機的基礎概念可以通過一個簡單的例子來解釋。讓我們想象兩個類別:紅色和藍色,我們的資料有兩個特徵:x 和 y。我們想要一個分類器,給定一

[四]機器學習支援向量SVM

4.1 實驗資料 本資料集來源於UCI的Adult資料集,並對其進行處理得到的。資料集下載地址:http://archive.ics.uci.edu/ml/datasets/Adult。本實驗使用LIBSVM包對該資料進行分類。 原始資料集每條資料有14個特徵,分別為age,workc

機器學習演算法——SVM(支援向量)

文章目錄 1. SVM簡介 2. SVM的一些概念 2.1 函式間隔與幾何間隔 2.2 支援向量 3. SVM模型目標函式與優化 3.1 SVM模型目標函式的推導(線性可分)

機器學習:SVM(一)——線性可分支援向量原理與公式推導

原理 SVM基本模型是定義在特徵空間上的二分類線性分類器(可推廣為多分類),學習策略為間隔最大化,可形式化為一個求解凸二次規劃問題,也等價於正則化的合頁損失函式的最小化問題。求解演算法為序列最小最優化演算法(SMO) 當資料集線性可分時,通過硬間隔最大化,學習一個線性分類器;資料集近似線性可分時,即存在一小

機器學習筆記支援向量

目的:給定二分類樣本集,想要找一個分離超平面。(魯棒性最好)其基本模型定義為特徵空間上的間隔最大的線性分類器,其學習策略便是間隔最大化,最終可轉化為一個凸二次規劃問題的求解。 分析:超平面可以由以下方程確定 b為超平面和原點之間的距離,wT決定超平面的方向。樣

機器學習支援向量(Support Vector Machines)

支援向量機(Support Vector Machines, SVM)是一種二分類模型,其基本模型是定義在特徵空間上的間隔最大的線性分類器。支援向量機的學習策略就是間隔最大化。 間隔最大化的直觀解釋是:對訓練資料集找到幾何間隔最大的超平面意味著以充分大的卻確信度對訓練資料進

Spark中元件Mllib的學習28支援向量SVM-方法1

支援向量機(Support Vector Machine,SVM)是Corinna Cortes和Vapnik等於1995年首先提出的,它在解決小樣本、非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函式擬合等其他機器學習問題中。 SVM的

支援向量原理(理解SVM的三層境界)

 支援向量機通俗導論(理解SVM的三層境界) 作者:July 。致謝:pluskid、白石、JerryLead。 說明:本文最初寫於2012年6月,而後不斷反反覆覆修改&優化,修改次數達上百次,最後修改於2016年11月。 宣告:

cs229學習筆記支援向量

函式距離和幾何距離 設特徵和類標籤分別為x,y∈{−1,1},定義分類器hw,b(x)=g(wTx+b),g(z)={1−1z≥0z<0 函式距離 給定訓練樣本(x(i),y(i)),則函式距離r^(i)=y(i)(wTx(i)+b) 如果y(

SVM支援向量原理(二) 線性支援向量的軟間隔最大化模型

在支援向量機原理(一) 線性支援向量機中,我們對線性可分SVM的模型和損失函式優化做了總結。最後我們提到了有時候不能線性可分的原因是線性資料集裡面多了少量的異常點,由於這些異常點導致了資料集不能線性可分,本篇就對線性支援向量機如何處理這些異常點的原理方法做一個總結。 1

基於慣性大水滴滴水演算法支援向量的粘連字元驗證碼識別

這幾天閒來無事,在等雅思成績出來的過程中,只能寫點東西來打發時間。剛好在上影象處理這門課,於是就想寫個驗證碼識別,普通的驗證碼識別難度太低,於是想要做粘連扭曲的驗證碼識別,如12306的驗證碼識別,此外,這個演算法同樣也可以適用於手寫體識別,反而我覺得手寫體比12306的驗