用C#实现最小二乘法(用OxyPlot绘图)

最小二乘法介绍✨

最小二乘法(Least Squares Method)是一种常见的数学优化技术,广泛应用于数据拟合、回归分析和参数估计等领域。其目标是通过最小化残差平方和来找到一组参数,使得模型预测值与观测值之间的差异最小化。

最小二乘法的原理✨

线性回归模型将因变量 (y) 与至少一个自变量 (x) 之间的关系建立为:

image-20240118105946580

在 OLS 方法中,我们必须选择一个b1和b0的值,以便将 y 的实际值和拟合值之间的差值的平方和最小化。

平方和的公式如下:

image-20240118110247858

我们可以把它看成是一个关于b1和b0的函数,分别对b1和b0求偏导,然后让偏导等于0,就可以得到最小平方和对应的b1和b0的值。

先说结果,斜率最后推导出来如下所示:

截距推导出来结果如下:

don’t worry about that,慢慢推导总是可以弄明白的(不感兴趣可以直接略过):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最小二乘法推导2

最小二乘法推导3

用C#实现最小二乘法✨

创建数据点✨

首先创建想要拟合的数据点:

 NDArray? x, y;

x,y为全局变量。

  //使用NumSharp创建线性回归的数据集x = np.arange(0, 10, 0.2);y = 2 * x + 3 + np.random.normal(0, 3, x.size);

使用到了NumSharp,需要为项目添加NumSharp包:

image-20240120100221733

 x = np.arange(0, 10, 0.2);

的意思是x从0增加到10(不包含10),步长为0.2:

image-20240120100455351

np.random.normal(0, 3, x.size);

的意思是生成了一个均值为0,标准差为3,数量与x数组长度相同的正态分布随机数数组。这个数组被用作线性回归数据的噪声。

使用OxyPlot画散点图✨

OxyPlot是一个用于在.NET应用程序中创建数据可视化图表的开源图表库。它提供了丰富的功能和灵活性,使开发者能够轻松地在其应用程序中集成各种类型的图表,包括折线图、柱状图、饼图等。

image-20240120101110294

添加OxyPlot.WindowsForms包:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将PlotView控件添加到窗体设计器上:

image-20240120101340414

// 初始化散点图数据
var scatterSeries = new ScatterSeries
{MarkerType = MarkerType.Circle,MarkerSize = 5,MarkerFill = OxyColors.Blue
};

表示标志为圆形,标志用蓝色填充,标志的大小为5。

  for (int i = 0; i < x.size; i++){scatterSeries.Points.Add(new ScatterPoint(x[i], y[i]));}

添加数据点。

 PlotModel? plotModel;

将plotModel设置为全局变量。

 // 创建 PlotModelplotModel = new PlotModel(){Title = "散点图"};plotModel.Series.Add(scatterSeries);// 将 PlotModel 设置到 PlotViewplotView1.Model = plotModel;

这样就成功绘制了散点图,效果如下所示:

image-20240120102920929

使用最小二乘法拟合数据点✨

double a = 0;
double c = 0;double x_mean = x?.mean();
double y_mean = y?.mean();//计算a和c
for(int i = 0; i < x?.size; i++) 
{a += (x[i] - x_mean) * (y?[i] - y_mean);c += (x[i] - x_mean) * (x[i] - x_mean);
}//计算斜率和截距
double m = a / c;
double b = y_mean - m * x_mean;//拟合的直线
var y2 = m * x + b;

套用公式就可以,a表示上面斜率公式的上面那部分,c表示上面斜率公式的下面那部分。

double x_mean = x?.mean();
double y_mean = y?.mean();

计算x与y的平均值。

使用OxyPlot画拟合出来的直线✨

 //画这条直线         var lineSeries = new LineSeries{Points = { new DataPoint(x?[0], y2[0]), new DataPoint(x?[-1], y2[-1]) },Color = OxyColors.Red};// 创建 PlotModel         plotModel?.Series.Add(lineSeries);// 为图表添加标题if (plotModel != null){plotModel.Title = $"拟合的直线 y = {m:0.00}x + {b:0.00}";}// 刷新 PlotViewplotView1.InvalidatePlot(true);
 Points = { new DataPoint(x?[0], y2[0]), new DataPoint(x?[-1], y2[-1]) },

画直线只要添加两个点就好了x?[0], y2[0]表示x和y的第一个点,x?[-1], y2[-1]) 表示x和y的最后一个点,使用了NumSharp的切片语法。

画出来的效果如下所示:

image-20240120103737259

C#实现的全部代码:

