目的:训练模型判断一个整数是否为正数。(单一参数)
原理部分参考:逻辑回归原理详细推导_小白白的博客-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>
预测结果: