线性回归之最小二乘法(使用QChart画线,伸手党福利)

最简单的拟合:

直接上代码

MainWindow.c中:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QtCharts/QChart"
#include "QLineSeries"
#include "QValueAxis"
#include "QTimer"
#include "QTime"
#include "QList"
#include "qmath.h"
#include "QPointF"
#include "QDebug"

//#include 
#include "QChartView"
QT_CHARTS_USE_NAMESPACE
QChart *m_chart;
QLineSeries *m_series;
#define LEN_MAX 4
//[0]=x,[1]=y
float buff[LEN_MAX][2] = {{6.3,12.36},{3.3,22.84},{5.3,15.48},{4.3,18.72}};

void calculate(float *slop,float *Intercept)
{
    float fXY = 0, fXX = 0, fXA = 0, fYA = 0, fYY = 0;
    //得到平均值
    for(int i = 0;i < LEN_MAX;i++)
    {
        fXA += buff[i][0]/LEN_MAX;
        fYA += buff[i][1]/LEN_MAX;
    }
    //得到拟合所必需的数据
    for(int i = 0;i < LEN_MAX;i++)
    {
        fXY  += (buff[i][0] - fXA)*(buff[i][1] - fYA);
        fXX += (buff[i][0] - fXA)*(buff[i][0] - fXA);
        fYY += (buff[i][1] - fYA)*(buff[i][1] - fYA);
    }
    *slop = fXY / fXX;
    *Intercept = fYA - ((*slop) * fXA);
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    float slop,Intercept;
    calculate(&slop,&Intercept);
    qDebug() << slop << Intercept;

    //y=1.47x-0.76
    m_chart = new QChart;
    QChartView *chartView = new QChartView(m_chart);
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->setRubberBand(QChartView::RectangleRubberBand);

    m_series = new QLineSeries;
    m_chart->addSeries(m_series);

    QValueAxis *axisX = new QValueAxis;
    axisX->setRange(0,20);
    axisX->setLabelFormat("%g");
    axisX->setTitleText("axisX");

    QValueAxis *axisY = new QValueAxis;
    axisY->setRange(0,50);
    axisY->setTitleText("axisY");

    m_chart->setAxisX(axisX,m_series);
    m_chart->setAxisY(axisY,m_series);
    m_chart->legend()->hide();
    m_chart->setTitle("demo");

    QVBoxLayout *layout = ui->verticalLayout;
    layout->addWidget(chartView);
    QVector points;
    points.append(QPoint(0,Intercept));
    points.append(QPoint(-(Intercept/slop),0));
    qDebug() << points;
    if(Intercept > 0)
        ui->label->setText(QString("y = %1x + %2").arg(slop).arg(Intercept));
    else
        ui->label->setText(QString("y = %1x - %2").arg(slop).arg(Intercept));
    m_series->replace(points);
}
.pro文件添加:QT += charts
其他没有任何东西

现象:

excel表格生成的:

线性回归之最小二乘法(使用QChart画线,伸手党福利)_第1张图片

Qt生成:

线性回归之最小二乘法(使用QChart画线,伸手党福利)_第2张图片

基本无差异

你可能感兴趣的:(Qt)