using NumSharp;
using OxyPlot.Series;
using OxyPlot;
namespace OlsRegressionDemoUsingWinform
{public partial class Form1 : Form{NDArray? x, y;PlotModel? plotModel;public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//使用NumSharp创建线性回归的数据集x = np.arange(0, 10, 0.2);y = 2 * x + 3 + np.random.normal(0, 3, x.size);// 初始化散点图数据var scatterSeries = new ScatterSeries{MarkerType = MarkerType.Circle,MarkerSize = 5,MarkerFill = OxyColors.Blue};for (int i = 0; i < x.size; i++){scatterSeries.Points.Add(new ScatterPoint(x[i], y[i]));}// 创建 PlotModelplotModel = new PlotModel(){Title = "散点图"};plotModel.Series.Add(scatterSeries);// 将 PlotModel 设置到 PlotViewplotView1.Model = plotModel;}private void button2_Click(object sender, EventArgs e){double a = 0;double c = 0;double x_mean = x?.mean();double y_mean = y?.mean();//计算a和cfor(int i = 0; i < x?.size; i++) {a += (x[i] - x_mean) * (y?[i] - y_mean);c += (x[i] - x_mean) * (x[i] - x_mean);}//计算斜率和截距double m = a / c;double b = y_mean - m * x_mean;//拟合的直线var y2 = m * x + b;//画这条直线         var lineSeries = new LineSeries{Points = { new DataPoint(x?[0], y2[0]), new DataPoint(x?[-1], y2[-1]) },Color = OxyColors.Red};// 创建 PlotModel         plotModel?.Series.Add(lineSeries);// 为图表添加标题if (plotModel != null){plotModel.Title = $"拟合的直线 y = {m:0.00}x + {b:0.00}";}// 刷新 PlotViewplotView1.InvalidatePlot(true);}}
}

用Python实现最小二乘法✨

import numpy as np
import matplotlib.pyplot as plt# 用最小二乘法拟合 y = mx + b# 设置随机数种子以保证结果的可复现性
np.random.seed(0)# 生成一个在[0, 10]区间内均匀分布的100个数作为x
x = np.linspace(0, 10, 100)# 生成y,y = 2x + 噪声,其中噪声是[0, 10)之间的随机整数
y = 2 * x + 5 + np.random.randint(0, 10, size=100)# 计算x和y的均值
x_mean = np.mean(x)
y_mean = np.mean(y)a = 0
c = 0for i in range(x.shape[0]):a += (x[i] - x_mean) * (y[i] - y_mean)c += (x[i] - x_mean) ** 2# 计算斜率和截距
m = a / c
b = y_mean - m * x_mean# 画这条直线
y2 = m * x + b
plt.plot(x, y2, color='red')# 画数据点
plt.scatter(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title(f'y = {m:.2f}x + {b:.2f}')
plt.show()

运行效果如下所示:

image-20240120104300224

总结✨

本文向大家介绍了最小二乘法以及公式推导的过程,并使用C#与Python进行实现。重点介绍了C#中是如何实现的,同时介绍了在C#中如何使用OxyPlot绘图。希望对你有所帮助。

参考✨

1、Understanding Ordinary Least Squares (OLS) Regression | Built In

2、Machine Learning Series-Linear Regression Ordinary Least Square Method - YouTube

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

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

相关文章

RSTP保护机制

BPDU保护 在交换设备上通常将直接与用户终端或文件服务器等非交换机设备相连的端口配置为边缘端口。 正常情况下&#xff0c;边缘端口不会收到RST BPDU。如果有人伪造RST BPDU恶意攻击交换设备&#xff0c;当边缘端口接收到RST BPDU时&#xff0c;交换设备会自动将边缘端口设置…

TensorFlow2实战-系列教程8:TFRecords数据源制作2

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 5、图像数据处理实例 5.1 读数据 import os import glob from datetime import date…

【Qt】QInputDialog setGeometry: Unable to set geometry 问题

QInputDialog setGeometry: Unable to set geometry 问题 文章目录 I - 问题背景II - 解决办法III - 参考链接 I - 问题背景 创建了一个 QMainWindow 并在上边创建了布局&#xff0c;尝试调用 QInputDialog 的 getInt 静态方法&#xff0c;结果运行时出现了以下警告 QWindows…

电商API接口的应用|电商跨境电商商品采集高效解决方案

电商API接口的应用|电商跨境电商商品采集高效解决方案 面对数十万亿元的跨境电商市场&#xff0c;以阿里巴巴国际站为代表的跨境电商数字平台&#xff0c;在政策、需求以及供应链的驱动下&#xff0c;为中小企业提供了全产业链、全供应链一体化综合服务&#xff0c;让越来越多…

机器学习复习(1)——任务整理流程

目录 固定的随机数种子 定义predict功能 拆分数据集 定义trainer 超参数设置 数据集载入 固定的随机数种子 在大量的机器学习与深度学习实验中&#xff0c;如果不进行特殊设置&#xff0c;我们的结果将不可复现&#xff0c;固定的随机数种子将会解决这个问题 def same…

字符串相关函数和文件操作

文章目录 1. C/C 字符串概述1.1 字符串常量1.2 字符数组 2. 字符串函数2.1 拷贝赋值功能相关函数&#xff08;覆盖&#xff09;2.1.1 strcpy2.1.2 strncpy2.1.3 memcpy2.1.4 memmove2.1.5 memset2.1.6 注意小点2.1.7 【函数区别】 2.2 追加功能相关函数2.2.1 strcat2.2.2 strnc…

使用plotly dash 画3d圆柱(Python)

plotly3D &#xff08;3d charts in Python&#xff09;可以画3维图形 在做圆柱的3D装箱项目&#xff0c;需要装箱的可视化&#xff0c;但是Mesh &#xff08;3d mesh plots in Python&#xff09;只能画三角形&#xff0c;所以需要用多个三角形拼成一个圆柱&#xff08;想做立…

Python qt.qpa.xcb: could not connect to display解决办法

遇到问题&#xff1a;qt.qpa.xcb: could not connect to display 解决办法&#xff0c;在命令行输入&#xff1a; export DISPLAY:0 然后重新跑python程序&#xff0c;解决&#xff01; 参考博客&#xff1a;qt.qpa.xcb: could not connect to displayqt.qpa.plugin: Could …

Ubuntu搭建国标平台wvp-GB28181-pro

目录 简介安装和编译1.查看操作系统信息2.安装最新版的nodejs3.安装java环境4.安装mysql5.安装redis6.安装编译器7.安装cmake8.安装依赖库9.编译ZLMediaKit9.1.编译结果说明 10.编译wvp-GB28181-pro10.1.编译结果说明 配置1.WVP-PRO配置文件1.1.Mysql数据库配置1.2.REDIS数据库…

监听项目中指定属性数据,点击或模块显示时

当项目中&#xff0c;需要获取某个页面上、某个标签上、有指定自定义属性时&#xff0c;需要在点击该元素时进行公共逻辑处理&#xff0c;或该元素在显示的时候进行逻辑处理&#xff0c;这时可以定义一个公共的方法&#xff0c;在每个页面引用&#xff0c;并写入数据即可 &…

OpenHarmony RK3568 启动流程优化

目前rk3568的开机时间有21s&#xff0c;统计的是关机后从按下 power 按键到显示锁屏的时间&#xff0c;当对openharmony的系统进行了裁剪子系统&#xff0c;系统app&#xff0c;禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

【Spring Boot 3】异步线程任务

【Spring Boot 3】异步线程任务 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

面向云服务的GaussDB全密态数据库

前言 全密态数据库&#xff0c;顾名思义与大家所理解的流数据库、图数据库一样&#xff0c;就是专门处理密文数据的数据库系统。数据以加密形态存储在数据库服务器中&#xff0c;数据库支持对密文数据的检索与计算&#xff0c;而与查询任务相关的词法解析、语法解析、执行计划生…

【工具】raw与jpg互转python-cpp

在工作中常常需要将图像转化为raw数据或者yuv数据&#xff0c;这里将提供 cpp 版本和 python 版本的互转代码 代码链接见文档尾部。 cpp 版本 jpg2raw.cpp #include <fstream> #include <iostream> #include <opencv2/core.hpp> #include <opencv2/hig…

oracle版本号中的i,G,C代表什么含义

大家都熟悉的 Oracle 版本号有 9i、10G、11G、12C、19C 等&#xff0c;但在早期&#xff0c;Oracle 的版本号并不包含这些字母。 最初&#xff0c;Oracle 的版本号简单地是 1、2、3、4 等&#xff0c;一直发展到 1999 年发布的 8i 版本。20 世纪末是互联网爆发式发展的时代。 …

将一个excel文件里面具有相同参数的行提取后存入新的excel

功能描述&#xff1a; 一个excel里面有很多行数据&#xff0c;其中“交易时间”这一列有很多交易日期&#xff0c;有些行的交易日期是一样的&#xff0c;那么就把所有交易日期相同的行挑出来&#xff0c;形成一个新的以交易日期命名的文件。import pandas as pd import os# 读取…

跨境ERP定制趋势预测:数字化转型助您赢得市场先机

随着全球贸易的不断融合和发展&#xff0c;跨境业务已成为许多企业拓展市场的重要途径。在这个背景下&#xff0c;ERP定制正逐渐成为企业数字化转型的关键利器。本文将为您预测跨境ERP定制的趋势&#xff0c;并探讨数字化转型如何助您赢得市场先机。 ERP定制趋势预测 1. 数据…

命令行启动Android Studio模拟器

1、sdk路径查看&#xff08;打开Android Studio&#xff09; 以上前提是安装的Android Studio并添加了模拟器&#xff01;&#xff01;&#xff01; 2、复制路径在终端进入到 cd /Users/duxi/Library/Android/sdk目录&#xff08;命令行启动不用打开Android Studio就能运行模拟…

【Java程序设计】【C00182】基于SSM的高校成绩报送管理系统(论文+PPT)

基于SSM的高校成绩报送管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高校成绩报送系统 本系统分为前台系统、管理员、教师以及学生4个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首…

25考研北大软微该怎么做?

25考研想准备北大软微&#xff0c;那肯定要认真准备了 考软微需要多少实力 现在的软微已经不是以前的软微了&#xff0c;基本上所有考计算机的同学都知道&#xff0c;已经没有什么信息优势了&#xff0c;只有实打实的有实力的选手才建议报考。 因为软微的专业课也是11408&am…