SVM算法的理解及其Python實(shí)現(xiàn)多分類(lèi)和二分類(lèi)問(wèn)題
原理
SVM被提出于1964年,在二十世紀(jì)90年代后得到快速發(fā)展并衍生出一系列改進(jìn)和擴(kuò)展算法,在人像識(shí)別、文本分類(lèi)等模式識(shí)別(pattern recognition)問(wèn)題中有得到應(yīng)用。
支持向量機(jī)(Support Vector Machine, SVM)是一類(lèi)按監(jiān)督學(xué)習(xí)(supervised learning) 方式對(duì)數(shù)據(jù)進(jìn)行二元分類(lèi)的廣義線性分類(lèi)器(generalized linear classifier),其決策邊界是對(duì)學(xué)習(xí)樣本求解的最大邊距超平面(maximum-margin hyperplane)
SVM可以通過(guò)核方法(kernel method)進(jìn)行非線性分類(lèi),是常見(jiàn)的核學(xué)習(xí)(kernel learning)方法之一。
分類(lèi)理論
在分類(lèi)問(wèn)題中給定輸入數(shù)據(jù)和學(xué)習(xí)目標(biāo):X = { X1, X2,…Xn },Y = { y1,y2,…yn}。
其中輸入數(shù)據(jù)的每個(gè)樣本都包含多個(gè)特征并由此構(gòu)成特征空間(feature space):Xi = { x1,x2…xn} ,而學(xué)習(xí)目標(biāo)為二元變量 y { − 1 , 1 } y\{-1,1\} y{−1,1}表示負(fù)類(lèi)(negative class)和正類(lèi)(positive class)。
若輸入數(shù)據(jù)所在的特征空間存在作為決策邊界(decision boundary)的超平面將學(xué)習(xí)目標(biāo)按正類(lèi)和負(fù)類(lèi)分開(kāi),并使任意樣本的點(diǎn)到平面距離大于等于1,則稱(chēng)該分類(lèi)問(wèn)題具有線性可分性,參數(shù) w,b分別為超平面的法向量和截距。
滿足該條件的決策邊界實(shí)際上構(gòu)造了2個(gè)平行的超平面作為間隔邊界以判別樣本的分類(lèi):
所有在上間隔邊界上方的樣本屬于正類(lèi),在下間隔邊界下方的樣本屬于負(fù)類(lèi)。
兩個(gè)間隔邊界的距離 d = 2 ∥ w ∥ d=\frac{2}{\|w\|} d=∥w∥2?被定義為邊距(margin),位于間隔邊界上的正類(lèi)和負(fù)類(lèi)樣本為支持向量(support vector)。
確定最大間距
SVM多分類(lèi)
SVM算法最初是為二值分類(lèi)問(wèn)題設(shè)計(jì)的,當(dāng)處理多類(lèi)問(wèn)題時(shí),就需要構(gòu)造合適的多類(lèi)分類(lèi)器。
目前,構(gòu)造SVM多類(lèi)分類(lèi)器的方法主要有兩類(lèi):
- 一類(lèi)是直接法,直接在目標(biāo)函數(shù)上進(jìn)行修改,將多個(gè)分類(lèi)面的參數(shù)求解合并到一個(gè)最優(yōu)化問(wèn)題中,通過(guò)求解該最優(yōu)化問(wèn)題“一次性”實(shí)現(xiàn)多類(lèi)分類(lèi)。這種方法看似簡(jiǎn)單,但其計(jì)算復(fù)雜度比較高,實(shí)現(xiàn)起來(lái)比較困難,只適合用于小型問(wèn)題中;
- 另一類(lèi)是間接法,主要是通過(guò)組合多個(gè)二分類(lèi)器來(lái)實(shí)現(xiàn)多分類(lèi)器的構(gòu)造,常見(jiàn)的方法有one-against-one和one-against-all兩種。
a.一對(duì)多法(one-versus-rest,簡(jiǎn)稱(chēng)1-v-r-SVMs)。
- 訓(xùn)練時(shí)依次把某個(gè)類(lèi)別的樣本歸為一類(lèi),其他剩余的樣本歸為另一類(lèi),這樣k個(gè)類(lèi)別的樣本就構(gòu)造出了k個(gè)SVM。分類(lèi)時(shí)將未知樣本分類(lèi)為具有最大分類(lèi)函數(shù)值的那類(lèi)。
b.一對(duì)一法(one-versus-one,簡(jiǎn)稱(chēng)1-v-1 SVMs)。
- 其做法是在任意兩類(lèi)樣本之間設(shè)計(jì)一個(gè)SVM,因此k個(gè)類(lèi)別的樣本就需要設(shè)計(jì)k(k-1)/2個(gè)SVM。當(dāng)對(duì)一個(gè)未知樣本進(jìn)行分類(lèi)時(shí),最后得票最多的類(lèi)別即為該未知樣本的類(lèi)別。Libsvm中的多類(lèi)分類(lèi)就是根據(jù)這個(gè)方法實(shí)現(xiàn)的。
Python實(shí)現(xiàn)
多分類(lèi)
X_train, X_test, y_train, y_test = train_test_split(feature, label, test_size=.2,random_state=0) # 訓(xùn)練模型 model = OneVsRestClassifier(svm.SVC(kernel='linear',probability=True,random_state=random_state)) print("[INFO] Successfully initialize a new model !") print("[INFO] Training the model…… ") clt = model.fit(X_train,y_train) print("[INFO] Model training completed !") # 保存訓(xùn)練好的模型,下次使用時(shí)直接加載就可以了 joblib.dump(clt,"F:/python/model/conv_19_80%.pkl") print("[INFO] Model has been saved !") y_test_pred = clt.predict(X_test) ov_acc = metrics.accuracy_score(y_test_pred,y_test) print("overall accuracy: %f"%(ov_acc)) print("===========================================") acc_for_each_class = metrics.precision_score(y_test,y_test_pred,average=None) print("acc_for_each_class:\n",acc_for_each_class) print("===========================================") avg_acc = np.mean(acc_for_each_class) print("average accuracy:%f"%(avg_acc))
二分類(lèi)
>>> import numpy as np >>> X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]]) >>> y = np.array([1, 1, 2, 2]) >>> from sklearn.svm import SVC >>> clf = SVC() >>> clf.fit(X, y) SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape='ovr', degree=3, gamma='auto', kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False) >>> print(clf.predict([[-0.8, -1]])) [1]
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python中import導(dǎo)入上一級(jí)目錄模塊及循環(huán)import問(wèn)題的解決
Python中的import語(yǔ)句導(dǎo)入模塊相信大家再熟悉不過(guò)了,這里我們會(huì)來(lái)講解Python中import導(dǎo)入上一級(jí)目錄模塊及循環(huán)import問(wèn)題的解決,需要的朋友可以參考下2016-06-06Python實(shí)現(xiàn)冒泡,插入,選擇排序簡(jiǎn)單實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)冒泡,插入,選擇排序簡(jiǎn)單實(shí)例,很適合Python初學(xué)者學(xué)習(xí)參考之用,需要的朋友可以參考下2014-08-08python將matplotlib嵌入到tkinter中的步驟詳解
tkinter是Python標(biāo)準(zhǔn)庫(kù)中自帶的GUI工具,使用十分方便,如能將matplotlib嵌入到tkinter中,就可以做出相對(duì)專(zhuān)業(yè)的數(shù)據(jù)展示系統(tǒng),很有競(jìng)爭(zhēng)力,本文就給大家介紹python將matplotlib嵌入到tkinter中的方法步驟,需要的朋友可以參考下2023-08-08python QT界面關(guān)閉線程池的線程跟隨退出完美解決方案
這篇文章主要介紹了python QT界面關(guān)閉,線程池的線程跟隨退出解決思路方法,本文給大家分享兩種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11如何利用Python實(shí)現(xiàn)簡(jiǎn)單C++程序范圍分析
這篇文章主要介紹了如何利用Python實(shí)現(xiàn)簡(jiǎn)單C++程序范圍分析,文章以舉例說(shuō)明及過(guò)程實(shí)現(xiàn)思路的方式展開(kāi)講解,具有一定的的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-02-02python解析xml文件方式(解析、更新、寫(xiě)入)
這篇文章主要介紹了python解析xml文件方式(解析、更新、寫(xiě)入),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03