其他分享
首页 > 其他分享> > 常见机器学习方法的优缺点及适用场景:支持向量机(SVM)

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

作者:互联网

支持向量机(SVM)

  特点:

  优点:

  缺点:

  应用

  因为复杂度的问题,支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务。

  基本概念:支持向量、软间隔:

  上代码干它:

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