Python 支持向量機分類器的實現(xiàn)
支持向量機(Support Vector Machine, SVM)是一類按監(jiān)督學習(supervised learning)方式對數(shù)據(jù)進行二元分類的廣義線性分類器(generalized linear classifier),其決策邊界是對學習樣本求解的最大邊距超平面(maximum-margin hyperplane)
SVM使用鉸鏈損失函數(shù)(hinge loss)計算經(jīng)驗風險(empirical risk)并在求解系統(tǒng)中加入了正則化項以優(yōu)化結構風險(structural risk),是一個具有稀疏性和穩(wěn)健性的分類器。SVM可以通過核方法(kernel method)進行非線性分類,是常見的核學習(kernel learning)方法之一。
SVM被提出于1964年,在二十世紀90年代后得到快速發(fā)展并衍生出一系列改進和擴展算法,在人像識別、文本分類等模式識別(pattern recognition)問題中有得到應用。
import numpy as np
from scipy import io as spio
from matplotlib import pyplot as plt
from sklearn import svm
def SVM():
'''data1——線性分類'''
data1 = spio.loadmat('data1.mat')
X = data1['X']
y = data1['y']
y = np.ravel(y)
plot_data(X, y)
model = svm.SVC(C=1.0, kernel='linear').fit(X, y) # 指定核函數(shù)為線性核函數(shù)
plot_decisionBoundary(X, y, model) # 畫決策邊界
'''data2——非線性分類'''
data2 = spio.loadmat('data2.mat')
X = data2['X']
y = data2['y']
y = np.ravel(y)
plt = plot_data(X, y)
plt.show()
model = svm.SVC(gamma=100).fit(X, y) # gamma為核函數(shù)的系數(shù),值越大擬合的越好
plot_decisionBoundary(X, y, model, class_='notLinear') # 畫決策邊界
# 作圖
def plot_data(X, y):
plt.figure(figsize=(10, 8))
pos = np.where(y == 1) # 找到y(tǒng)=1的位置
neg = np.where(y == 0) # 找到y(tǒng)=0的位置
p1, = plt.plot(np.ravel(X[pos, 0]), np.ravel(X[pos, 1]), 'ro', markersize=8)
p2, = plt.plot(np.ravel(X[neg, 0]), np.ravel(X[neg, 1]), 'g^', markersize=8)
plt.xlabel("X1")
plt.ylabel("X2")
plt.legend([p1, p2], ["y==1", "y==0"])
return plt
# 畫決策邊界
def plot_decisionBoundary(X, y, model, class_='linear'):
plt = plot_data(X, y)
# 線性邊界
if class_ == 'linear':
w = model.coef_
b = model.intercept_
xp = np.linspace(np.min(X[:, 0]), np.max(X[:, 0]), 100)
yp = -(w[0, 0] * xp + b) / w[0, 1]
plt.plot(xp, yp, 'b-', linewidth=2.0)
plt.show()
else: # 非線性邊界
x_1 = np.transpose(np.linspace(np.min(X[:, 0]), np.max(X[:, 0]), 100).reshape(1, -1))
x_2 = np.transpose(np.linspace(np.min(X[:, 1]), np.max(X[:, 1]), 100).reshape(1, -1))
X1, X2 = np.meshgrid(x_1, x_2)
vals = np.zeros(X1.shape)
for i in range(X1.shape[1]):
this_X = np.hstack((X1[:, i].reshape(-1, 1), X2[:, i].reshape(-1, 1)))
vals[:, i] = model.predict(this_X)
plt.contour(X1, X2, vals, [0, 1], color='blue')
plt.show()
if __name__ == "__main__":
SVM()
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
分享python中matplotlib指定繪圖顏色的八種方式
這篇文章主要給大家分享的是python中matplotlib指定繪圖顏色的八種方式,在使用matplotlib的pyplot庫進行繪圖時,經(jīng)常會發(fā)現(xiàn)各種開源代碼指定“color”的方式并不一致,下面就向大家展示8種指定color的方式,需要的朋友可以參考一下2022-03-03
python+numpy按行求一個二維數(shù)組的最大值方法
今天小編就為大家分享一篇python+numpy按行求一個二維數(shù)組的最大值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python3 執(zhí)行系統(tǒng)命令并獲取實時回顯功能
這篇文章主要介紹了Python3 執(zhí)行系統(tǒng)命令并獲取實時回顯功能,文中通過兩種方法給大家介紹了Python執(zhí)行系統(tǒng)命令并獲得輸出的方法,需要的朋友可以參考下2019-07-07
Mac中PyCharm配置Anaconda環(huán)境的方法
這篇文章主要介紹了Mac中PyCharm配置Anaconda環(huán)境的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03

