因为复杂度的问题,支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets._samples_generator import make_blobs from sklearn.svm import SVC "step1: 画样本散点图" X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4) # centers 是聚类中心点的个数,可以理解为label的种类数 plt.scatter(X[:,0], X[:,1], c=y, s=60,cmap=plt.cm.Paired) #plt.cm.paired表示两个两个相近色彩输出 "step2: 线性分类器(可以有多种结果)" # 画函数 x_fit = np.linspace(0, 3) # y_1 = 1 * x_fit + 0.8 # plt.plot(x_fit, y_1, "-c") # "-"表示实线,c表示颜色 # y_2 = -0.3 * x_fit + 3 # plt.plot(x_fit, y_2, "-k") # ":"表示点虚线,“-.”便是点划线 # 引入一个准则:好的分类器不仅仅是能够很好的分开已有的数据集,还能对未知数据集进行很好的划分。 # 假设,现在有一个属于红色数据点的新数据(3, 2.8),则黑色的线会把这个新的数据集分错,而蓝色的线不会 # plt.scatter([3], [2.8], c='#cccc00', marker='o', s=100, cmap=plt.cm.Paired) "step3: 引入最大间隔:最大间隔刻画着当前分类器与数据集的边界" # 画边距 # plt.fill_between(x_fit, y_1-0.6, y_1+0.6, edgecolor='none', color='#AAAAAA', alpha=0.4) # plt.fill_between(x_fit, y_2-0.4, y_2+0.4, edgecolor='none', color='#AAAAAA', alpha=0.4) # alpha:透明度; edgecolor:边界线颜色, facecolor: 填充颜色 "step4: SVM找最优分类" # SVM函数 clf = SVC(kernel='linear') # 线性核函数 clf.fit(X, y) # 最佳函数 w = clf.coef_[0] a = -w[0] / w[1] y_3 = a*x_fit - (clf.intercept_[0]) / w[1] # 最大边距 下界 b_down = clf.support_vectors_[0] # 打印支持向量:边界点,由低到高 y_down = a*(x_fit - b_down[0]) + b_down[1] # 过支持向量短的线 # 最大边距 上届 b_up = clf.support_vectors_[-1] y_up = a*x_fit + b_up[1] - a * b_up[0] # 画函数 plt.plot(x_fit, y_3, "-c") # 花边距 plt.fill_between(x_fit, y_down, y_up, edgecolor="none", color="#AAAAAA", alpha=0.4) # 画支持向量 plt.scatter(clf.support_vectors_[:,0], clf.support_vectors_[:,1], edgecolors='b', s=80, facecolors='none') plt.show()
结果图:
from matplotlib import pyplot as plt from sklearn.datasets._samples_generator import make_blobs from sklearn.svm import SVC import numpy as np "step1: 生成散点" X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.9) plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap=plt.cm.Paired) "因为软间隔的引入,所以分类器会有很多,所以对分错的数据进行惩罚,参数C为惩罚函数: 越大惩罚越大" lowest, upest = min(X[:,0]), max(X[:,0]) x_fit = np.linspace(lowest-0.5, upest+0.5) # 惩罚因子C=1 clf = SVC(C=0.2, kernel='linear') clf.fit(X,y) # 最佳函数 w = clf.coef_[0] a = -w[0] / w[1] y_3 = a*x_fit - (clf.intercept_[0]) / w[1] # 最大边距下界 support = clf.support_vectors_ support = support[np.lexsort(support.T)] # 找到所有支持向量并排序,这里是按照二维数组的最后一列进行排序 # b_down = clf.support_vectors_[0] b_down = support[0] y_down = a*(x_fit - b_down[0]) + b_down[1] # 最大边距上界 # b_up = clf.support_vectors_[-1] b_up = support[-1] y_up = a*(x_fit - b_up[0]) + b_up[1] # 画散点图 X, y = make_blobs(n_samples=60, centers=2, random_state=0, cluster_std=0.4) plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap=plt.cm.Paired) # 画函数 plt.plot(x_fit, y_3, '-c') # 画边距 plt.fill_between(x_fit, y_down, y_up, edgecolor='none', color="#AAAAAA", alpha=0.4) # 画支持向量 plt.scatter(clf.support_vectors_[:,0], clf.support_vectors_[:,1], edgecolors='b', s=80, facecolors='none') plt.show()
结果图: