用Python開始機器學習(8:SVM支援向量機)
SVM演算法的數學原理相對比較複雜,好在由於SVM演算法的研究與應用如此火爆,CSDN部落格裡也有大量的好文章對此進行分析,下面給出幾個本人認為講解的相當不錯的:
支援向量機通俗導論(理解SVM的3層境界):http://blog.csdn.net/v_july_v/article/details/7624837
JULY大牛講的是如此詳細,由淺入深層層推進,以至於關於SVM的原理,我一個字都不想寫了。。強烈推薦。
SVN原理比較複雜,但是思想很簡單,一句話概括,就是通過某種核函式,將資料在高維空間裡尋找一個最優超平面,能夠將兩類資料分開。
針對不同資料集,不同的核函式的分類效果可能完全不一樣。可選的核函式有這麼幾種:
線性函式:形如K(x,y)=x*y這樣的線性函式;
多項式函式:形如K(x,y)=[(x·y)+1]^d這樣的多項式函式;
徑向基函式:形如K(x,y)=exp(-|x-y|^2/d^2)這樣的指數函式;
Sigmoid函式:就是上一篇文章中講到的Sigmoid函式。
我們就利用之前的幾個資料集,直接給出Python程式碼,看看執行效果:
測試1:身高體重資料
執行結果如下:# -*- 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()
可以看到,針對這個資料集,使用3次多項式核函式的SVM,得到的效果最好。
測試2:影評態度
下面看看SVM在康奈爾影評資料集上的表現:(程式碼略)
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
可見在該資料集上,線性分類器效果最好。
測試3:圓形邊界
最後我們測試一個數據分類邊界為圓形的情況:圓形內為一類,原型外為一類。看這類非線性的資料SVM表現如何:
測試資料生成程式碼如下所示:
''' 資料生成 '''
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)
測試結果如下: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
可以看到,對於這種邊界,徑向基函式的SVM得到了近似完美的分類結果。而其他的分類器顯然束手無策。
相關推薦
用Python開始機器學習(8:SVM支援向量機)
SVM支援向量機是建立於統計學習理論上的一種分類演算法,適合與處理具備高維特徵的資料集。SVM演算法的數學原理相對比較複雜,好在由於SVM演算法的研究與應用如此火爆,CSDN部落格裡也有大量的好文章對此進行分析,下面給出幾個本人認為講解的相當不錯的:支援向量機通俗導論(理解S
用Python開始機器學習(3:資料擬合與廣義線性迴歸)
機器學習中的預測問題通常分為2類:迴歸與分類。簡單的說迴歸就是預測數值,而分類是給資料打上標籤歸類。本文講述如何用Python進行基本的資料擬合,以及如何對擬合結果的誤差進行分析。本例中使用一個2次函式加上隨機的擾動來生成500個點,然後嘗試用1、2、100次方的多項式對該資
用Python開始機器學習(10:聚類演算法之K均值)
我們之前接觸的所有機器學習演算法都有一個共同特點,那就是分類器會接受2個向量:一個是訓練樣本的特徵向量X,一個是樣本實際所屬的型別向量Y。由於訓練資料必須指定其真實分類結果,因此這種機器學習統稱為有監督學習。然而有時候,我們只有訓練樣本的特徵,而對其型別一無所知。這種情況,我
用Python開始機器學習(5:文字特徵抽取與向量化)
假設我們剛看完諾蘭的大片《星際穿越》,設想如何讓機器來自動分析各位觀眾對電影的評價到底是“贊”(positive)還是“踩”(negative)呢? 這類問題就屬於情感分析問題。這類問題處理的第一步,就是將文字轉換為特徵。 因此,這章我們只學習第一步,如何從文字中抽取特徵,並將其向量化。 由於中文的處理涉及
用Python開始機器學習(4:KNN分類演算法) sklearn做KNN演算法 python
http://blog.csdn.net/lsldd/article/details/41357931 1、KNN分類演算法 KNN分類演算法(K-Nearest-Neighbors Classification),又叫K近鄰演算法,是一個概念極其簡單,而分類效果又很優秀的
用Python開始機器學習(7:邏輯迴歸分類)
在本系列文章中提到過用Python開始機器學習(3:資料擬合與廣義線性迴歸)中提到過迴歸演算法來進行數值預測。邏輯迴歸演算法本質還是迴歸,只是其引入了邏輯函式來幫助其分類。實踐發現,邏輯迴歸在文字分類領域表現的也很優秀。現在讓我們來一探究竟。1、邏輯函式假設資料集有n個獨立的
用Python開始機器學習(5:文字特徵抽取與向量化) sklearn
http://blog.csdn.net/lsldd/article/details/41520953 假設我們剛看完諾蘭的大片《星際穿越》,設想如何讓機器來自動分析各位觀眾對電影的評價到底是“贊”(positive)還是“踩”(negative)呢? 這類問題就屬於情感分析問題。這類問題處理的第一步,就是
用Python開始機器學習(6:樸素貝葉斯分類器)
樸素貝葉斯分類器是一個以貝葉斯定理為基礎,廣泛應用於情感分類領域的優美分類器。本文我們嘗試使用該分類器來解決上一篇文章中影評態度分類。1、貝葉斯定理假設對於某個資料集,隨機變數C表示樣本為C類的概率,F1表示測試樣本某特徵出現的概率,套用基本貝葉斯公式,則如下所示:上式表示對
用Python開始機器學習(4:KNN分類演算法)
1、KNN分類演算法KNN分類演算法(K-Nearest-Neighbors Classification),又叫K近鄰演算法,是一個概念極其簡單,而分類效果又很優秀的分類演算法。他的核心思想就是,要確定測試樣本屬於哪一類,就尋找所有訓練樣本中與該測試樣本“距離”最近的前K個
機器學習技法筆記01-----SVM支援向量機
寫的文章發給老師看得到回覆裡面有:去看看機器學習基礎知識~ 最近,嗯,來一波機器學習基礎~ 特徵轉換(Feature Transforms)的三個方向: SVM:解決如何選擇特徵轉換以及複雜度的問題 A
機器學習實戰系列(五):SVM支援向量機
課程的所有資料和程式碼在我的Github:Machine learning in Action,目前剛開始做,有不對的歡迎指正,也歡迎大家star。除了 版本差異,程式碼裡的部分函式以及程式碼正規化也和原書不一樣(因為作者的程式碼實在讓人看的彆扭,我改過後看起來舒服多了)
機器學習總結(三):SVM支援向量機(面試必考)
基本思想:試圖尋找一個超平面來對樣本分割,把樣本中的正例和反例用超平面分開,並儘可能的使正例和反例之間的間隔最大。 演算法推導過程: (1)代價函式:假設正類樣本y =wTx+ b>=+1,負
python機器學習庫scikit-learn簡明教程之:SVM支援向量機
1.獲得樣例資料 scikit-learn庫有一些標準的資料集,例如分類的數字集,波士頓房價迴歸資料集。 在下面,我們啟動Python直譯器,然後載入資料集。我們可以認為,美元符號後輸入python然
吳恩達機器學習作業Python實現(六):SVM支援向量機
1 Support Vector Machines 1.1 Example Dataset 1 %matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot
機器學習7:SVM(支援向量機)
支援向量機 優化目標 大間距分類器 數學原理 核函式一 核函式二 使用 優化目標 對於邏輯迴歸的假設函式而言,在y=1的情況下,我們希望假設函式約等於1,且z遠大於0;在y=0的情況下,我們希望假設函式約等於
機器學習實戰【5】(SVM-支援向量機)
本部落格記錄《機器學習實戰》(MachineLearningInAction)的學習過程,包括演算法介紹和python實現。 SVM(支援向量機) SVM是一種分類演算法,通過對訓練集資料的分析找到最好的分隔平面,然後用該平面對新資料進行分類。本
[完]機器學習實戰 第六章 支援向量機(Support Vector Machine)
[參考] 機器學習實戰(Machine Learning in Action) 本章內容 支援向量機(Support Vector Machine)是最好的現成的分類器,“現成”指的是分類器不加修改即可直接使用。基本形式的SVM分類器就可得到低錯
機器學習 scikit-learn3 模型實踐 - 支援向量機和決策樹
支援向量機和決策樹 - 目錄 1 簡介 1.1 程式碼下載 1.2 程式碼使用方法 3 核心程式碼說明 3.1 模型配置 3.2 模型訓練 3.3 輸出結果 3.3.1 Linea
【機器學習基礎】軟間隔支援向量機
引言 在上一小節中,我們介紹了核支援向量機。於是,不管是簡單的問題還是複雜的問題,我們都可以做得到。 然而,像高斯核的方法太複雜了,可能造成過擬合的問題。導致過擬合的現象的原因有可能是你選擇特徵轉換太強大了,導致無法用最大間隔的方法控制模型的複雜度,還有一個
機器學習演算法及程式碼實現--支援向量機
機器學習演算法及程式碼實現–支援向量機 1、支援向量機 SVM希望通過N-1維的分隔超平面線性分開N維的資料,距離分隔超平面最近的點被叫做支援向量,我們利用SMO(SVM實現方法之一)最大化支援向量到分隔面的距離,這樣當新樣本點進來時,其被分類正確的概率