简介
线性回归是经典的求解回归问题的机器学习算法,得益于其较强的可解释性,线性回归广泛的应用在各种需求预测场景下。
线性回归的基本形式
线性回归通过一组x的形象加权计算来得到最终的预测y。即,这里为了表示简便,将截距项放入到了x中。
线性回归的损失函数
根据上面线性回归的基本形式不难得出,只要尽量减少预测值与真实值之间的差异就能够得到最佳参数,即。由于线性回归的SSELoss是凸函数,所以可以根据公式得到的求解公式:。
使用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