ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

常见机器学习方法的优缺点及适用场景:支持向量机(SVM)

2022-08-24 17:33:11  阅读:201  来源: 互联网

标签:plt fit clf 优缺点 down SVM support 向量


支持向量机(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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有