C#语言实现最小二乘法算法

news2024/9/22 13:45:57

 最小二乘法(Least Squares Method)是一种常用的拟合方法,用于在数据点之间找到最佳的直线(或其他函数)拟合。以下是一个用C#实现简单线性回归(即一元最小二乘法)的示例代码。

1. 最小二乘法简介

对于一组数据点 (x1,y1),(x2,y2),…,(xn,yn)(x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n)(x1​,y1​),(x2​,y2​),…,(xn​,yn​),最小二乘法通过最小化误差平方和来找到最佳拟合直线 y=ax+by = ax + by=ax+b,其中:

  • aaa 是斜率
  • bbb 是截距

误差平方和 SSS 定义为:

S=∑i=1n(yi−(axi+b))2S = \sum_{i=1}^{n} (y_i - (ax_i + b))^2S=∑i=1n​(yi​−(axi​+b))2

通过求导并设导数为零,可以得到斜率 aaa 和截距 bbb 的公式:

a=n∑xiyi−∑xi∑yin∑xi2−(∑xi)2a = \frac{n\sum{x_i y_i} - \sum{x_i}\sum{y_i}}{n\sum{x_i^2} - (\sum{x_i})^2}a=n∑xi2​−(∑xi​)2n∑xi​yi​−∑xi​∑yi​​ b=∑yi−a∑xinb = \frac{\sum{y_i} - a\sum{x_i}}{n}b=n∑yi​−a∑xi​​

2. C#实现代码

using System;
using System.Collections.Generic;
using System.Linq;

namespace LeastSquaresMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            // 示例数据点
            List<DataPoint> dataPoints = new List<DataPoint>
            {
                new DataPoint(1, 2),
                new DataPoint(2, 3),
                new DataPoint(3, 5),
                new DataPoint(4, 4),
                new DataPoint(5, 6)
            };

            // 计算最小二乘法拟合结果
            var result = LeastSquaresFit(dataPoints);

            Console.WriteLine($"拟合直线: y = {result.Slope:F4}x + {result.Intercept:F4}");

            // 可选:计算拟合优度(R²)
            double rSquared = CalculateRSquared(dataPoints, result.Slope, result.Intercept);
            Console.WriteLine($"拟合优度 (R²): {rSquared:F4}");
        }

        // 数据点结构
        public class DataPoint
        {
            public double X { get; set; }
            public double Y { get; set; }

            public DataPoint(double x, double y)
            {
                X = x;
                Y = y;
            }
        }

        // 拟合结果结构
        public class FitResult
        {
            public double Slope { get; set; }
            public double Intercept { get; set; }
        }

        // 最小二乘法拟合函数
        public static FitResult LeastSquaresFit(List<DataPoint> points)
        {
            int n = points.Count;
            double sumX = points.Sum(p => p.X);
            double sumY = points.Sum(p => p.Y);
            double sumXY = points.Sum(p => p.X * p.Y);
            double sumX2 = points.Sum(p => p.X * p.X);

            double denominator = n * sumX2 - sumX * sumX;
            if (denominator == 0)
            {
                throw new InvalidOperationException("无法计算拟合参数,因为分母为零。");
            }

            double slope = (n * sumXY - sumX * sumY) / denominator;
            double intercept = (sumY - slope * sumX) / n;

            return new FitResult { Slope = slope, Intercept = intercept };
        }

        // 计算拟合优度 R²
        public static double CalculateRSquared(List<DataPoint> points, double slope, double intercept)
        {
            double meanY = points.Average(p => p.Y);
            double ssTot = points.Sum(p => Math.Pow(p.Y - meanY, 2));
            double ssRes = points.Sum(p => Math.Pow(p.Y - (slope * p.X + intercept), 2));

            return 1 - (ssRes / ssTot);
        }
    }
}

