首页 > 编程语言 >二元分类算法:逻辑回归实现与应用

二元分类算法:逻辑回归实现与应用

时间:2024-11-06 11:20:48浏览次数:3  
标签:逻辑 二元 int double 回归 算法 weights 模型

 

在机器学习领域,二元分类(Binary Classification) 是一种常见的任务,其目的是将输入数据分为两个类别。例如,垃圾邮件分类、疾病预测等都是典型的二元分类问题。常见的二元分类算法有 逻辑回归(Logistic Regression)支持向量机(SVM)决策树(Decision Trees)随机森林(Random Forest) 等。

本文将重点介绍 逻辑回归,并通过 C# 代码示例,带你一步步实现一个简单的二元分类模型。

什么是逻辑回归?

逻辑回归是一种广泛使用的二元分类算法,它基于 概率论,旨在通过学习特征和标签之间的关系,预测输入数据属于哪一类。与线性回归不同,逻辑回归的目标是输出一个属于某一类别的概率值,而不是直接输出一个连续的数值。

逻辑回归的基本原理:

逻辑回归的核心思想是通过 Sigmoid函数(也称为逻辑函数)将模型的线性输出转化为概率值,输出值范围在 0 和 1 之间,表示某个样本属于某个类别的概率。

Sigmoid函数公式:

 

其中,( z ) 是线性模型的输出。通过这个函数,我们可以将线性回归模型的输出映射到一个概率值,表示某个样本属于类别 1 的概率。

逻辑回归的训练过程

训练一个逻辑回归模型的核心任务是通过 梯度下降 优化模型的参数。梯度下降是一种通过反向传播误差来调整模型参数的方法,使得模型的预测结果尽量接近实际值。

C# 实现逻辑回归

下面是一个简单的 C# 代码示例,展示了如何使用逻辑回归算法来解决二元分类问题。该代码通过梯度下降算法训练逻辑回归模型,并对新样本进行预测。

代码实现:

using System;

class LogisticRegression
{
   private double[] weights;
   private double learningRate;
   private int iterations;

   // 构造函数
   public LogisticRegression(double learningRate, int iterations)
  {
       this.learningRate = learningRate;
       this.iterations = iterations;
  }

   // Sigmoid 函数
   private double Sigmoid(double z)
  {
       return 1.0 / (1.0 + Math.Exp(-z));
  }

   // 训练逻辑回归模型
   public void Train(double[,] X, double[] y)
  {
       int m = X.GetLength(0); // 样本数量
       int n = X.GetLength(1); // 特征数量

       // 初始化权重参数
       weights = new double[n];

       // 梯度下降迭代
       for (int i = 0; i < iterations; i++)
      {
           double[] gradients = new double[n];

           for (int j = 0; j < m; j++)
          {
               double predicted = Sigmoid(DotProduct(X, weights, j)); // 预测值
               double error = predicted - y[j];

               for (int k = 0; k < n; k++)
              {
                   gradients[k] += X[j, k] * error; // 计算梯度
              }
          }

           // 更新权重
           for (int k = 0; k < n; k++)
          {
               weights[k] -= (learningRate / m) * gradients[k]; // 使用梯度下降更新权重
          }
      }
  }

   // 预测
   public double Predict(double[] X)
  {
       double z = DotProduct(X, weights);
       return Sigmoid(z) >= 0.5 ? 1 : 0;
  }

   // 计算向量的点积
   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 }
      };

       // 标签 (0或1)
       double[] y = { 0, 0, 1, 1 };

       // 创建逻辑回归实例
       LogisticRegression model = new LogisticRegression(learningRate: 0.1, iterations: 1000);

       // 训练模型
       model.Train(X, y);

       // 预测新数据
       double[] newSample = { 2.5, 3.5 };
       double prediction = model.Predict(newSample);

       Console.WriteLine($"预测结果: {(prediction == 1 ? "类别1" : "类别0")}");
  }
}

代码解析:

  1. 训练数据

    • X 是一个二维数组,表示输入特征,每一行是一个样本,每一列是一个特征。

    • y 是标签数组,表示每个样本的实际类别(0 或 1)。

  2. 模型训练

    • LogisticRegression 类中实现了通过梯度下降法优化模型参数的过程。

    • 训练过程中,使用 Sigmoid函数 将线性模型的输出转化为概率值,再根据预测结果和实际标签的差异计算梯度,并通过梯度下降法调整模型参数。

  3. 模型预测

    • 训练完成后,使用训练得到的参数对新样本进行预测。通过判断预测概率是否大于 0.5 来确定样本的类别。

