二元分类算法:C#实现支持向量机(SVM)与应用

news/2024/11/28 10:53:31/文章来源:https://www.cnblogs.com/forges/p/18573848

在机器学习中,支持向量机(Support Vector Machine, SVM) 是一种用于二元分类的常用算法。SVM 的核心思想是通过找到一个最优的分隔超平面,将样本分为两个不同的类别。与逻辑回归不同,SVM 强调的是“最大化两个类别之间的边界”,这使得它在高维空间中的表现尤其优异。

本篇文章将带你了解 SVM 的基本原理,并通过 C# 实现一个简化的二元分类模型。


什么是支持向量机(SVM)?

SVM 是一种基于几何边界的分类算法。给定一个带有标签的数据集,SVM 会尝试找到一个超平面(线性分类边界)来将数据分隔为不同的类别。为了保证分类效果,SVM 最大化了数据点到分类边界的距离,从而获得分类性能良好的模型。

核心思想

支持向量机的目标是找到一个最优超平面,它不仅能将不同类别的样本分开,还能最大化分类边界的宽度。这种宽度是通过支持向量,即离超平面最近的数据点来确定的。

SVM 的数学公式

对于线性可分数据,SVM 试图找到一个超平面,使得所有样本点满足:

 

其中:

  • ( y_i ) 为样本 ( x_i ) 的标签(-1 或 +1)。

  • ( \mathbf{w} ) 是超平面的法向量。

  • ( b ) 是偏置。

SVM 的目标就是找到参数 ( \mathbf{w} ) 和 ( b ),使得数据点到超平面的最小距离最大化。


C#实现支持向量机(SVM)

在 C# 中,我们可以通过实现一个简单的线性 SVM 分类器,利用 梯度下降 来优化参数。以下是基于梯度下降的 SVM 实现代码。

C#代码实现

