C# 一元线性回归算法及多元线性回归算法

By jerryxjr1220 at 2024-03-15 • 0人收藏 • 272人看过

最近项目中正好需要用到线性回归算法,整理如下:

//需要安装Nuget包 
using MathNet.Numerics.LinearAlgebra;

internal class Program
{
    static void Main(string[] args)
    {

        // 例子数据:y = 2x1 + 3x2 + 4x3
        var x = new double[,] {
            {1, 2, 3},
            {2, 3, 4},
            {3, 4, 5},
            {4, 5, 6},
            {5, 6, 7},
            {1, 1, 1},
            {1, 2, 1},
            {2, 1, 1},
            {1, 1, 2},
            {1, 2, 2},
            {2, 3, 4},
            {3, 4, 5},
            {4, 5, 6},
            {5, 6, 7},
            {1, 1, 1},
            {1, 2, 1},
            {2, 1, 1},
            {1, 1, 2},
            {1, 2, 2},
            {2, 3, 4},
            {3, 4, 5},
            {4, 5, 6},
            {5, 6, 7},
            {1, 1, 1},
            {1, 2, 1},
            {2, 1, 1},
            {1, 1, 2},
            {1, 2, 2},
        };

        var y = new double[] { 21, 29, 38, 47, 56, 9, 12, 11, 13, 16, 29, 38, 47, 56, 9, 12, 11, 13, 16, 29, 38, 47, 56, 9, 12, 11, 13, 16 };

        var weights = MultiRegression(x, y);

        Console.WriteLine("回归系数:");
        Console.WriteLine(weights);

        // 预测
        Vector<double> newFeature = Vector<double>.Build.Dense(new double[] { 1, 2, 2, 2 });
        double prediction = weights.DotProduct(newFeature);

        Console.WriteLine("预测值:");
        Console.WriteLine(prediction);
        Console.ReadKey();

    }

    public static Vector<double> MultiRegression(double[,] X_Mtx, double[] Y_Arr)
    {
        Matrix<double> features = Matrix<double>.Build.DenseOfArray(X_Mtx);
        Vector<double> labels = Vector<double>.Build.Dense(Y_Arr);
        Matrix<double> X = features.InsertColumn(0, Vector<double>.Build.Dense(features.RowCount, 1));
        Vector<double> weights = (X.Transpose() * X).Inverse() * X.Transpose() * labels;
        return weights;

    }


一元线性回归是多元线性回归的特例,所以

public static Vector<double> SingleRegression(double[] X_Arr, double[] Y_Arr)
{
    double[,] X_Mtx = new double[X_Arr.Length,2];
    for (int i = 0; i < X_Arr.Length; i++)
    {
        X_Mtx[i, 0] = 1;
        X_Mtx[i, 1] = X_Arr[i];
    }
    Matrix<double> X = Matrix<double>.Build.DenseOfArray(X_Mtx);
    Vector<double> labels = Vector<double>.Build.Dense(Y_Arr);
    Vector<double> weights = (X.Transpose() * X).Inverse() * X.Transpose() * labels;
    return weights;
}


1 个回复 | 最后更新于 2024-03-15
2024-03-15   #1

我大学数学不咋地

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...