機器學習 支援向量機SVM

2021-09-23 06:06:42 字數 3010 閱讀 3799

svm是一種監督學習演算法,主要用於分類、回歸、異常值檢測。目前應用於文字分類、手寫文字識別、影象分類、生物序列分析。 

支援向量機是一種通過某種非線性對映,把低維的非線性可分轉化為高維的線性可分,在高維空間進行線性分析的演算法。支援向量機(svm,support vector machine)是根據統計學習理論提出的一種新的學習方法,它的最大特點是根據結構風險最小化準則,以最大化分類間隔構造最優分類超平面來提高學習機的泛化能力,較好地解決了非線性、高維數、區域性極小點等問題。對於分類問題,支援向量機演算法根據區域中的樣本計算該區域的決策曲面,由此確定該區域中未知樣本的類別。

優點:在高維空間中有效;在維數大於樣本的情況下,仍然有效;泛化錯誤率低,計算開銷不大,結果易解釋。解決小樣本、非線性及高維模式識別問題中都表現出了許多特有的優勢。

缺點:對引數調節和核函式的選擇敏感,原始分類器不加修改僅適用於處理二類問題。

適用資料型別:數值型和標稱型資料。

呼叫:r:軟體包e1071 ,函式svm     python:模組from sklearn import svm     model = svm.svc()

svm首先通過核函式將特徵對映到乙個更高維的空間裡,變成線性可分,在其中建立最大間隔超平面,將資料分開;然後,在超平面兩邊再設立兩個互相平行的超平面;最後分隔超平面,使兩個平行超平面的距離最大化。svm假定平行超平面間的距離或差距越大,分類器的總誤差越小。

當我們在解決線性不可分的問題時,我們需要通過乙個對映函式,把樣本值對映到更高維的空間或者無窮維。在特徵空間中,我們對線性可分的新樣本使用前面提到過的求解線性可分的情況下的分類問題的方法時,需要計算樣本內積,但是因為樣本維數很高,容易造成「維數災難」,所以這裡我們就引入了核函式,把高維向量的內積轉變成了求低維向量的內積問題。(通過對映函式將樣本值對映高維空間,需計算樣本內積,但是容易出現維度災難。在特徵空間中,把高維向量的內積轉變成了求低維向量的內積問題,注:內積是可以衡量兩個向量的相似度的)。

核函式主要包括:線性核函式(linear主要用於線性可分的情形)、多項式核函式(polynomial)、徑向基核函式(高斯核函式rbf)、神經網路核函式。

各核函式的詳細講解可參考:

選取核函式解決實際問題時,通常採用的方法有:一是利用專家的先驗知識預先選定核函式;二是採用cross-validation方法(交叉驗證),即在進行核函式選取時,分別試用不同的核函式,歸納誤差最小的核函式就是最好的核函式.如針對傅利葉核、rbf核,結合訊號處理問題中的函式回歸問題,通過**實驗,對比分析了在相同資料條件下,採用傅利葉核的svm要比採用rbf核的svm誤差小很多。

#-*- coding: utf-8 -*-

import os

os.getcwd()

os.chdir("d:\\book\python\demo")

#....................資料抽樣**.....................

import pandas as pd

inputfile = 'data/moment.csv' #資料檔案

outputfile1 = 'tmp/cm_train.xls' #輸出測試資料

outputfile2 = 'tmp/cm_test.xls' #輸出檢驗資料

data = pd.read_csv(inputfile, encoding = 'gbk') #讀取資料,指定編碼為gbk

data = data.as_matrix()

from numpy.random import shuffle #引入隨機函式

shuffle(data) #隨機打亂資料

data_train = data[:int(0.8*len(data)), :] #選取前80%作為訓練資料

data_test = data[int(0.8*len(data)):, :] #選取後20%作為檢驗資料

##。。。。。。。。。。。。構建支援向量機模型**..............

#構造特徵和標籤

x_train = data_train[:, 2:]*30#放大特徵

y_train = data_train[:, 0].astype(int)

x_test = data_test[:, 2:]*30 #放大特徵

y_test = data_test[:, 0].astype(int)

#匯入模型相關的函式,建立並且訓練模型

from sklearn import svm

model = svm.svc()

model.fit(x_train, y_train)

import pickle

pickle.dump(model, open('../tmp/svm.model', 'wb'))

#model = pickle.load(open('../tmp/svm.model', 'rb'))

#匯入輸出相關的庫,生成混淆矩陣

from sklearn import metrics

cm_train = metrics.confusion_matrix(y_train, model.predict(x_train)) #訓練樣本的混淆矩陣

cm_test = metrics.confusion_matrix(y_test, model.predict(x_test)) #測試樣本的混淆矩陣

#儲存結果

pd.dataframe(cm_train, index = range(1, 6), columns = range(1, 6)).to_excel(outputfile1)

pd.dataframe(cm_test, index = range(1, 6), columns = range(1, 6)).to_excel(outputfile2)

機器學習 支援向量機 SVM

svm 方法的基本思想是 定義最優線性超平面,並把尋找最優線性超平面的演算法歸結為求解乙個凸規劃問題。進而基於 mercer 核展開定理,通過非線性對映 把樣本空間對映到乙個高維乃至於無窮維的特徵空間 hilbert 空間 使在特徵空間中可以應用線性學習機的方法解決樣本空間中的高度非線性分類和回歸等...

機器學習 支援向量機SVM

通俗詳見 要明白什麼是svm,便得從分類說起。分類作為資料探勘領域中一項非常重要的任務,它的目的是學會乙個分類函式或分類模型 或者叫做分類器 而支援向量機本身便是一種監督式學習的方法 至於具體什麼是監督學習與非監督學習,請參見此系列machine l data mining第一篇 它廣泛的應用於統計...

機器學習演算法 支援向量機SVM

在上兩節中,我們講解了機器學習的決策樹和k 近鄰演算法,本節我們講解另外一種分類演算法 支援向量機svm。svm是迄今為止最好使用的分類器之一,它可以不加修改即可直接使用,從而得到低錯誤率的結果。案例背景 從前有兩個地主,他們都是占山為王的一方霸主。本來各自吃飽自己的飯萬事無憂,可是人心不知足蛇吞象...