SVM-老师讲的真的很好!

支持向量机(SVM)是一种分类模型,其目标是找到最大化类别边界距离的决策边界。通过拉格朗日乘子法处理约束优化问题。SVM只关注边界上的点,这些点被称为支持向量。为了解决噪声和异常值问题,引入了软间隔允许一定程度的误分类。此外,SVM利用核变换将数据映射到高维空间,以更好地进行非线性分类。在Iris数据集上的示例展示了SVM的线性与多项式核的应用。
摘要由CSDN通过智能技术生成

支持向量机(Support Vector Machine)

如同逻辑回归一样,SVM是一个分类模型

目标

SVM解决分类模型的基本思路:什么是一个好的分类边界?

SVM认为,好的分类决策边界应当是:类别边界的距离应当尽可能的远

目标函数

拉格朗日乘子法

那么我们的公式就可以写为

小结

svm本质上只关心边界上的点,对于非最近的点根本不关心。

因此,这个分类平面是由这些边界上的点支撑起来的,所以叫支持向量机

软间隔

上述过程中,是在将全部点正确分类后,得到最优的平面方程。

然而,由于一些噪声原因,一些outlier会恶化平面方程的最优解。

例如,一个噪声点作为边界后,为了正确分类,会极大地减少分类平面与边界点的距离。

对此,我们希望模型可以容忍一定程度的错误训练集预测,从而避免过拟合。

具体上,我们令条件

 核变换

对于圆形分布的数据,在二维平面上无论如何也无法正确分割。

或者是需要一个极其复杂的模型,来将点分割,从而造成过拟合。

SVM的思路在于,我将数据映射到更高维度的空间后,从更高的维度寻找一个求解平面,从而得到一个更好的结果。

如何映射到高维空间?

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import numpy as np
import matplotlib.pyplot as plt

iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

markers = ['o', '^', 's']
marker_colors = ['r', 'b', 'g']
marker_dict = {i: (markers[i], marker_colors[i]) for i in range(len(markers))}

# 绘制散点图,并根据不同类别使用不同的形状进行区分
for i in range(X_train.shape[0]):
    marker, color = marker_dict[y_train[i]]
    plt.scatter(X_train[i, 0], X_train[i, 1], marker=marker, c=color, edgecolor='k')

# 添加图例
handles = [plt.scatter([], [], marker=markers[i], c=marker_colors[i], edgecolor='k') for i in range(len(markers))]
labels = ['Class %d' % i for i in range(len(markers))]
plt.legend(handles, labels)

plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Iris Classification')
plt.show()

clf1 = SVC(C=1, kernel='linear', decision_function_shape='ovr')
clf1.fit(X_train, y_train.ravel())

clf2 = SVC(C=1, kernel='poly', decision_function_shape='ovr')
clf2.fit(X_train, y_train.ravel())

# poly', 'linear', 'sigmoid', 'rbf', 'precomputed

Out[84]:

SVC(C=1, kernel='poly')

In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

In [85]:

print(clf1.score(X_train, y_train))
print(clf2.score(X_train, y_train))
0.819047619047619
0.8095238095238095

In [86]:

print(clf1.score(X_train, y_train))
print(clf2.score(X_train, y_train))
0.8
0.7333333333333333

In [87]:

import matplotlib as mlp

def draw(clf, x):
    iris_feature = 'sepal length', 'sepal width', 'petal lenght', 'petal width'
    # 开始画图
    x1_min, x1_max = x[:, 0].min(), x[:, 0].max()               #第0列的范围
    x2_min, x2_max = x[:, 1].min(), x[:, 1].max()               #第1列的范围
    x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]   #生成网格采样点 开始坐标:结束坐标(不包括):步长
    #flat将二维数组转换成1个1维的迭代器,然后把x1和x2的所有可能值给匹配成为样本点
    grid_test = np.stack((x1.flat, x2.flat), axis=1)            #stack():沿着新的轴加入一系列数组,竖着(按列)增加两个数组,grid_test的shape:(40000, 2)
#     print('grid_test:\n', grid_test)
    # 输出样本到决策面的距离
    z = clf.decision_function(grid_test)
#     print('the distance to decision plane:\n', z)

    grid_hat = clf.predict(grid_test)                           # 预测分类值 得到【0,0.。。。2,2,2】
#     print('grid_hat:\n', grid_hat)  
    grid_hat = grid_hat.reshape(x1.shape)                       # reshape grid_hat和x1形状一致
                                                                #若3*3矩阵e,则e.shape()为3*3,表示3行3列   
    #light是网格测试点的配色,相当于背景
    #dark是样本点的配色
    cm_light = mlp.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
    cm_dark = mlp.colors.ListedColormap(['g', 'b', 'r'])
     #画出所有网格样本点被判断为的分类,作为背景
    plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)                                   # pcolormesh(x,y,z,cmap)这里参数代入
                                                                                      # x1,x2,grid_hat,cmap=cm_light绘制的是背景。
    #squeeze()把y的个数为1的维度去掉,也就是变成一维。
    plt.scatter(x[:, 0], x[:, 1], c=np.squeeze(y), edgecolor='k', s=50, cmap=cm_dark) # 样本点
    plt.scatter(X_test[:, 0], X_test[:, 1], s=200, facecolor='yellow', zorder=10, marker='+')       # 测试点
    plt.xlabel(iris_feature[0], fontsize=20)
    plt.ylabel(iris_feature[1], fontsize=20)
    plt.xlim(x1_min, x1_max)
    plt.ylim(x2_min, x2_max)
    plt.title('svm in iris data classification', fontsize=30)
    plt.grid()
    plt.show()

In [88]:

draw(clf1,X)

In [89]:

draw(clf2, X)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值