首页 > 编程语言 >二元分类算法:C#实现支持向量机(SVM)与应用

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

时间:2024-11-28 10:54:59浏览次数:9  
标签:SVM 分类 C# double 样本 int weights 向量

在机器学习中,支持向量机(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 算法,进行各类数据的二元分类。

标签:SVM,分类,C#,double,样本,int,weights,向量
From: https://www.cnblogs.com/forges/p/18573848

相关文章

  • 海康DS-MCH208安全帽相机的开发笔记
    1、需要在手机里面安装一个【小AI助手】的APP。2、按开关键启动相机,然后按左上角的按键,连续按两次,会提示“打开热点”。3、手机通过WIFI连接到相机的热点。热点的默认名称是【miniAI-Kxxxxxxx】,其中Kxxxxxxx就是相机的序列号,在相机背面的标签上会有写。4、然后打开【小AI助手】......
  • 手写一个使用css3旋转硬币的效果
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>CSS3旋转硬币</title><style>body{background-color:#f0f0f0;display:flex;justify-content:center;align-items:center;min-height:......
  • Elasticsearch安装
    1.下载elasticsearch-7.17.25-windows-x86_64.zip 网站:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-25 有点慢,耐心等待2.下载完修改配置文件在conf文件夹中elasticsearch.yml添加如下配置信息http.cors.enabled:truehttp.cors.allow-origin:......
  • 使用css3做一个魔方旋转的效果
    <!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>CSS3魔方旋转</title><style>body{background-color:#f0f0f0;perspective:800px;/*为父元素添加透视效果*/}.cube-container{width:200px;hei......
  • getElementById和querySelector方法的区别是什么?
    getElementById和querySelector都是JavaScript中用于选择HTML元素的方法,但它们之间有一些关键区别:1.选择方式:getElementById:通过元素的ID来选择元素。HTML中的ID必须是唯一的,因此getElementById总是返回单个元素(或者null,如果找不到该ID)。这是获取特定......
  • 为什么大模型都是decoder-only架构?
    大家好!今天和大家聊聊,为什么大模型都是decoder-only架构目前主要的架构有3种:Bert为代表的encoder-only架构,ChatGLM为代表的encoder-decoder,以及GPT为代表的decoder-onlyencoder-only采用的是maskedtoken预训练,一般用于nlu任务。decoder-only采用nexttoken预训练,天然适......
  • JAVA WEB和Tomcat各组件概念
    概述本篇文章是https://juejin.cn/post/7055306172265414663,这篇文章的再总结,剔除了与Java安全研究没太大关系的内容,对JAVAWEB中的Servlet、Filter、Listener以及Connector、Container则加重了篇幅。ServletServlet是运行在Web服务器或应用服务器上的程序,它充当了客户端HTT......
  • leetcode hot100【LeetCode 169. 多数元素】java实现
    LeetCode169.多数元素题目描述给定一个大小为n的数组nums,找到其中的多数元素。多数元素是指在数组中出现次数大于n/2的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:nums=[3,2,3]输出:3示例2:输入:nums=[2,2,1,1,1,2,......
  • Oracle生成awr报告操作步骤
    1、cmd命令窗口 以sysdba身份登录Oracle 2、执行@?/rdbms/admin/awrrpt命令,并选择报告类型为HTML。输入天数以选择生成报告的时间段,一般默认为最近7天。输入报告开始和结束时间对应的快照ID。输入报告名称,如awr.html,系统将自动生成并显示报告名。 3.查看AWR报告。AWR报告......
  • AI文本生成视频工具CogVideoX部署到华为昇腾NPU的详细步骤
    CogVideoX是智谱AI开发的视频生成大模型。无需复杂的视频制作技能和工具,能够将文本描述或静态图片转化为高质量、具有视觉吸引力的动态视频。https://github.com/THUDM/CogVideo 一、部署到昇腾NPU昇腾环境:芯片类型:昇腾910B3CANN版本:CANN7.0.1.5驱动版本:23.0.6操作系......