预测结果:

假设输入的训练数据包含了两类样本(0 和 1),训练完模型后,我们对一个新的样本进行预测。对于样本 { 2.5, 3.5 },程序的输出将是:

预测结果: 类别1

总结

通过上面的示例,我们展示了如何使用 逻辑回归 算法实现一个简单的二元分类模型。在实际应用中,逻辑回归是解决许多实际问题的重要工具,它不仅简单高效,而且易于理解和实现。通过逐步训练和优化模型,我们能够更准确地对新数据进行分类。

标签:逻辑,二元,int,double,回归,算法,weights,模型
From: https://www.cnblogs.com/forges/p/18529609

相关文章

  • CPU算法分析LiteAIServer视频智能分析平台视频智能分析:抖动、过亮与过暗检测技术
    随着科技的飞速发展,视频监控系统在各个领域的应用日益广泛。然而,视频质量的好坏直接影响到监控系统的效能,尤其是在复杂多变的光照条件下和高速数据传输中,视频画面常常出现抖动、过亮或过暗等问题,导致监控视频难以提供有效的信息。为了解决这些挑战,视频智能分析平台LiteAIServer引入......
  • 双路快速排序和三路排序算法
    双路快速排序一、概念及其介绍双路快速排序算法是随机化快速排序的改进版本,partition过程使用两个索引值(i、j)用来遍历数组,将 <v 的元素放在索引i所指向位置的左边,而将 >v 的元素放在索引j所指向位置的右边,v 代表标定值。二、适用说明时间和空间复杂度同随机化快速排......
  • 【多微电网】基于粒子群优化算法的面向配电网的多微电网协调运行与优化(Matlab代码实现
     ......
  • Vuex进行两个页面逻辑交互
    问题当一个页面由两个Vue文件构成的时候,如果在一个vue文件的时候进行了操作,那么需要将操作得到的数据传递给另外一个文件,那么另外页面就需要能够监听到前面这个页面的数据变化解决方案其实解决的方案就是通过vuex来进行实现,步骤如下:页面1当点击提交按钮的时候,调用vuex的......
  • 《XGBoost算法的原理推导》12-1加法模型表达式 公式解析
    本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。公式(12-1)是XGBoost的加法模型表达式,用于描述如何通过多个基模型的组合来进行预测。我们来逐步解析这个公式。公式(12-1)的形式......
  • 排序算法详细总结
    算法定义:算法是解决特定问题的明确步骤集合。算法的效率通常用时间复杂度和空间复杂度来衡量。排序算法定义:排序算法是计算机科学中用于对元素序列进行排序的一系列算法。排序算法在各种应用中都非常常见,从简单的数据处理到复杂的数据库和搜索引擎优化。分类:冒泡排序(Bubb......
  • 7.10 已知一组观测数据,如表中7.17.excel(表中第一列为x的值,第二列为y的值)。试用插值方
    importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromscipy.interpolateimportinterp1d,PchipInterpolator,CubicSplinefromscipy.optimizeimportcurve_fitfromscipy.statsimportnormfile_path='7.17.xlsx'data=pd.rea......
  • K-means 聚类算法的简单理解
    K-means聚类算法的简单理解1.K-means算法的流程(1)确定KKK值(2)初始化簇中心(3)分配簇(4)......
  • 代码随想录算法训练营第十六天|leetcode513.找树左下角的值、leetcode112.路径总和、l
    1leetcode513.找树左下角的值题目链接:513.找树左下角的值-力扣(LeetCode)文章链接:代码随想录视频链接:怎么找二叉树的左下角?递归中又带回溯了,怎么办?|LeetCode:513.找二叉树左下角的值_哔哩哔哩_bilibili思路:就是用一个东西存储result,使用后续遍历,如果遇到了最深的那一个值,就......
  • 【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)
    目录1、题目链接相似题目:2、题目3、解法函数头-----找出重复子问题函数体---解决子问题4、代码1、题目链接106.从中序与后序遍历序列构造二叉树(LeetCode)相似题目:105.从前序与中序遍历序列构造二叉树889.根据前序和后序遍历构造二叉树(LeetCode)2、题目3、解法......