真的很簡單的SVM,所以就不寫個啥了!
直接拿去用吧!
from sklearn import svm
from sklearn.datasets import make_blobs#make_blobes用來生產小型的聚類數據集
import matplotlib.pyplot as plt
import numpy as np
def plot_hyperplance(clf, X, y, h=0.02, draw_sv=True, title='hyperplan'):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))#生成網格點座標矩陣
plt.title(title)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())#設置座標軸刻度
plt.yticks(())
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])#ravel是對數組的扁平化,只是進行一個引用,嘗試改爲flatten,可以儘量避免出錯
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap='hot', alpha=0.5)#進行三維等高線圖繪製、並進行填充
makers = ['o', 's', '^']
colors = ['b', 'r', 'c']
labels = np.unique(y)#去除重複數字
print(labels)
for label in labels:
plt.scatter(X[y == label][:, 0], X[y == label][:, 1], c=colors[label], marker=makers[label])
#這裏面的X[y == label][:, 0]在我看來有點難,所以我打算解釋一下整體思路,
#首先labels只有0,1個標籤,y裏面的值爲0或1, y==label 就是y的值等於0劃分爲1組,y的值等於1劃分爲一組,將X數組分爲0和1兩個標籤的數組,
#一開始的X爲【100,2】的數組,經過y==label劃分之後得到的數組依然是【50,2】的數組,
#之後再經過後面的[:, 0]做的一個簡單劃分,成爲【50,1】的數組
if draw_sv:
sv = clf.support_vectors_#繪製支持向量
plt.scatter(sv[:, 0], sv[:, 1], c='y', marker='x')#散點圖繪製,顏色爲黃色 用x標出
X,y=make_blobs(n_samples=100,centers=2,random_state=0,cluster_std=0.3)#cluster_std的意思是聚類方差=0.3
clf=svm.SVC(C=1.0,kernel='linear')#C是懲罰鬆弛變量
clf.fit(X,y)
plt.figure(figsize=(12,4),dpi=144)
plot_hyperplance(clf, X, y, h=0.01, title='Maximum Margin Hyperplan')
plt.show()