Python機器學(xué)習(xí)之SVM支持向量機
SVM支持向量機是建立于統(tǒng)計學(xué)習(xí)理論上的一種分類算法,適合與處理具備高維特征的數(shù)據(jù)集。
SVM算法的數(shù)學(xué)原理相對比較復(fù)雜,好在由于SVM算法的研究與應(yīng)用如此火爆,CSDN博客里也有大量的好文章對此進(jìn)行分析,下面給出幾個本人認(rèn)為講解的相當(dāng)不錯的:
支持向量機通俗導(dǎo)論(理解SVM的3層境界)
JULY大牛講的是如此詳細(xì),由淺入深層層推進(jìn),以至于關(guān)于SVM的原理,我一個字都不想寫了。。強烈推薦。
還有一個比較通俗的簡單版本的:手把手教你實現(xiàn)SVM算法
SVN原理比較復(fù)雜,但是思想很簡單,一句話概括,就是通過某種核函數(shù),將數(shù)據(jù)在高維空間里尋找一個最優(yōu)超平面,能夠?qū)深悢?shù)據(jù)分開。
針對不同數(shù)據(jù)集,不同的核函數(shù)的分類效果可能完全不一樣??蛇x的核函數(shù)有這么幾種:
線性函數(shù):形如K(x,y)=x*y這樣的線性函數(shù);
多項式函數(shù):形如K(x,y)=[(x·y)+1]^d這樣的多項式函數(shù);
徑向基函數(shù):形如K(x,y)=exp(-|x-y|^2/d^2)這樣的指數(shù)函數(shù);
Sigmoid函數(shù):就是上一篇文章中講到的Sigmoid函數(shù)。
我們就利用之前的幾個數(shù)據(jù)集,直接給出Python代碼,看看運行效果:
測試1:身高體重數(shù)據(jù)
# -*- coding: utf-8 -*- import numpy as np import scipy as sp from sklearn import svm from sklearn.cross_validation import train_test_split import matplotlib.pyplot as plt data = [] labels = [] with open("data\\1.txt") as ifile: for line in ifile: tokens = line.strip().split(' ') data.append([float(tk) for tk in tokens[:-1]]) labels.append(tokens[-1]) x = np.array(data) labels = np.array(labels) y = np.zeros(labels.shape) y[labels=='fat']=1 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.0) h = .02 # create a mesh to plot in x_min, x_max = x_train[:, 0].min() - 0.1, x_train[:, 0].max() + 0.1 y_min, y_max = x_train[:, 1].min() - 1, x_train[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) ''''' SVM ''' # title for the plots titles = ['LinearSVC (linear kernel)', 'SVC with polynomial (degree 3) kernel', 'SVC with RBF kernel', 'SVC with Sigmoid kernel'] clf_linear = svm.SVC(kernel='linear').fit(x, y) #clf_linear = svm.LinearSVC().fit(x, y) clf_poly = svm.SVC(kernel='poly', degree=3).fit(x, y) clf_rbf = svm.SVC().fit(x, y) clf_sigmoid = svm.SVC(kernel='sigmoid').fit(x, y) for i, clf in enumerate((clf_linear, clf_poly, clf_rbf, clf_sigmoid)): answer = clf.predict(np.c_[xx.ravel(), yy.ravel()]) print(clf) print(np.mean( answer == y_train)) print(answer) print(y_train) plt.subplot(2, 2, i + 1) plt.subplots_adjust(wspace=0.4, hspace=0.4) # Put the result into a color plot z = answer.reshape(xx.shape) plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8) # Plot also the training points plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired) plt.xlabel(u'身高') plt.ylabel(u'體重') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) plt.xticks(()) plt.yticks(()) plt.title(titles[i]) plt.show()
運行結(jié)果如下:
可以看到,針對這個數(shù)據(jù)集,使用3次多項式核函數(shù)的SVM,得到的效果最好。
測試2:影評態(tài)度
下面看看SVM在康奈爾影評數(shù)據(jù)集上的表現(xiàn):(代碼略)
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='linear', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
0.814285714286
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='poly', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)
0.492857142857
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)
0.492857142857
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='sigmoid', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
0.492857142857
可見在該數(shù)據(jù)集上,線性分類器效果最好。
測試3:圓形邊界
最后我們測試一個數(shù)據(jù)分類邊界為圓形的情況:圓形內(nèi)為一類,原型外為一類。看這類非線性的數(shù)據(jù)SVM表現(xiàn)如何:
測試數(shù)據(jù)生成代碼如下所示:
''''' 數(shù)據(jù)生成 ''' h = 0.1 x_min, x_max = -1, 1 y_min, y_max = -1, 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) n = xx.shape[0]*xx.shape[1] x = np.array([xx.T.reshape(n).T, xx.reshape(n)]).T y = (x[:,0]*x[:,0] + x[:,1]*x[:,1] < 0.8) y.reshape(xx.shape) x_train, x_test, y_train, y_test\ = train_test_split(x, y, test_size = 0.2)
測試結(jié)果如下:
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='linear', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
0.65
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='poly', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
0.675
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
0.9625
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, kernel='sigmoid', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
0.65
可以看到,對于這種邊界,徑向基函數(shù)的SVM得到了近似完美的分類結(jié)果。而其他的分類器顯然束手無策。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用email模塊對郵件進(jìn)行編碼和解碼的實例教程
Python中我們一般使用SMTP模塊來首發(fā)郵件,而用email模塊來處理郵件編碼,本文我們就來詳細(xì)看一下Python使用email模塊對郵件進(jìn)行編碼和解碼的實例教程,需要的朋友可以參考下2016-07-07python Django批量導(dǎo)入不重復(fù)數(shù)據(jù)
這篇文章主要介紹了python Django批量導(dǎo)入不重復(fù)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-03-03Python Django2 model 查詢介紹(條件、范圍、模糊查詢)
這篇文章主要介紹了Python Django2 model 查詢介紹(條件、范圍、模糊查詢),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Django 實現(xiàn)外鍵去除自動添加的后綴‘_id’
今天小編就為大家分享一篇Django 實現(xiàn)外鍵去除自動添加的后綴‘_id’,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11python實現(xiàn)銀行實戰(zhàn)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)銀行實戰(zhàn)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-02-02