机器学习——支持向量机

支持向量机—— 大间距分类器
逻辑回归的损失函数
在这里插入图片描述
在这里插入图片描述
如果 y=1
在这里插入图片描述
如果y=0
在这里插入图片描述

逻辑回归的损失函数:
在这里插入图片描述
支持向量机的损失函数:
在这里插入图片描述
控制权衡的方式:
逻辑回归: A + λB
SVM: CA + B

支持向量机的损失函数理解:
当C很大的时候只用看theta的平方 —— 线性分类
当C小的时候,不仅看theta,还要看theta的转置——非线性分类

在这里插入图片描述
当y=1时,希望是
在这里插入图片描述
在这里插入图片描述
当y=0 时,希望
在这里插入图片描述
(ps: 向量内积性质:
在这里插入图片描述

SVM决策边界 —— 线性分类
当C很大时候
在这里插入图片描述
线性可分: 使间距很大
非线性不能使用大间距: 因为决策边界敏感

SVM核函数——非线性分类
用来使SVM能够处理非线性分类(又可以称作是相似度函数)

核函数和相似度:
在这里插入图片描述

代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from matplotlib.colors import ListedColormap

# dataset.make_moons : 生成半环形圆
X, y = datasets.make_moons(noise=0.15, random_state=666)
# scatter: 绘制散点图
# 绘制蓝色的点
plt.scatter(X[y == 0, 0], X[y == 0, 1])
# 绘制红色的点
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()


def plot_decision_boundary(model, axis):
    # 生成王个点坐标矩阵
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1)
    )
    # ravel: 将多维数组 转换成一维数组
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)

    custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])
    plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)


def PolynomialSVC(degree, C=1.0):
    # Pipline的作用是将数据处理和模型拟合结合在一起,减少代码量
    return Pipeline([
        ('poly', PolynomialFeatures(degree=degree)),  # 多项式回归
        ('std_scaler', StandardScaler()),  # 标准化的类
        ('linerSVC', LinearSVC(C=C))  # 线性svm
    ])


poly_svc = PolynomialSVC(degree=3)
poly_svc.fit(X, y)
plot_decision_boundary(poly_svc, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()


# 当使用算法SVM() 的参数kernel= 'poly'时9
def PolynomialKernelSVC(degree, C=1.0):
    return Pipeline([
        ('std_scaler', StandardScaler()),
        ('kernelSVC', SVC(kernel='poly', degree=degree, C=C))
    ])


poly_kernel_svc = PolynomialKernelSVC(degree=3)
poly_kernel_svc.fit(X, y)
plot_decision_boundary(poly_kernel_svc, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y == 0, 0], X[y == 0, 1])
plt.scatter(X[y == 1, 0], X[y == 1, 1])
plt.show()

运行结果为:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值