[opencv4/c++]利用opencv进行简单的逻辑回归

目的:训练模型判断一个整数是否为正数。(单一参数)

原理部分参考:逻辑回归原理详细推导_小白白的博客-CSDN博客_逻辑回归推导

代码:

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

using namespace cv;

int main() {
    Mat labels = (Mat_<char>(8,1) << 1, 0 ,1,0, 0, 0, 0, 0); 
    //标签,决定某个数据满足目的(1)与否(0)
    Mat data = (Mat_<char>(8,1) << 1, -1 ,30,-60, -70, -10, -12, -100); //数据集
    data.convertTo(data, CV_32F);
    labels.convertTo(labels, CV_32F);
    auto model = ml::LogisticRegression::create();
    model->setIterations(100); //设置梯度下降迭代次数
    model->setLearningRate(0.001); //学习率α grad = θi - α * dJ(θi)/dθi
    model->setMiniBatchSize(1);
    model->setTrainMethod(cv::ml::LogisticRegression::MINI_BATCH); 
    //训练方法,BATCH OR MINI_BATCH
    model->setRegularization(ml::LogisticRegression::REG_DISABLE); 
    //不正则化,即不启用代价惩罚
    model->train(data,cv::ml::ROW_SAMPLE,labels);  //对数据集按行读取进行训练
    model->save("D:\\model.xml");
    Ptr<cv::ml::LogisticRegression> lr = ml::LogisticRegression::load("D:\\model.xml");

    //测试
    Mat result;
    Mat test = (Mat_<float>(4,1) << 1,-1,0,30); 
    // data_t.cols == thetas.cols 列个数应等于模型参数theta个数
    lr->predict(test, result);

    std::cout << "result: " << result << std::endl;
    return 0;
}

输出模型:

<?xml version="1.0"?>
<opencv_storage>
<opencv_ml_lr>
  <format>3</format>
  <classifier>"Logistic Regression Classifier"</classifier>
  <alpha>1.0000000000000000e-03</alpha>
  <iterations>100</iterations>
  <norm>-1</norm>
  <train_method>1</train_method>
  <mini_batch_size>1</mini_batch_size>
  <learnt_thetas type_id="opencv-matrix">
    <rows>1</rows>
    <cols>2</cols>
    <dt>f</dt>
    <data>
      -1.64816324e-02 3.72325838e-01</data></learnt_thetas>
  <n_labels type_id="opencv-matrix">
    <rows>2</rows>
    <cols>1</cols>
    <dt>i</dt>
    <data>
      0 1</data></n_labels>
  <o_labels type_id="opencv-matrix">
    <rows>2</rows>
    <cols>1</cols>
    <dt>i</dt>
    <data>
      0 1</data></o_labels></opencv_ml_lr>
</opencv_storage>
 

预测结果:

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值