1,實現線性分類
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.svm import SVC
#隨機生成點,n_samples:樣本點個數;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函式還可以包括以下引數(具體例子見文章最後):
#1,C(C越大意味著分類越嚴格不能有錯誤;當C趨近於很小的時意味著可以有更大的錯誤容忍)
#2,kernel(kernel必須是[‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’]中的一個,預設為’rbf’)
#3,gamma(gamma越大模型越複雜,會導致過擬合,對線性核函式無影響)
model = SVC(kernel="linear")
model.fit(X,y)
plot_svc_decision_function(model)
這裡用到繪製邊界線及圈出支援向量的函式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)
#形成圖片上所有座標點(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_函式可打印出所有支援向量座標
ax.scatter(model.support_vectors_[:, 0],model.support_vectors_[:, 1],s=200,c="",edgecolors="k")
ax.set_xlim(xlim)
ax.set_ylim(ylim)
繪製效果圖如下:
2,實現非線性分類–引入核函式有時候線性核函式不能很好的劃分邊界比如:
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)
分類結果如下:
此時,需加入徑向基函式rbf(高斯)
clf = SVC(kernel="rbf", C=1E6)
clf.fit(X,y)
plot_svc_decision_function(clf)
希望您滿意,能幫助到您~~
1,實現線性分類
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.svm import SVC
#隨機生成點,n_samples:樣本點個數;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函式還可以包括以下引數(具體例子見文章最後):
#1,C(C越大意味著分類越嚴格不能有錯誤;當C趨近於很小的時意味著可以有更大的錯誤容忍)
#2,kernel(kernel必須是[‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’]中的一個,預設為’rbf’)
#3,gamma(gamma越大模型越複雜,會導致過擬合,對線性核函式無影響)
model = SVC(kernel="linear")
model.fit(X,y)
plot_svc_decision_function(model)
這裡用到繪製邊界線及圈出支援向量的函式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)
#形成圖片上所有座標點(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_函式可打印出所有支援向量座標
ax.scatter(model.support_vectors_[:, 0],model.support_vectors_[:, 1],s=200,c="",edgecolors="k")
ax.set_xlim(xlim)
ax.set_ylim(ylim)
繪製效果圖如下:
2,實現非線性分類–引入核函式有時候線性核函式不能很好的劃分邊界比如:
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)
分類結果如下:
此時,需加入徑向基函式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)
分類結果如下:
希望您滿意,能幫助到您~~