手写持向量机(SVM)实现

news/2024/10/15 16:03:27

下面是一个简单的支持向量机(SVM)实现,用于解决线性可分问题。

这个实现不使用任何机器学习库,只使用NumPy进行矩阵运算。

请注意,这个实现主要用于教学目的,实际应用中推荐使用成熟的库,如scikit-learn。

import numpy as npclass SVM:def __init__(self, learning_rate=0.001, lambda_param=0.01, n_iterations=1000):"""初始化SVM分类器。参数:learning_rate (float): 学习率。lambda_param (float): 正则化参数。n_iterations (int): 迭代次数。"""self.lr = learning_rateself.lambda_param = lambda_paramself.n_iterations = n_iterationsself.w = Noneself.b = Nonedef fit(self, X, y):"""训练SVM模型。参数:X (numpy.array): 特征矩阵。y (numpy.array): 标签向量。"""n_samples, n_features = X.shapeself.w = np.zeros(n_features)self.b = 0# 转换标签为1和-1y_ = np.where(y <= 0, -1, 1)for _ in range(self.n_iterations):for idx, x_i in enumerate(X):# 计算条件,检查是否满足SVM的间隔条件condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1if condition:# 如果满足条件,执行梯度下降更新权重(带正则化)self.w -= self.lr * (2 * self.lambda_param * self.w)else:# 如果不满足条件,执行梯度下降更新权重和偏置项self.w -= self.lr * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))self.b -= self.lr * y_[idx]def predict(self, X):"""使用训练好的SVM模型进行预测。参数:X (numpy.array): 特征矩阵。返回:predictions (numpy.array): 预测标签。"""linear_output = np.dot(X, self.w) - self.breturn np.sign(linear_output)# 生成一些合成数据
X = np.array([[5, 5], [3, 5], [4, 3], [2, 3], [5, 3], [5, 4], [3, 5], [4, 4], [3, 3], [4, 2], [3, 2], [2, 4]])
y = np.array([-1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1])# 创建SVM模型实例
svm = SVM(learning_rate=0.001, lambda_param=0.01, n_iterations=1000)# 训练模型
svm.fit(X, y)# 进行预测
predictions = svm.predict(X)# 打印预测值和真实值
print("Predictions:", predictions)
print("Real values:", y)

代码解释:

  1. 初始化:在__init__方法中,我们初始化了学习率、正则化参数、迭代次数、权重向量w和偏置项b

  2. 训练:在fit方法中,我们首先将标签转换为-1和1,然后进行迭代,对每个样本进行梯度下降。如果样本满足间隔条件(即y_i * (w^T x_i + b) >= 1),我们只更新权重向量w,否则我们同时更新权重向量w和偏置项b

  3. 预测:在predict方法中,我们计算线性输出,然后使用np.sign函数将输出转换为预测标签。

请注意,这个简单的SVM实现没有包含一些高级特性,如核技巧、软间隔或更复杂的优化算法。对于非线性可分的数据集或需要更高性能的应用场景,建议使用成熟的库,如scikit-learn中的SVM实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

luogu 模拟赛

A.带余除法 我们不难考虑找出 \(q\) 的上下界,不难发现范围是 \([\lfloor\frac{n}{k+1}\rfloor+1,\lfloor\frac{n}{k}\rfloor]\)。当然这个区间可能为空。只需算出区间长度即可。 B.奖牌排序 不难考虑到分别按照三个关键字排序,然后对于每个小朋友找到每个关键字下的排名(同…

vue+wangEditor编辑器,上传图片请求后台接口

来吧,先给大家看一下,是否是你想要的简单轻便编辑器的效果。父组件:<EditorView :content="value" @change="grtUrl"/><script> import EditorView from "@/components/EditorView"; export default {components: {EditorView}},…

汽车开发流程管理工具赋能安全与质量

经纬恒润能够提供Stages的咨询及工程服务能力,同时在ALM实施、ASPICE、功能安全、预期功能安全等有着丰富的咨询经验,帮助客户共同构建一个更高的安全标准和质量水平。 随着数字化、人工智能、自动化系统及物联网技术的迅速发展,工程驱动型企业正面临重大转型挑战,亟…

汽车电控 01

汽车电控1、车体 本身必要的电子设备 如 发动机,底盘,车身电子控制系统等。 2、车载 不是必要的电子设备 如 音响 空调 导航。车用传感器温度传感器压力传感器转速传感器爆震传感器流量传感器移位传感器气体浓度传感器

网络数据请求

测试可跳过域名校验

springboot 项目引入tk或者jpa 访问报错

今天弄新框架的时候,遇到个莫名其妙的问题,如下: springboot 项目引入tk 后 Caused by: java.lang.IllegalStateException: Failed to asynchronously initialize native EntityManagerFactory: java.lang.NoSuchMethodError: javax.persistence.ValidationMode javax.persi…

苹果电脑Mac数据恢复

一、使用内置工具恢复 Time Machine Time Machine是Mac自带的备份工具,可以定期备份整个系统或特定文件。如果已使用Time Machine备份了数据,那么恢复数据将非常简单。将备份硬盘连接到电脑上,然后打开Time Machine,选择需要恢复的文件或文件夹,再点击“恢复”即可。 2.iC…

鲸鸿动能广告助力App流量高效变现,促进商业增长

广告是App开发者实现流量变现的常用方法之一。当App积累了一定数量的用户后,开发者需要考虑如何有效地将流量转化为收入,以支持App的商业可持续增长。 HarmonyOS SDK广告服务(Ads Kit)提供了鲸鸿动能流量变现服务,依托华为终端强大的平台与数据能力为开发者提供App流量变现…