1. 程式人生 > >用Python開始機器學習(8:SVM支援向量機)

用Python開始機器學習(8:SVM支援向量機)

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開始機器學習8SVM支援向量

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開始機器學習4KNN分類演算法 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開始機器學習4KNN分類演算法

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

機器學習7SVM(支援向量)

支援向量機 優化目標 大間距分類器 數學原理 核函式一 核函式二 使用 優化目標 對於邏輯迴歸的假設函式而言,在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實現方法之一)最大化支援向量到分隔面的距離,這樣當新樣本點進來時,其被分類正確的概率