A. python怎麼實現opencv3 svm訓練模型保存和載入
在做模型訓練的時候,尤其是在訓練集上做交叉驗證,通常想要將模型保存下來,然後放到獨立的測試集上測試,下面介紹的是python中訓練模型的保存和再使用。
scikit-learn已經有了模型持久化的操作,導入joblib即可
from sklearn.externals import joblib
模型保存
>>> os.chdir("workspace/model_save")>>> from sklearn import svm>>> X = [[0, 0], [1, 1]]>>> y = [0, 1]>>> clf = svm.SVC()>>> clf.fit(X, y) >>> clf.fit(train_X,train_y)>>> joblib.mp(clf, "train_model.m")
通過joblib的mp可以將模型保存到本地,clf是訓練的分類器
模型從本地調回
>>> clf = joblib.load("train_model.m")
通過joblib的load方法,載入保存的模型。
然後就可以在測試集上測試了
clf.predit(test_X,test_y)
B. 如何利用python使用libsvm
一:libsvm包下載與使用:
LIBSVM是台灣大學林智仁(Lin Chih-Jen)副教授等開發設早凳乎計的一個簡單、易於使用和快速有效的SVM模式識別與回歸的軟體包,他不但提供了編譯好的可在Windows系列系統的執行文件,還提供了源代碼。
1.
把包解壓在C盤之中,如:C:\libsvm-3.18
2.
因為要用libsvm自帶的腳本grid.py和easy.py,需要去官網下載繪圖工具gnuplot,解壓到c盤
3.
進入c:\libsvm\tools目錄下,用文本編輯器(記事本,edit都可以)修改grid.py和easy.py兩個文件,找到其中關於gnuplot路徑的那項,根據實際路徑進行修改,並保存
4python與libsvm的連接(參考SVM學習筆記(2)LIBSVM在python下的使用 )
a.打開IDLE(python GUI),輸入
>>>import sys
>>>sys.version
如果你的python是32位,將出現如下字元:
『2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]』
這個時候LIBSVM的python介面設置將非常簡單粗如。在libsvm-3.16文件夾下的windows文件夾中找到動態鏈接庫陸悉libsvm.dll,將其添加到系統目錄,如`C:\WINDOWS\system32\』,即可在python中使用libsvm
b.如果你是64位的請參考文獻,請參考上述連接。
5.執行一個小例子
import os
os.chdir('C:\libsvm-3.18\python')#請根據實際路徑修改
from svmutil import *
y, x = svm_read_problem('../heart_scale')#讀取自帶數據
m = svm_train(y[:200], x[:200], '-c 4')
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)
##出現如下結果,應該是正確安裝了
optimization finished, #iter = 257
nu = 0.351161
obj = -225.628984, rho = 0.636110
nSV = 91, nBSV = 49
Total nSV = 91
Accuracy = 84.2857% (59/70) (classification)
C. 求python多元支持向量機多元回歸模型最後預測結果導出代碼、測試集與真實值R2以及對比圖代碼
這是一個多元支持向量機回歸的模型,以下是一個參考的實現代碼:
import numpy as npimport matplotlib.pyplot as pltfrom sklearn import svmfrom sklearn.metrics import r2_score
# 模擬數據
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - np.random.rand(16))
# 分割數據
train_X = X[:60]
train_y = y[:60]
test_X = X[60:]
test_y = y[60:]
# 模型訓練
model = svm.SVR(kernel='rbf', C=1e3, gamma=0.1)
model.fit(train_X, train_y)
# 預測結果
pred_y = model.predict(test_X)# 計算R2r2 = r2_score(test_y, pred_y)
# 對比圖
plt.scatter(test_X, test_y, color='darkorange', label='data')
plt.plot(test_X, pred_y, color='navy', lw=2, label='SVR model')
plt.title('R2={:.2f}'.format(r2))
plt.legend()
plt.show()
上面的代碼將數據分為訓練數據和測試數據,使用SVR模型對訓練數據進行訓練,然後對測試數據進行預測。計算預測結果與真實值的R2,最後將結果畫出對比圖,以評估模型的效果。
D. 如何利用 Python 實現 SVM 模型
我先直觀地闡述我對SVM的理解,這其中不會涉及數學公式,然後給出Python代碼。
SVM是一種二分類模型,處理的數據可以分為三類:
線性可分,通過硬間隔最大化,學習線性分類器
近似線性可分,通過軟間隔最大化,學習線性分類器
線性不可分,通過核函數以及軟間隔最大化,學習非線性分類器
線性分類器,在平面上對應直線;非線性分類器,在平面上對應曲線。
硬間隔對應於線性可分數據集,可以將所有樣本正確分類,也正因為如此,受雜訊樣本影響很大,不推薦。
軟間隔對應於通常情況下的數據集(近似線性可分或線性不可分),允許一些超平面附近的樣本被錯誤分類,從而提升了泛化性能。
如下圖:
我們可以看到,當支持向量太少,可能會得到很差的決策邊界。如果支持向量太多,就相當於每次都利用整個數據集進行分類,類似KNN。E. 求python支持向量機數據設置標簽代碼
以下是使用Python中的Scikit-learn庫實現支持向量機(SVM)模型的盯寬數據設置標簽代碼示例:
from sklearn import svm
# 假設有以下三個樣本的數據:
X = [[0, 0], [1, 1], [2, 2]]
y = [0, 1, 1] # 對應每個數據點的標簽,凱悔0表示負樣本,1表示正樣本
# 創建SVM模型
clf = svm.SVC()
# 將數據集(X)和標簽(y)作為訓練數據來訓練模型
clf.fit(X, y)
上述代碼中,X是一個二維數組,每個元素都代表一個數據點的特徵值,y是一凱孫亮個一維數組,每個元素都代表對應數據點的標簽。通過將X和y作為訓練數據,可以訓練SVM模型並得到分類結果。
F. python svm 怎麼訓練模型
支持向量機SVM(Support Vector Machine)是有監督的分類預測模型,本篇文章使用機器學習庫scikit-learn中的手寫數字數據集介紹使用Python對SVM模型進行訓練並對手寫數字進行識別的過程。
准備工作
手寫數字識別的原理是將數字的圖片分割為8X8的灰度值矩陣,將這64個灰度值作為每個數字的訓練集對模型進行訓練。手寫數字所對應的真實數字作為分類結果。在機器學習sklearn庫中已經包含了不同數字的8X8灰度值矩陣,因此我們首先導入sklearn庫自帶的datasets數據集。然後是交叉驗證庫,SVM分類演算法庫,繪制圖表庫等。
12345678910#導入自帶數據集from sklearn import datasets#導入交叉驗證庫from sklearn import cross_validation#導入SVM分類演算法庫from sklearn import svm#導入圖表庫import matplotlib.pyplot as plt#生成預測結果准確率的混淆矩陣from sklearn import metrics讀取並查看數字矩陣
從sklearn庫自帶的datasets數據集中讀取數字的8X8矩陣信息並賦值給digits。
12#讀取自帶數據集並賦值給digitsdigits = datasets.load_digits()查看其中的數字9可以發現,手寫的數字9以64個灰度值保存。從下面的8×8矩陣中很難看出這是數字9。
12#查看數據集中數字9的矩陣digits.data[9]以灰度值的方式輸出手寫數字9的圖像,可以看出個大概輪廓。這就是經過切割並以灰度保存的手寫數字9。它所對應的64個灰度值就是模型的訓練集,而真實的數字9是目標分類。我們的模型所要做的就是在已知64個灰度值與每個數字對應關系的情況下,通過對模型進行訓練來對新的手寫數字對應的真實數字進行分類。
1234#繪制圖表查看數據集中數字9的圖像plt.imshow(digits.images[9], cmap=plt.cm.gray_r, interpolation='nearest')plt.title('digits.target[9]')plt.show()
從混淆矩陣中可以看到,大部分的數字SVM的分類和預測都是正確的,但也有個別的數字分類錯誤,例如真實的數字2,SVM模型有一次錯誤的分類為1,還有一次錯誤分類為7。
G. 2020-05-22 第十三章 支持向量機模型(python)
SVM 是 Support Vector Machine 的簡稱,它的中文名為支持向量機,屬於一種有監督的機器學習演算法,可用於離散因變數的分類和連續因變數的預測。通常情況下,該演算法相對於其他單一的分類演算法(如 Logistic 回歸、決策樹、樸素貝葉斯、 KNN 等)會有更好的預測准確率,主要是因為它可以將低維線性不可分的空間轉換為高維的線性可分空間。
「分割帶」代表了模型劃分樣本點的能力或可信度,「分割帶」越寬,說明模型能夠將樣本點劃分得越清晰,進而保證模型泛化能力越強,分類的可信度越高;反之,「分割帶」越窄,說明模型的准確率越容易受到異常點的影響,進而理解為模型的預測能力越弱,分類的可信度越低。
線性可分的 所對應的函數間隔滿足 的條件,故 就等於 。所以,可以將目標函數 等價為如下的表達式:
假設存在一個需要最小化的目標函數 ,並且該目標函數同時受到 的約束。如需得到最優化的解,則需要利用拉格朗日對偶性將原始的最優化問題轉換為對偶問題,即:
分割面的求解
分割面的表達式
對於非線性SVM模型而言,需要經過兩個步驟,一個是將原始空間中的樣本點映射到高維的新空間中,另一個是在新空間中尋找一個用於識別各類別樣本點線性「超平面」。
假設原始空間中的樣本點為 ,將樣本通過某種轉換 映射到高維空間中,則非線性SVM模型的目標函數可以表示為:
其中,內積 可以利用核函數替換,即 。對於上式而言,同樣需要計算最優的拉格朗日乘積 ,進而可以得到線性「超平面」 與 的值:
假設原始空間中的兩個樣本點為 ,在其擴展到高維空間後,它們的內積 如果等於樣本點 在原始空間中某個函數的輸出,那麼該函數就稱為核函數。
線性核函數的表達式為 ,故對應的分割「超平面」為:
多項式核函數的表達式為 ,故對應的分割「超平面」為:
高斯核函數的表達式為 ,故對應的分割「超平面」為:
Sigmoid 核函數的表達式為 ,故對應的分割「超平面」為:
在實際應用中, SVM 模型對核函數的選擇是非常敏感的,所以需要通過先驗的領域知識或者交叉驗證的方法選出合理的核函數。大多數情況下,選擇高斯核函數是一種相對偷懶而有效的方法,因為高斯核是一種指數函數,它的泰勒展開式可以是無窮維的,即相當於把原始樣本點映射到高維空間中。
output_13_0.png