人工智能學習---SVM算法編程練習

一.什麼是SVM?

Svm(support Vector Mac)又稱爲支持向量機,是一種二分類的模型。當然如果進行修改之後也是可以用於多類別問題的分類。支持向量機可以分爲線性核非線性兩大類。其主要思想爲找到空間中的一個更夠將所有數據樣本劃開的超平面,並且使得本本集中所有數據到這個超平面的距離最短。

二.Soft Margin SVM

鳶尾花數據集散點圖分佈:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
%matplotlib inline
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X [y<2,:2] #只取y<2的類別,也就是0 1 並且只取前兩個特徵
y = y[y<2] # 只取y<2的類別
# 分別畫出類別0和1的點
plt.scatter(X[y==0,0],X[y==0,1],color='red') 
plt.scatter(X[y==1,0],X[y==1,1],color='blue')
plt.show()
# 標準化
standardScaler = StandardScaler()
standardScaler.fit(X) #計算訓練數據的均值和方差
X_standard = standardScaler.transform(X) #再用scaler中的均值和方差來轉換X,使X標準化
svc = LinearSVC(C=1e9) #線性SVM分類器
svc.fit(X_standard,y) # 訓練svm

在這裏插入圖片描述

LinearSVC(C=1000000000.0, class_weight=None, dual=True, fit_intercept=True,
          intercept_scaling=1, loss='squared_hinge', max_iter=1000,
          multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
          verbose=0)

繪製決策邊界:

def plot_decision_boundary(model, axis):
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
        np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
    from matplotlib.colors import ListedColormap
    custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
# 繪製決策邊界
plot_decision_boundary(svc,axis=[-3,3,-3,3]) # x,y軸都在-3到3之間
# 繪製原始數據即散點圖
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='red') 
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='blue')
plt.show()

在這裏插入圖片描述

三.多項式與核函數

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
#月亮數據集
X, y = datasets.make_moons() #使用生成的數據
print(X.shape) # (100,2)
print(y.shape) # (100,)
plt.scatter(X[y==0,0],X[y==0,1]) 
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

(100, 2)
(100,)

在這裏插入圖片描述

加入噪聲點:

X, y = datasets.make_moons(noise=0.05,random_state=777) #隨機生成噪聲點,random_state是隨機種子,noise是方差
#分類
plt.scatter(X[y==0,0],X[y==0,1]) 
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

在這裏插入圖片描述
多項式特徵的SVM進行分類:

from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
def PolynomialSVC(degree,C=1.0):
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),#生成多項式
        ("std_scaler",StandardScaler()),#標準化
        ("linearSVC",LinearSVC(C=C))#最後生成svm
    ])
poly_svc = PolynomialSVC(degree=3)
poly_svc.fit(X,y)
plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1]) 
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

D:\Program Files (x86)\anaconda\lib\site-packages\ipykernel_launcher.py:11: UserWarning: The following kwargs were not used by contour: 'linewidth'
  # This is added back by InteractiveShellApp.init_path()

在這裏插入圖片描述

核技巧來對數據進行處理:

from sklearn.svm import SVC
def PolynomialKernelSVC(degree,C=1.0):
    return Pipeline([
        ("std_scaler",StandardScaler()),
        ("kernelSVC",SVC(kernel="poly")) # poly代表多項式特徵
    ])
poly_kernel_svc = PolynomialKernelSVC(degree=3)
poly_kernel_svc.fit(X,y)
plot_decision_boundary(poly_kernel_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1]) 
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

在這裏插入圖片描述

四.超參數γ

y爲100:

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
def RBFKernelSVC(gamma=1.0):
    return Pipeline([
        ('std_scaler',StandardScaler()),
        ('svc',SVC(kernel='rbf',gamma=gamma))
    ])
svc = RBFKernelSVC(100)
svc.fit(X,y)
plot_decision_boundary(svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(X[y==0,0],X[y==0,1]) 
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章