如何用Python實現(xiàn)支持向量機?
1,實現(xiàn)線性分類
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.svm import SVC
#隨機生成點,n_samples:樣本點個數(shù);centers:樣本點分為幾類;random_state:每次隨機生成一致;cluster_std:每類樣本點間的離散程度,值越大離散程度越大。
X,y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)
#畫出所有樣本點
plt.scatter(X[:,0],X[:,1],c=y,cmap='summer')
#使用線性分類SVC擬合
#svc函數(shù)還可以包括以下參數(shù)(具體例子見文章最后):
#1,C(C越大意味著分類越嚴(yán)格不能有錯誤;當(dāng)C趨近于很小的時意味著可以有更大的錯誤容忍)
#2,kernel(kernel必須是[‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’]中的一個,默認為’rbf’)
#3,gamma(gamma越大模型越復(fù)雜,會導(dǎo)致過擬合,對線性核函數(shù)無影響)
model = SVC(kernel='linear')
model.fit(X,y)
plot_svc_decision_function(model)
這里用到繪制邊界線及圈出支持向量的函數(shù)plot_svc_decision_function()
def plot_svc_decision_function(model, ax=None, plot_support=True):
#Plot the decision function for a 2D SVC
if ax is None:
ax = plt.gca()
#找出圖片x軸y軸的邊界
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# create grid to evaluate model
x = np.linspace(xlim[0], xlim[1], 30)
y = np.linspace(ylim[0], ylim[1], 30)
Y, X = np.meshgrid(y, x)
#形成圖片上所有坐標(biāo)點(900,2),900個二維點
xy = np.vstack([X.ravel(), Y.ravel()]).T
#計算每點到邊界的距離(30,30)
P = model.decision_function(xy).reshape(X.shape)
#繪制等高線(距離邊界線為0的實線,以及距離邊界為1的過支持向量的虛線)
ax.contour(X, Y, P, colors='k',levels=[-1, 0, 1], alpha=0.5,linestyles=['--', '-', '--'])
# 圈出支持向量
if plot_support:
#model.support_vectors_函數(shù)可打印出所有支持向量坐標(biāo)
ax.scatter(model.support_vectors_[:, 0],model.support_vectors_[:, 1],s=200,c='',edgecolors='k')
ax.set_xlim(xlim)
ax.set_ylim(ylim)
繪制效果圖如下:
2,實現(xiàn)非線性分類–引入核函數(shù)有時候線性核函數(shù)不能很好的劃分邊界比如:
from sklearn.datasets.samples_generator import make_circles
X,y = make_circles(100, factor=.1, noise=.1)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='summer')
clf = SVC(kernel='linear').fit(X, y)
plot_svc_decision_function(clf, plot_support=False)
分類結(jié)果如下:
此時,需加入徑向基函數(shù)rbf(高斯)
X,y = make_circles(100, factor=.1, noise=.1)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='summer')
clf = SVC(kernel='rbf', C=1E6)
clf.fit(X,y)
plot_svc_decision_function(clf)
分類結(jié)果如下:
希望您滿意,能幫助到您~~