3. 代码说明

  1. 数据结构:

    • DataPoint 类用于存储单个数据点的 xxx 和 yyy 值。
    • FitResult 类用于存储拟合直线的斜率和截距。
  2. LeastSquaresFit 方法:

    • 计算所需的各类求和,如 ∑x\sum{x}∑x、∑y\sum{y}∑y、∑xy\sum{xy}∑xy 和 ∑x2\sum{x^2}∑x2。
    • 使用最小二乘法公式计算斜率 aaa 和截距 bbb。
    • 返回包含斜率和截距的 FitResult 对象。
  3. CalculateRSquared 方法:

    • 计算拟合优度 R2R^2R2,表示模型对数据的解释程度。
    • R2R^2R2 值越接近1,表示拟合效果越好。
  4. Main 方法:

    • 创建示例数据点。
    • 调用 LeastSquaresFit 方法进行拟合。
    • 输出拟合直线方程。
    • 计算并输出拟合优度 R2R^2R2。

4. 运行结果示例

运行上述代码,可能得到如下输出:

拟合直线: y = 0.8000x + 1.2000
拟合优度 (R²): 0.8205

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kubernetes】金丝雀部署

概念&#xff1a; 金丝雀发布&#xff08;又称灰度发布、灰度更新&#xff09;&#xff1a;金丝雀发布一般先发1台&#xff0c;或者一个小比例&#xff0c;例如2%的服务器&#xff0c;主要做流量验证用&#xff0c;也称为金丝雀 (Canary) 测试 &#xff08;国内常称灰度测试&a…

一文读懂Linux用户密码管理

目录 前言1. 基本知识2. 命令行 前言 作为全栈人员&#xff0c;对于Linux的账号密码管理也要熟知 下述文章直奔主题&#xff0c;直接讲解知识点 1. 基本知识 修改密码、查看密码哈希值、管理密码到期时间等 用户的密码和相关信息主要存储在两个文件中&#xff1a; /etc/pa…

随笔九、SARADC按键程控测试

目录 1. 泰山派环境 2. 按键3分析 3. 编程测试 1. 泰山派环境 泰山派开发板上有3个按键 按键1是电源按键PWRON&#xff0c;实测按几下会导致开发板重启 按键2是复位按键RESET&#xff0c;按下立马复位重启 按键3是升级按键RECOVER&#xff0c;配合RESET按键可以使开发板进…

现在做项目不看能力!

有人还在执着于能力&#xff0c;但当你多接触一些高手之后&#xff0c;你会发现他们想问题想得很透彻&#xff0c;什么能力&#xff0c;其实不重要。能力是辅助的&#xff0c;在互联网赚钱机会是更重要的&#xff0c;能力不是重点&#xff0c;优先的是执行力。执行力才是第一生…

泛微E9开发 获取浏览按钮的显示值

获取浏览按钮的显示值 1、显示效果2、实现方法3、标准API3.1.获取浏览按钮的显示值3.1.1.格式3.1.2.参数说明3.1.3.案例 3.2. 获取选择框字段的显示值3.2.1.获取选择框字段的显示值3.2.2.格式3.2.3.参数说明3.2.4.案例 1、显示效果 2、实现方法 <script>debugger;var tb…

IO练习:用信号实现司机和售票员问题

【1】问题描述 1&#xff09;售票员捕捉SIGINT&#xff08;代表开车&#xff09;信号&#xff0c;向司机发送SIGUSR1信号&#xff0c;司机打印&#xff08;lets gogogo&#xff09; 2&#xff09;售票员捕捉SIGQUIT&#xff08;代表停车&#xff09;信号&#xff0c;向司机发送…

x-cmd pkg | lazydocker - Docker 和 docker-compose 的 Terminal UI

目录 简介快速上手功能特点竞品和相关项目进一步探索 简介 lazydocker 是由 Jesse Duffield 用 Go 语言开发的 Docker 和 docker-compose 的 Terminal UI 管理工具。它提供 docker 的终端图形界面&#xff0c;支持鼠标操作和键盘快捷键&#xff0c;能实时监控 docker 容器&…

