翼度科技»论坛 编程开发 .net 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
 

在机器学习领域,二元分类(Binary Classification) 是一种常见的任务,其目的是将输入数据分为两个类别。例如,垃圾邮件分类、疾病预测等都是典型的二元分类问题。常见的二元分类算法有 逻辑回归(Logistic Regression)支持向量机(SVM)决策树(Decision Trees)随机森林(Random Forest) 等。
本文将重点介绍 逻辑回归,并通过 C# 代码示例,带你一步步实现一个简单的二元分类模型。
什么是逻辑回归?

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

逻辑回归的核心思想是通过 Sigmoid函数(也称为逻辑函数)将模型的线性输出转化为概率值,输出值范围在 0 和 1 之间,表示某个样本属于某个类别的概率。
Sigmoid函数公式:
 其中,( z ) 是线性模型的输出。通过这个函数,我们可以将线性回归模型的输出映射到一个概率值,表示某个样本属于类别 1 的概率。
逻辑回归的训练过程

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

下面是一个简单的 C# 代码示例,展示了如何使用逻辑回归算法来解决二元分类问题。该代码通过梯度下降算法训练逻辑回归模型,并对新样本进行预测。
代码实现:
  1. using System;<br>​<br>class LogisticRegression<br>{<br>    private double[] weights;<br>    private double learningRate;<br>    private int iterations;<br>​<br>    // 构造函数<br>    public LogisticRegression(double learningRate, int iterations)<br>    {<br>        this.learningRate = learningRate;<br>        this.iterations = iterations;<br>    }<br>​<br>    // Sigmoid 函数<br>    private double Sigmoid(double z)<br>    {<br>        return 1.0 / (1.0 + Math.Exp(-z));<br>    }<br>​<br>    // 训练逻辑回归模型<br>    public void Train(double[,] X, double[] y)<br>    {<br>        int m = X.GetLength(0); // 样本数量<br>        int n = X.GetLength(1); // 特征数量<br>​<br>        // 初始化权重参数<br>        weights = new double[n];<br>​<br>        // 梯度下降迭代<br>        for (int i = 0; i < iterations; i++)<br>        {<br>            double[] gradients = new double[n];<br>​<br>            for (int j = 0; j < m; j++)<br>            {<br>                double predicted = Sigmoid(DotProduct(X, weights, j)); // 预测值<br>                double error = predicted - y[j];<br>​<br>                for (int k = 0; k < n; k++)<br>                {<br>                    gradients[k] += X[j, k] * error; // 计算梯度<br>                }<br>            }<br>​<br>            // 更新权重<br>            for (int k = 0; k < n; k++)<br>            {<br>                weights[k] -= (learningRate / m) * gradients[k]; // 使用梯度下降更新权重<br>            }<br>        }<br>    }<br>​<br>    // 预测<br>    public double Predict(double[] X)<br>    {<br>        double z = DotProduct(X, weights);<br>        return Sigmoid(z) >= 0.5 ? 1 : 0;<br>    }<br>​<br>    // 计算向量的点积<br>    private double DotProduct(double[,] X, double[] weights, int rowIndex)<br>    {<br>        double sum = 0;<br>        int n = X.GetLength(1);<br>        for (int i = 0; i < n; i++)<br>        {<br>            sum += X[rowIndex, i] * weights[i];<br>        }<br>        return sum;<br>    }<br>​<br>    // 计算向量的点积(简化版)<br>    private double DotProduct(double[] X, double[] weights)<br>    {<br>        double sum = 0;<br>        for (int i = 0; i < X.Length; i++)<br>        {<br>            sum += X[i] * weights[i];<br>        }<br>        return sum;<br>    }<br>}<br>​<br>class Program<br>{<br>    static void Main()<br>    {<br>        // 训练数据 (2个特征)<br>        // 每一行表示一个样本,列表示特征<br>        double[,] X = {<br>            { 1.0, 2.0 },<br>            { 2.0, 3.0 },<br>            { 3.0, 4.0 },<br>            { 4.0, 5.0 }<br>        };<br>​<br>        // 标签 (0或1)<br>        double[] y = { 0, 0, 1, 1 };<br>​<br>        // 创建逻辑回归实例<br>        LogisticRegression model = new LogisticRegression(learningRate: 0.1, iterations: 1000);<br>​<br>        // 训练模型<br>        model.Train(X, y);<br>​<br>        // 预测新数据<br>        double[] newSample = { 2.5, 3.5 };<br>        double prediction = model.Predict(newSample);<br>​<br>        Console.WriteLine($"预测结果: {(prediction == 1 ? "类别1" : "类别0")}");<br>    }<br>}
复制代码
代码解析:


  • 训练数据

    • X 是一个二维数组,表示输入特征,每一行是一个样本,每一列是一个特征。
    • y 是标签数组,表示每个样本的实际类别(0 或 1)。

  • 模型训练

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

  • 模型预测

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

预测结果:

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

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

来源:https://www.cnblogs.com/forges/p/18529609
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具