OpenCV机器学习(5)逻辑回归算法cv::ml::LogisticRegression

发布于:2025-02-22 ⋅ 阅读:(11) ⋅ 点赞:(0)
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::ml::LogisticRegression 是 OpenCV 机器学习模块中的一个类,用于实现逻辑回归算法。逻辑回归是一种广泛应用于分类问题的统计方法,特别适合二分类任务。尽管名字中有“回归”二字,但它主要用于预测数据点属于某个类别的概率。

主要特性

  • 二分类:主要设计用于解决二分类问题。
  • 参数设置:允许用户配置学习率、迭代次数、正则化类型等参数以优化模型性能。
  • 正则化支持:支持 L2 正则化来防止过拟合,提高模型的泛化能力。

常用成员函数

以下是 cv::ml::LogisticRegression 类中一些常用的成员函数:

  • 创建 LogisticRegression 模型实例
    • Ptr create():创建一个新的 LogisticRegression 模型实例。
  • 设置模型参数
    • setLearningRate(double learning_rate):设置学习率,默认值为 0.001。
    • setIterations(int iterations):设置最大迭代次数,默认值为 1000。
    • setRegularization(int regularization):设置正则化类型(如 LogisticRegression::REG_L2)。
    • setMiniBatchSize(int size):设置小批量梯度下降的批量大小。
  • 训练模型
    • train(const Ptr& trainData, int flags=0):使用提供的训练数据进行训练。
    • train(InputArray samples, int layout, InputArray responses):另一种形式的训练函数,直接接受样本和响应矩阵作为输入。
  • 预测
  • predict(InputArray samples, OutputArray results=noArray(), int flags=0) const:对新样本进行预测,并返回每个样本的类别标签或概率值(取决于标志)。
  • 保存与加载模型
    • save(const String& filename):将模型保存到文件。
    • load(const String& filename):从文件加载模型。

代码示例

#include <opencv2/opencv.hpp>
#include <opencv2/ml.hpp>
#include <iostream>

using namespace cv;
using namespace cv::ml;
using namespace std;

int main() {
    // 准备训练数据
    Mat samples = (Mat_<float>(4, 2) << 
        0.5, 1.0,
        1.0, 1.5,
        2.0, 0.5,
        1.5, 0.0);
    
    // 注意:将标签转换为浮点数类型
    Mat responses = (Mat_<float>(4, 1) << 0.0, 0.0, 1.0, 1.0); // 确保是浮点数

    // 创建并配置 LogisticRegression 模型
    Ptr<LogisticRegression> lr_model = LogisticRegression::create();
    lr_model->setLearningRate(0.01); // 设置学习率
    lr_model->setIterations(1000);   // 设置最大迭代次数
    lr_model->setRegularization(LogisticRegression::REG_L2); // 使用L2正则化

    // 训练模型
    bool ok = lr_model->train(samples, ROW_SAMPLE, responses);
    if (ok) {
        // 保存模型
        lr_model->save("lr_model.yml");

        // 对新样本进行预测
        Mat sample = (Mat_<float>(1, 2) << 1.6, 0.7);
        float response = lr_model->predict(sample);

        cout << "The predicted response for the sample is: " << response << endl;
    } else {
        cerr << "Training failed!" << endl;
    }

    return 0;
}

运行结果

The predicted response for the sample is: 1


网站公告

今日签到

点亮在社区的每一天
去签到