using System;class SVM
{private double[] weights;private double bias;private double learningRate;private int iterations;private double lambda; // 正则化参数// 构造函数public SVM(double learningRate, int iterations, double lambda){this.learningRate = learningRate;this.iterations = iterations;this.lambda = lambda;}// 训练 SVM 模型public void Train(double[,] X, double[] y){int m = X.GetLength(0); // 样本数量int n = X.GetLength(1); // 特征数量// 初始化权重和偏置weights = new double[n];bias = 0;// 梯度下降迭代for (int iter = 0; iter < iterations; iter++){for (int i = 0; i < m; i++){double decision = DotProduct(X, weights, i) + bias;// 判断是否满足约束条件if (y[i] * decision >= 1){// 样本正确分类,更新权重for (int j = 0; j < n; j++){weights[j] -= learningRate * (2 * lambda * weights[j]);}}else{// 样本未正确分类,更新权重和偏置for (int j = 0; j < n; j++){weights[j] -= learningRate * (2 * lambda * weights[j] - y[i] * X[i, j]);}bias += learningRate * y[i];}}}}// 预测函数public double Predict(double[] X){double decision = DotProduct(X, weights) + bias;return decision >= 0 ? 1 : -1;}// 计算向量点积private double DotProduct(double[,] X, double[] weights, int rowIndex){double sum = 0;int n = X.GetLength(1);for (int i = 0; i < n; i++){sum += X[rowIndex, i] * weights[i];}return sum;}// 计算向量点积(简化版)private double DotProduct(double[] X, double[] weights){double sum = 0;for (int i = 0; i < X.Length; i++){sum += X[i] * weights[i];}return sum;}
}class Program
{static void Main(){// 训练数据(2个特征)double[,] X = {{ 1.0, 2.0 },{ 2.0, 3.0 },{ 3.0, 4.0 },{ 4.0, 5.0 }};// 标签(-1 或 1)double[] y = { -1, -1, 1, 1 };// 创建 SVM 实例SVM model = new SVM(learningRate: 0.001, iterations: 1000, lambda: 0.01);// 训练模型
        model.Train(X, y);// 预测新样本double[] newSample = { 2.5, 3.5 };double prediction = model.Predict(newSample);Console.WriteLine($"预测结果: {(prediction == 1 ? "类别1" : "类别-1")}");}
}

 

 

代码解析

  1. 训练数据X 是一个二维数组,包含样本的特征,每行表示一个样本,每列表示一个特征。y 是标签数组,表示每个样本的类别(-1 或 1)。

  2. SVM 模型

    • 使用 Train 方法训练 SVM 模型,通过梯度下降法更新权重和偏置参数。

    • Predict 方法用于预测新样本的类别。

  3. 参数解释

    • learningRate:学习率,用于控制权重更新的步长。

    • iterations:训练的迭代次数。

    • lambda:正则化参数,用于防止过拟合。

  4. 预测Predict 方法根据新样本的特征,计算该样本的分类结果。如果计算的决策值 decision 大于等于 0,则返回类别 1,否则返回 -1

运行结果

假设训练数据中的样本分为两类(-1 和 1),在完成训练后,我们对一个新样本 { 2.5, 3.5 } 进行预测。程序将输出:

预测结果: 类别1

总结

通过本文的 C# 实现,我们了解了如何使用支持向量机 (SVM) 进行二元分类。SVM 算法通过最大化边界间隔,提供了一个强大且稳健的分类方式。其应用场景十分广泛,尤其适用于高维数据的分类任务。在实际项目中,我们可以使用 C# 来实现 SVM 算法,进行各类数据的二元分类。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何提升日用品行业生产效率?数字化管理成关键

在日用品行业,快速反应和高效生产是生存之道。从采购、生产到物流配送,每一个环节都充满挑战。市场需求瞬息万变,交付周期日益缩短,任何一个环节的滞后都可能导致整个供应链的断裂。如何在繁忙的工作中保持高效协作、精准调度,并确保及时交付,是许多企业迫切需要解决的问…

从需求到交付,如何有效控制客户的预期?

在现代企业管理中,客户预期的管理是项目成功的关键因素之一。无论是软件开发、产品设计还是咨询服务,项目能否成功完成往往取决于客户对于项目成果的预期。如果没有正确的预期管理,客户的需求与项目交付之间就容易产生偏差,进而影响客户的满意度和项目的最终成果。因此,如…

PIDNet-PagFM-特征融合

import torch.nn as nn import torch import torch.nn.functional as F class PagFM(nn.Module):# 选择性特征融合 直接融合细节和低频上下文 容易导致细节丢失def __init__(self, in_channels, mid_channels, after_relu=False, with_channel=False, BatchNorm=nn.BatchNorm2…

基于改进自适应分段线性近似(IAPLA)的微分方程数值解法研究: 从简单动力系统到混沌系统的应用分析

微分方程作为一种数学工具在物理学、金融学等诸多领域的动态系统建模中发挥着关键作用。对这类方程数值解的研究一直是学术界关注的重点。 数值方法是一类用于求解难以或无法获得解析解的数学问题的算法集合。这类方法主要处理描述函数在时间或空间维度上演化的微分方程,采用逐…

大模型--QLoRA、GPTQ:模型量化02--24

目录1. 参考2. 量化简介3. QLoRANF4 数据类型4. GPTQOBD:Optimal Brain DamageOBS:Optimal Brain SurgeonOBCGPTQ 的创新点5 各大开源模型量化实现6 后续方向探讨 1. 参考 https://zhuanlan.zhihu.com/p/646210009?utm_psn=1845389883864133633 2. 量化简介 模型量化是将浮点…

Oracle生成awr报告操作步骤

1、cmd命令窗口 以sysdba身份登录Oracle 2、执行@?/rdbms/admin/awrrpt命令,并选择报告类型为HTML。输入天数以选择生成报告的时间段,一般默认为最近7天。输入报告开始和结束时间对应的快照ID。输入报告名称,如awr.html,系统将自动生成并显示报告名。 3. 查看AWR报告。 AW…

聚焦银行业数智化转型,火山引擎数据飞轮系列白皮书重磅发布

随着金融科技的快速发展,银行业也在不断提升数字化水平。通过大数据、人工智能等技术的应用,银行可以更加精准地了解客户需求,提供个性化的金融产品和服务,还能降低运营成本,提升风险管理能力,创造更多业务价值。《金融科技发展规划(2022~2025年)》也明确指出,以加强金…

字节面试:聊聊 CAP 定理?哪些中间件是AP? 哪些是CP? 说说 为什么?

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等多方面好处,是企业信息…

SSD:清华出品,可切换密集稀疏的大模型预训练加速方案 | ICML24

来源:晓飞的算法工程笔记 公众号,转载请注明出处论文: Exploring the Benefit of Activation Sparsity in Pre-training论文地址:https://arxiv.org/abs/2410.03440 论文代码:https://github.com/thunlp/moefication创新点研究了激活属性在预训练过程中的变化,发现Transfo…

hhdb数据库介绍(9-13)

计算节点特色功能 SQL流控 计算节点支持对高并发SQL语句进行自动的流量控制功能,可以自动识别高消耗SQL且限制同一时间内高消耗SQL执行的并发数和效率,从而稳定数据库服务。也提供查询入口使用户尽可能多的识别高消耗SQL语句并优化SQL以提升数据库整体服务性能。 当正在执行的…

国产!瑞芯微RK3576(八核@2.2GHz+6T NPU)工业开发板规格书

1 评估板简介 创龙科技TL3576-EVM是一款基于瑞芯微RK3576J/RK3576高性能处理器设计的四核ARM Cortex-A72 + 四核ARM Cortex-A53 + 单核ARM Cortex-M0国产工业评估板,Cortex-A72核心主频高达2.2GHz,Cortex-A53核心主频高达2.0GHz。评估板由核心板和评估底板组成,核心板CPU、R…