一元线性回归

提供三个不同的计算方法

C#代码实现:

using System;
using System.Collections.Generic;
 
namespace LinearRegression
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Point> _PList = new List<Point>();
            _PList.Add(new Point(1, 3.09));
            _PList.Add(new Point(2, 5.06));
            _PList.Add(new Point(3, 7.03));
            _PList.Add(new Point(4, 9.12));
            _PList.Add(new Point(5, 10.96));
            _PList.Add(new Point(6, 12.91));
            _PList.Add(new Point(7, 15.01));
 
            Line line = LinearRegressionSolve(_PList);
            Console.WriteLine("Y = " + line.K + " X " + "+ " + line.B);
 
            line = LinearRegressionSolve2(_PList);
            Console.WriteLine("Y = " + line.K + " X " + "+ " + line.B);
 
            line = LinearRegressionSolve3(_PList);
            Console.WriteLine("Y = " + line.K + " X " + "+ " + line.B);
            Console.ReadKey();
        }
 
        static Line LinearRegressionSolve(List<Point> _plist)
        {
            double k = 0, b = 0;
            double sumX = 0, sumY = 0;
            double avgX = 0, avgY = 0;
            foreach (var v in _plist)
            {
                sumX += v.X;
                sumY += v.Y;
            }
            avgX = sumX / (_plist.Count + 0.0);
            avgY = sumY / (_plist.Count + 0.0);
 
            //sumA=(x-avgX)(y-avgY)的和 sumB=(x-avgX)平方
            double sumA = 0, sumB = 0;
            foreach (var v in _plist)
            {
                sumA += (v.X - avgX) * (v.Y - avgY);
                sumB += (v.X - avgX) * (v.X - avgX);
            }
            k = sumA / (sumB + 0.0);
            b = avgY - k * avgX;
 
            Line line = new Line(k, b);
            return line;
        }
 
        static Line LinearRegressionSolve2(List<Point> _plist)
        {
            double k = 0, b = 0;
            double sumX = 0, sumY = 0;
            double sumXY = 0, sumXX = 0;
            foreach (var v in _plist)
            {
                sumX += v.X;
                sumY += v.Y;
                sumXY += v.X * v.Y;
                sumXX += v.X * v.X;
            }
 
            k = (sumX * sumY / (_plist.Count + 0.0) - sumXY) / (sumX * sumX / (_plist.Count + 0.0) - sumXX);
            b = (sumY - k * sumX) / (_plist.Count + 0.00);
 
            Line line = new Line(k, b);
            return line;
        }
 
        static Line LinearRegressionSolve3(List<Point> _plist)
        {
            double k = 0, b = 0;
            double sumX = 0, sumY = 0;
            double avgX = 0, avgY = 0;
            double sumXY = 0, sumXX = 0;
            foreach (var v in _plist)
            {
                sumX += v.X;
                sumY += v.Y;
                sumXY += v.X * v.Y;
                sumXX += v.X * v.X;
            }
            avgX = sumX / (_plist.Count + 0.0);
            avgY = sumY / (_plist.Count + 0.0);
 
            k = (sumXY-avgY*sumX) / (sumXX - avgX * sumX);
            b = avgY - k * avgX;
 
            Line line = new Line(k, b);
            return line;
        }
 
    }
 
    public class Line
    {
        public double K { get; set; }
        public double B { get; set; }
 
        public Line(double k, double b)
        {
            K = k;
            B = b;
        }
    }
 
    public class Point
    {
        public double X { get; set; }
        public double Y { get; set; }
 
        public Point(double x, double y)
        {
            X = x;
            Y = y;
        }
    }
 
}


原文链接:https://blog.csdn.net/hebizhi1997/article/details/84305658

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值