基于SVM(支持向量机)对鸢尾花进行分类

支持向量机方法也是一种强大的机器学习分类方法。
在感知器算法中,我们的目标是最小化分类误差,而在SVM中,我们的优化目标是最大化分类间隔。
较大的分类间隔意味着模型有较小的泛化误差,较小的间隔则意味着模型可能会过拟合。
在SVM中的两条平行的决策边界为:
w 0 + w T x p o s = 1 w_0+\bm{w}^T\bm{x}_{pos}=1 w0+wTxpos=1
w 0 + w T x n e g = − 1 w_0+\bm{w}^T\bm{x}_{neg}=-1 w0+wTxneg=1
两式相减可得:
w T ( x p o s − x n e g ) = 2 \bm{w}^T(\bm{x}_{pos}-\bm{x}_{neg})=2 wT(xposxneg)=2
定义
∣ ∣ w ∣ ∣ = ∑ j = 1 m w j 2 ||\bm{w}||=\sqrt{\sum_{j=1}^{m}w_j^2} w=j=1mwj2
可得
w T ( x p o s − x n e g ) ∣ ∣ w ∣ ∣ = 2 ∣ ∣ w ∣ ∣ \frac{\bm{w}^T(\bm{x}_{pos}-\bm{x}_{neg})}{||\bm{w}||}=\frac{2}{||\bm{w}||} wwT(xposxneg)=w2
等式左侧为正负超平面间的距离,也就是所要最大化的间隔,故需使 2 / ∣ ∣ w ∣ ∣ 2/||\bm{w}|| 2/w最大。
SVM的目标函数记为:
w 0 + w T x i ≥ 1 , if  y ( i ) = 1 w_0+\bm{w}^T\bm{x}^{i}\ge1, \text{if} \ y^{(i)}=1 w0+wTxi1,if y(i)=1
w 0 + w T x i ≤ 1 , if  y ( i ) = − 1 w_0+\bm{w}^T\bm{x}^{i}\le1, \text{if} \ y^{(i)}=-1 w0+wTxi1,if y(i)=1
对于非线性可分的数据,需要放松线性约束条件,以保证在适当的罚项成本下,对错误的分类情况优化时能够收敛。
w 0 + w T x i ≥ 1 , if  y i = 1 − ξ ( i ) w_0+\bm{w}^T\bm{x}^{i}\ge1, \text{if} \ y^{i}=1-\xi^{(i)} w0+wTxi1,if yi=1ξ(i)
w 0 + w T x i ≤ 1 , if  y i = − 1 + ξ ( i ) w_0+\bm{w}^T\bm{x}^{i}\le1, \text{if} \ y^{i}=-1+\xi^{(i)} w0+wTxi1,if yi=1+ξ(i)
通过引入 C C C值,新的目标优化为使下式最小:
1 2 ∣ ∣ w ∣ ∣ 2 + C ( ∑ i ξ ( i ) ) \frac{1}{2}||\bm{w}||^2+C(\sum_i\xi^{(i)}) 21w2+C(iξ(i))
通过这种方法我们也可以对鸢尾花进行分类,代码引自《python机器学习》

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from matplotlib.colors import ListedColormap
import matplotlib.pyplot as plt
import numpy as np
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3,random_state=0)

sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std: object = sc.transform(X_test)


def plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):
    # 设置marker generator和color map
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])
    x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                           np.arange(x2_min, x2_max, resolution))
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim = (xx2.min(), xx2.max())
    X_test, y_test = X[test_idx, :], y[test_idx]
    for idx, cl in enumerate(np.unique(y)):  # np.unique:去除重复数据
        plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=cl)
    if test_idx:
        X_test, y_test = X[test_idx, :], y[test_idx]
        plt.scatter(X_test[:, 0], X_test[:, 1], c='black', alpha=0.8, linewidths=1, marker='o', s=10, label='test set')


X_combined_std = np.vstack((X_train_std, X_test_std))
y_combined = np.hstack((y_train, y_test))
svm = SVC(kernel='linear', C=1.0, random_state=0)# 使用线性核函数,设置C值为1
svm.fit(X_train_std, y_train)
plot_decision_regions(X_combined_std, y_combined, classifier=svm, test_idx=range(105,150))
plt.xlabel('petal length {standardized}')
plt.ylabel('petal width {standardized}')
plt.legend(loc='upper left')
plt.show()

小黑点表示测试集数据,分类结果如下:
在这里插入图片描述
可以观察到分类结果较好。

  • 9
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对您的问题,我可以为您提供以下的回答: 支持向量机(Support Vector Machine,SVM)是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器。在解决多分类问题时,可以通过构造多个二分类器来实现。而尾花分类问题是一个经典的机器学习问题,可以使用支持向量机进行分类。下面是基于支持向量机实现尾花分类的步骤: 1. 准备数据集。尾花数据集是一个经典的数据集,包含150个样本,分为3类,每类50个样本。每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度。 2. 对数据集进行预处理。通常需要对数据进行标准化处理,以消除不同特征之间的量纲差异。同时,也需要将数据集划分为训练集和测试集,以用于模型的训练和评估。 3. 训练支持向量机模型。可以使用Python中的sklearn库中的SVM模块进行训练。在训练模型时,需要选择合适的核函数、正则化参数等超参数,并使用交叉验证等方法进行调参。 4. 对模型进行评估。可以使用测试集对训练好的模型进行评估,计算模型的准确率、精度、召回率等指标。同时,也可以使用绘制ROC曲线等方法对模型进行评估。 5. 对新数据进行预测。在训练好的模型上,可以使用predict()方法对新数据进行分类预测。 以上就是基于支持向量机实现尾花分类的基本步骤。希望可以帮助您解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值