常见机器学习方法的优缺点及适用场景:支持向量机(SVM)
2022/8/24 23:26:50
本文主要是介绍常见机器学习方法的优缺点及适用场景:支持向量机(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()
结果图:
这篇关于常见机器学习方法的优缺点及适用场景:支持向量机(SVM)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-28机器学习资料入门指南
- 2024-10-25机器学习开发的几大威胁及解决之道
- 2024-10-24以下是五个必备的MLOps (机器学习运维)工具,帮助提升你的生产效率 ??
- 2024-10-15如何选择最佳的机器学习部署策略:云 vs. 边缘
- 2024-10-12从软件工程师转行成为机器学习工程师
- 2024-09-262024年机器学习路线图:精通之路步步为营指南
- 2024-09-13机器学习教程:初学者指南
- 2024-08-07从入门到精通:全面解析机器学习基础与实践
- 2024-01-24手把手教你使用MDK仿真调试
- 2024-01-10基于“小数据”的机器学习