基于c++和NumCpp简单实现线性回归

简介

       线性回归是经典的求解回归问题的机器学习算法,得益于其较强的可解释性,线性回归广泛的应用在各种需求预测场景下。

线性回归的基本形式

        线性回归通过一组x的形象加权计算来得到最终的预测y。即\hat{y}=\sum x_i*\alpha_i,这里为了表示简便,将截距项放入到了x中。

线性回归的损失函数

        根据上面线性回归的基本形式不难得出,只要尽量减少预测值与真实值之间的差异就能够得到最佳参数,即SSELoss=\sum (y_i-\hat y)^2。由于线性回归的SSELoss是凸函数,所以可以根据公式得到\alpha_i的求解公式:\hat \alpha =(X^T*X).inv()*X^T*y

使用c++和NumCpp实现线性回归

代码比较简单,主要是linear_regression.hpp的功能实现。

//
// Created by EDY on 2023/8/3.
//

#ifndef MLIMPLS_LINEAR_REGRESSION_HPP
#define MLIMPLS_LINEAR_REGRESSION_HPP

/**
 * 线性回归的工具类
 */

#include "NumCpp.hpp"
#include <iostream>

using std::cout;
using std::endl;

// 全局参数定义
const int g_linear_regression_x_size = 10;  // 特征数量
const int g_linear_regression_size = 200;   // 模拟的数据集大小
const auto g_linear_regression_beta = nc::arange<double>(1.0, g_linear_regression_x_size + 1, 1.0).reshape(
        nc::Shape(-1, 1)); // x 的系数

// 生成模拟的数据集
nc::NdArray<double> linear_regression_dataset() {
    auto x = nc::random::normal<double>(nc::Shape(g_linear_regression_size, g_linear_regression_x_size), 0,
                                        3);
    auto y = x.dot(g_linear_regression_beta);
    auto dataset = nc::concatenate({x, y}, nc::Axis::COL);
    return dataset;
}

// 求解
auto linear_regression_solve(const nc::NdArray<double> &dataset) {
    auto x = dataset(dataset.rSlice(), nc::Slice(0, dataset.numCols() - 1));
    auto y = dataset(dataset.rSlice(), dataset.numCols() - 1);
    auto solution = nc::linalg::inv(x.transpose().dot(x)).dot(x.transpose()).dot(y);
    cout << solution << endl;
    return solution;
}


#endif //MLIMPLS_LINEAR_REGRESSION_HPP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现简单线性回归的示例代码: ```cpp #include <iostream> #include <vector> #include <numeric> #include <cmath> using namespace std; // 计算均值 double mean(const vector<double>& v) { double sum = accumulate(v.begin(), v.end(), 0.0); return sum / v.size(); } // 计算方差 double variance(const vector<double>& v) { double m = mean(v); double sum = 0.0; for (double x : v) { sum += pow(x - m, 2); } return sum / (v.size() - 1); } // 计算协方差 double covariance(const vector<double>& x, const vector<double>& y) { double x_mean = mean(x); double y_mean = mean(y); double sum = 0.0; for (int i = 0; i < x.size(); ++i) { sum += (x[i] - x_mean) * (y[i] - y_mean); } return sum / (x.size() - 1); } // 计算斜率和截距 void linear_regression(const vector<double>& x, const vector<double>& y, double& slope, double& intercept) { slope = covariance(x, y) / variance(x); intercept = mean(y) - slope * mean(x); } int main() { vector<double> x {1, 2, 3, 4, 5}; vector<double> y {1, 3, 2, 3, 5}; double slope, intercept; linear_regression(x, y, slope, intercept); cout << "Slope: " << slope << endl; cout << "Intercept: " << intercept << endl; return 0; } ``` 这里我们使用了 `vector` 存储数据,并使用 `accumulate`、`pow` 等函数计算数学运算。`mean` 函数用于计算均值,`variance` 函数用于计算方差,`covariance` 函数用于计算协方差,`linear_regression` 函数用于计算斜率和截距,从而得到线性回归模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值