import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs, make_circles, make_classification, make_moons
from sklearn import svm
from matplotlib.colors import ListedColormap
import pandas as pd
#生成数据集
n_samples = 100
datasets = [
make_moons(n_samples=n_samples, noise=0.2, random_state=0),
make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
make_blobs(n_samples=n_samples, centers=2, random_state=5),
make_classification(n_samples=n_samples, n_features = 2, n_informative=2, n_redundant=0, random_state=5)
]
#定义核函数
Kernel = ["linear", "poly", "rbf", "sigmoid"]
#绘制图像
for X,Y in datasets:
plt.figure(figsize=(5,4))
plt.scatter(X[:,0], X[:,1], c=Y, s=50, cmap="rainbow")
图像太占位置,在下述给出。
此次可视化代码有一定难度,可以参考注释。
#每行为不同数据集
nrows = len(datasets)
#每列为不同核函数,+1表示增加一列绘制原图
ncols = len(Kernel) + 1
#创建画布子图
fig, axes = plt.subplots(nrows, ncols, figsize=(20, 16))
#遍历数据集
for ds_cnt, (X, Y) in enumerate(datasets):
#去除第零列绘制原图
ax = axes[ds_cnt, 0]
#第一个图上方设置标题
if(ds_cnt == 0):
ax.set_title("Input data")
#绘制原图散点图
ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired, edgecolors='k')
ax.set_xticks(())
ax.set_yticks(())
#遍历核函数
for est_idx, kernel in enumerate(Kernel):
#取出子图
ax = axes[ds_cnt, est_idx + 1]
#训练对应核函数的模型
clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y)
#获得评分
score = clf.score(X, Y)
#绘制原图散点图
ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired, edgecolors='k')
#绘制支持向量点
ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=50, facecolors='none', zorder=10, edgecolors='k')
#找出两列特征的最小最大值
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
#np.mgrid, 合并了之前使用的np.linspace和np.meshgrid的用法, 200j代表分割为200等份
XX, YY = np.mgrid[x_min: x_max: 200j, y_min: y_max: 200j]
#np.c_与np.vstack类似的功能,注意展平获得距离后需要用reshape函数还原为原始维度与XX保持一致(为了后续画图pcolormesh参数能对应上)
Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()]).reshape(XX.shape)
#Paired表示颜色相近的色彩输出,比如浅蓝、深蓝 ;浅红、深红;浅绿,深绿
ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
#绘制等高线(上篇博客中已经讲过)
ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'], levels=[-1, 0, 1])
ax.set_xticks(())
ax.set_yticks([])
#设置核函数标题
if ds_cnt == 0:
ax.set_title(Kernel[est_idx])
#显示正确率,bbox为设置文字嵌入的背景块,transform表示确定文字对应的坐标轴(这里就是子图的坐标轴而不是大图),horizontalalignment表示在坐标轴右边
ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0'), size=15, bbox=dict(boxstyle='round', alpha=0.8, facecolor='white'), transform=ax.transAxes, horizontalalignment='right')
#将子图紧缩(自动)
plt.tight_layout()