python简介及开发环境配置总结

参考&#xff1a;Python 基础教程 | 菜鸟教程 (runoob.com) Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。 Python 由 Guido van Rossum 于 1989 年底发明&#xff0c;第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU G…

国风高铁站可视化:传统文化与现代科技的融合

图扑国风高铁站可视化系统展示了浓厚的传统文化元素&#xff0c;结合现代科技&#xff0c;使旅客在便捷出行的同时体验独特的文化风情。高铁站可视化管理系统通过实时监控和数据分析&#xff0c;为车站运营人员提供全面、直观的管理工具&#xff0c;提升决策效率。

物联网架构之HBase

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

06.登录页面开发

1. 前言 前面已经完成了一些基础的配置&#xff0c;接下来开始进入真正的开发阶段。开发过程中会涉及到一些其它插件的集成&#xff0c;这里用到什么就记录一下使用的心得体会。 这里需要交代一下&#xff0c;项目里的文件命名规则&#xff0c;以及文件结构&#xff0c;views…

数学建模之入门篇

目录 什么是数学建模 建模、编程、写作 一、初步建模选择模型 二、进阶熟练掌握 1. 数学模型 线性规划 图与网络模型及方法 插值与拟合 灰色预测 动态规划 层次分析法 AHP 整数规划 目标规划模型 偏最小二乘回归 微分方程模型 博弈论 / 对策论 排队论模型 存…

Java笔试面试题AI答之面向对象(5)

文章目录 25. Java 包装类的实例是否可变&#xff1f;不可变类&#xff08;Immutable Classes&#xff09;特殊情况总结 26. 简述Java什么是自动装箱和自动拆箱&#xff1f;自动装箱&#xff08;Autoboxing&#xff09;自动拆箱&#xff08;Unboxing&#xff09;注意事项 27. J…

[译] APT分析报告:12.APT29利用spy软件供应商创建的IOS、Chrome漏洞

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

秒杀抢券很难吗?oneCoupon带你成为面试中的王牌

秒杀抢券很难吗&#xff1f;oneCoupon带你成为面试中的王牌 如果你在为简历上找不到亮眼的项目发愁&#xff0c;oneCoupon牛券可能就是你的救星。这个系统不仅高性能&#xff0c;还能承受十万次查询和分发请求。本文将带你走进oneCoupon牛券的世界&#xff0c;看看它是如何助力…

【C++】容器vector常用接口详解

目录 一.vector基本介绍 二.vector的构造&#xff08;constructor&#xff09; 三.vector迭代器&#xff08;iterator&#xff09; 四.vector的三种遍历 1.for循环 2.范围for 3.迭代器&#xff08;正向、反向&#xff09; 五. vector扩容操作 1.reserve 2.resize 六.…

自动化邮件发送:结合SMTP协议使用Python发送包含报表或数据附件的邮件

目录 引言 SMTP协议简介 Python中的smtplib模块 基本使用 发送带附件的邮件 自动化邮件发送系统设计 需求分析 系统架构 实现步骤 1. 准备数据源 2. 创建邮件模板 3. 编写邮件发送引擎 4. 设置调度器 5. 异常处理 示例应用&#xff1a;自动化发送报表邮件 总结…

6种有效的时间序列数据特征工程技术(使用Python)

在商业分析中&#xff0c;"时间"是一个核心概念。我们基于时间组件来分析销售数据、收入、利润、增长&#xff0c;甚至进行预测。然而&#xff0c;对于初学者来说&#xff0c;这可能是一个复杂的主题。在处理时间敏感的数据集时&#xff0c;需要考虑时间序列数据的多…

Vue3其他Api

1.shallowRef与shallowReactive <template><div class"app"><h2>求和为:{{ sum }}</h2><h2>名字为:{{ person.name }}</h2><h2>年龄为:{{ person.age }}</h2><button click"sum 1">sum1</butto…

【Docker系列】Docker 日志管理:批量删除策略与实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…