常见机器学习方法的优缺点及适用场景:支持向量机(SVM)
作者:互联网
支持向量机(SVM)
特点:
- SVM 想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。其有优美的理论保证和利用核函数对于线性不可分问题的处理技巧,使其常用于数据分类问题(回归问题也可)。
优点:
- 有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题;
- 能找出对任务至关重要的关键样本(即:支持向量);
- 采用核技巧之后,可以处理非线性分类/回归任务;
- 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
缺点:
- 训练时间长。当采用 SMO 算法时,由于每次都需要挑选一对参数,因此时间复杂度为O(N2),其中 N 为训练样本的数量;
- 当采用核技巧时,如果需要存储核矩阵,则空间复杂度为O(N2)
- 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。
应用
因为复杂度的问题,支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。
基本概念:支持向量、软间隔:
- motivation:好的分类器不仅仅是能够很好的分开已有的数据集,还能对未知数据集进行很好的划分;
- 引入最大间隔:最大间隔刻画着当前分类器与数据集的边界;
- 支持向量:可以理解为间隔带的边界点
- 软间隔:因为有些数据不太好找到最大间隔,所以相比于硬间隔,软间隔允许个别数据出现在间隔中
上代码干它:
SVM
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()
结果图:
标签:plt,fit,clf,优缺点,down,SVM,support,向量 来源: https://www.cnblogs.com/gentlejan/p/16218566.html