SVM介紹
SVM支持向量機(jī)(英文全稱:support vector machine)是一個(gè)分類算法枪狂,通過找到一個(gè)分類平面危喉, 將數(shù)據(jù)分隔在平面兩側(cè), 從而達(dá)到分類的目的州疾。
SVM算法是有監(jiān)督的數(shù)據(jù)挖掘算法辜限,是一種二分類算法(經(jīng)過改造后也可以用于多分類,但比較復(fù)雜), 在非線性分類方面有明顯優(yōu)勢(shì)严蓖;通常SVM用于二元分類問題薄嫡,對(duì)于多元分類通常將其分解為多個(gè)二元分類問題,再進(jìn)行分類
SVM應(yīng)用場(chǎng)景
SVM(支持向量機(jī))主要用于分類問題颗胡,主要的應(yīng)用場(chǎng)景有字符識(shí)別毫深、面部識(shí)別、行人檢測(cè)毒姨、文本分類等領(lǐng)域哑蔫,在機(jī)器學(xué)習(xí)領(lǐng)域,支持向量機(jī)SVM(Support Vector Machine)是一個(gè)有監(jiān)督的學(xué)習(xí)模型弧呐,通常用來進(jìn)行模式識(shí)別鸳址、分類(異常值檢測(cè))以及回歸分析。
SVM算法思想:
它分類的基本思想是利用最大間隔進(jìn)行分類泉懦,處理非線性問題是通過核函數(shù)將特征向量映射到高維空間稿黍,從而變成線性可分的,但是運(yùn)算卻是在低維空間運(yùn)行的崩哩⊙睬颍考慮到數(shù)據(jù)中可能存在噪音,還引入了松弛變量酣栈。
一個(gè)普通的SVM就是一條直線罷了,用來完美劃分linearly separable的兩類矿筝。但這又不是一條普通的直線,這是無數(shù)條可以分類的直線當(dāng)中最完美的窖维,因?yàn)樗『迷趦蓚€(gè)類的中間榆综,距離兩個(gè)類的點(diǎn)都一樣遠(yuǎn)。而所 謂的Support vector就是這些離分界線最近的『點(diǎn)』鼻疮。如果去掉這些點(diǎn)琳轿,直線多半是要改變位置的
如下圖所示判沟, 直線表示的是訓(xùn)練出的一個(gè)分類平面, 將數(shù)據(jù)有效的分隔開崭篡。
說個(gè)直觀的解釋挪哄,比如現(xiàn)在有蘋果和香蕉散亂地放在桌子上琉闪,如何一刀砍下,刀的一側(cè)只有蘋果塘偎,另一邊只有香蕉呢拿霉?(二分類的思想)
這時(shí)候小明放學(xué)回來了,小明想吃蘋果不想吃香蕉涵防,于是乎小明猛拍桌子,蘋果和香蕉彈向空中壮池,彈在空中的某個(gè)時(shí)刻杀怠,蘋果在一個(gè)區(qū)域、梨在另一個(gè)區(qū)域赔退,這時(shí)候小明在它們之間迅速劃了一刀证舟,任務(wù)完成窗骑!蘋果和香蕉就分開了
大概就是這個(gè)流程,數(shù)學(xué)原理有點(diǎn)復(fù)雜(至今不太懂)抵知,只是概略地講一下软族,聽說SVM的原理寫細(xì)了可以寫本書(有出版的書)
SVM模型訓(xùn)練
模型訓(xùn)練成功后,根據(jù)support vector(一組向量)對(duì)后續(xù)向量進(jìn)行分類互订;
輸入輸出:模型輸入的是一堆向量(一般是-1~1之間的浮點(diǎn)數(shù)),以及這些向量所屬的分類label(一般用-1仰禽,1表示)氮墨;模型訓(xùn)練是要調(diào)整的內(nèi)容:核函數(shù)吐葵、核函數(shù)的參數(shù)、松弛變量等猛铅,取決于算法實(shí)現(xiàn)的情況
使用sklearn 實(shí)現(xiàn)支持向量機(jī)(SVM)
(1)簡單的預(yù)測(cè)
測(cè)試數(shù)據(jù)我們給出三個(gè)點(diǎn):(2,0)(1,1)(2,3),前兩個(gè)點(diǎn)我們分為一類凤藏,第三個(gè)點(diǎn)事另一類可以記為(0,0,1)±醪耍看代碼
#coding:utf8
#導(dǎo)入svm的庫
from sklearn import svm
x = [[2, 0], [1, 1], [2, 3]]
y = [0, 0, 1] #對(duì)應(yīng)x的分類標(biāo)記
clf = svm.SVC(kernel= 'linear') #線性核函數(shù)
clf.fit(x, y)
print (clf)
print (clf.support_vectors_ ) #支持向量
print (clf.support_ ) #支持向量是哪幾個(gè)(下標(biāo))
print (clf.n_support_) #每一類中有幾個(gè)支持向量
'''
print (clf.predict([0, 1])) #測(cè)試數(shù)據(jù)
ValueError: Expected 2D array, got 1D array instead:
array=[0. 1.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
'''
print (clf.predict([[0, 1]])) #測(cè)試數(shù)據(jù)
print("########################################\n")
輸出結(jié)果
結(jié)果輸出:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto', kernel='linear',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
[[1. 1.]
[2. 3.]]
[1 2]
[1 1]
[0]
(2)復(fù)雜一些的預(yù)測(cè)
下面我們做一個(gè)復(fù)雜點(diǎn)的例子蹄梢,我們來隨機(jī)生成兩類點(diǎn),進(jìn)行SVM的建模然后我們?cè)诋嫴贾挟嫵鲞@個(gè)模型圖而咆。
訓(xùn)練集:隨機(jī)生成正太分布的點(diǎn)幕袱,20個(gè)小于0的 20個(gè)大于0的數(shù)。
代碼如下:
import numpy as np
import pylab as pl
#生成隨機(jī)點(diǎn)數(shù)據(jù)集
np.random.seed(0) #固定隨機(jī)值
x = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
y = [0] *20 +[1] * 20
print(x)
print(y)
clf2 = svm.SVC(kernel='linear')
clf2.fit(x, y)
print(clf2.support_)
至此為止涯捻,模型已經(jīng)建完,開始繪圖
#畫出散點(diǎn)圖
#畫出支持向量的點(diǎn)汰瘫,參數(shù):x,y趴乡,大小
pl.scatter(clf2.support_vectors_[:,0],clf2.support_vectors_[:,1],s=80)
#畫出全部的點(diǎn)蝗拿,參數(shù):x,y哀托,顏色,colormap胖齐,形狀
pl.scatter(x[:,0],x[:,1],c=y,cmap=pl.cm.Paired,marker='o')
pl.axis('tight')
#pl.savefig("dd") 保存繪圖
pl.show()
結(jié)果輸出
[[-0.23594765 -1.59984279]
[-1.02126202 0.2408932 ]
[-0.13244201 -2.97727788]
[-1.04991158 -2.15135721]
[-2.10321885 -1.5894015 ]
[-1.85595643 -0.54572649]
[-1.23896227 -1.87832498]
[-1.55613677 -1.66632567]
[-0.50592093 -2.20515826]
[-1.6869323 -2.85409574]
[-4.55298982 -1.3463814 ]
[-1.1355638 -2.74216502]
[ 0.26975462 -3.45436567]
[-1.95424148 -2.18718385]
[-0.46722079 -0.53064123]
[-1.84505257 -1.62183748]
[-2.88778575 -3.98079647]
[-2.34791215 -1.84365103]
[-0.76970932 -0.79762015]
[-2.38732682 -2.30230275]
[ 0.95144703 0.57998206]
[ 0.29372981 3.9507754 ]
[ 1.49034782 1.5619257 ]
[ 0.74720464 2.77749036]
[ 0.38610215 1.78725972]
[ 1.10453344 2.3869025 ]
[ 1.48919486 0.81936782]
[ 1.97181777 2.42833187]
[ 2.06651722 2.3024719 ]
[ 1.36567791 1.63725883]
[ 1.32753955 1.64044684]
[ 1.18685372 0.2737174 ]
[ 2.17742614 1.59821906]
[ 0.36980165 2.46278226]
[ 1.09270164 2.0519454 ]
[ 2.72909056 2.12898291]
[ 3.13940068 0.76517418]
[ 2.40234164 1.31518991]
[ 1.12920285 1.42115034]
[ 1.68844747 2.05616534]]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[ 1 14 20]
暫時(shí)先說到這里呀伙,如有理解的不正確的地方添坊,歡迎批評(píng)指正
end