支持向量机(Support Vector Machine, SVM)是一种强大的机器学习算法,广泛应用于分类和回归任务中。其核心思想是寻找一个最优的超平面,以最大化不同类别数据之间的间隔。本文将详细介绍如何使用Python实现线性支持向量机(SVM)算法,并通过实际案例展示其在数据分类中的应用。
当数据线性可分时,SVM的目标是找到一个超平面,使得所有样本点被正确分类,并且间隔最大化。这可以转化为一个凸二次规划问题,通过求解对偶问题来找到最优解。
我们将设计一个LinearSVM类,包含以下方法:
fit:训练模型。 predict:对新样本进行分类。 compute_kernel:计算核函数(线性核)。 2.2 Python代码实现import numpy as np class LinearSVM: def __init__(self, learning_rate=0.001, lambda_param=0.01, n_iters=1000): self.lr = learning_rate self.lambda_param = lambda_param self.n_iters = n_iters self.weights = None self.bias = None def fit(self, X, y): n_samples, n_features = X.shape y_ = np.where(y <= 0, -1, 1) self.weights = np.zeros(n_features) self.bias = 0 for _ in range(self.n_iters): for idx, x_i in enumerate(X): condition = y_[idx] * (np.dot(x_i, self.weights) - self.bias) >= 1 if condition: self.weights -= self.lr * (2 * self.lambda_param * self.weights) else: self.weights -= self.lr * (2 * self.lambda_param * self.weights - np.dot(x_i, y_[idx])) self.bias -= self.lr * y_[idx] def predict(self, X): linear_output = np.dot(X, self.weights) - self.bias return np.sign(linear_output) # 示例数据 X = np.array([[1, 2], [2, 3], [3, 4], [4, 5]]) y = np.array([0, 1, 1, 0]) # 训练模型 svm = LinearSVM() svm.fit(X, y) # 预测新样本 new_samples = np.array([[1, 1], [5, 5]]) predictions = svm.predict(new_samples) print(predictions)
鸢尾花数据集是一个经典的机器学习数据集,包含三种鸢尾花的特征和标签。我们将使用线性SVM对其中两种鸢尾花进行分类。
数据准备from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 加载数据 iris = datasets.load_iris() X = iris.data[iris.target != 2] y = iris.target[iris.target != 2] # 数据标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) 模型训练与预测
# 训练模型 svm = LinearSVM() svm.fit(X_train, y_train) # 预测测试集 predictions = svm.predict(X_test) # 评估模型 accuracy = np.mean(predictions == y_test) print(f"Accuracy: {accuracy * 100:.2f}%") 3.2 案例二:手写数字识别 问题描述
手写数字数据集(MNIST)是一个包含手写数字图像的数据集。我们将使用线性SVM对数字0和1进行分类。
数据准备from sklearn.datasets import load_digits # 加载数据 digits = load_digits() X = digits.data[(digits.target == 0) | (digits.target == 1)] y = digits.target[(digits.target == 0) | (digits.target == 1)] # 数据标准化 X_scaled = scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42) 模型训练与预测
# 训练模型 svm = LinearSVM() svm.fit(X_train, y_train) # 预测测试集 predictions = svm.predict(X_test) # 评估模型 accuracy = np.mean(predictions == y_test) print(f"Accuracy: {accuracy * 100:.2f}%")
线性SVM适用于线性可分的数据。对于非线性数据,可以通过引入核函数将数据映射到高维空间,使其在高维空间中线性可分。常见的核函数包括:
线性核 多项式核 高斯(RBF)核 4.2 惩罚参数 ©惩罚参数C控制着模型对误分类的容忍程度。C值越大,模型对误分类的惩罚越重,可能会导致过拟合;C值越小,模型对误分类的容忍度越高,可能会导致欠拟合。
本文详细介绍了线性支持向量机(SVM)算法的原理及其在Python中的实现。通过两个实际案例——鸢尾花分类和手写数字识别,展示了线性SVM在数据分类中的应用。此外,还讨论了SVM的优化和核方法,为处理非线性数据提供了思路。通过本文的学习,读者可以掌握线性SVM的基本实现和应用,为进一步探索更复杂的SVM模型打下基础。
相关知识
MATLAB实现鸢尾花数据集的支持向量机(SVM)分类
SVM支持向量机分类鸢尾花数据集iris及代码:精准分类,助力机器学习入门
利用SVM(支持向量机)分类算法对鸢尾花数据集进行分类
基于花授粉算法优化实现SVM数据分类
【病害检测】基于支持向量机SVM实现植物叶片病害检测,含准确率附Matlab代码
R语言与支持向量机SVM应用实例
【人工智能】基于分类算法的学生学业预警系统应用
机器学习实践:基于支持向量机算法对鸢尾花进行分类
鸢尾花数据集多算法分类对比实验分析
探索MATLAB支持向量机分类:从入门到精通
网址: 使用Python实现线性支持向量机(SVM)算法及其在数据分类中的应用 https://m.huajiangbk.com/newsview2508864.html
| 上一篇: 电商BI系统与数据分析的完美结合 |
下一篇: 基于SVM的鸢尾花数据集回归分析 |