c#实现最小二乘法线性拟合

public class MatrixEquation
{
private double[,] gaussMatrix;
private int coe;

    public MatrixEquation()
    {
    }

    public MatrixEquation(double[] arrX, double[] arrY, int n)
    {
        coe = n;
        gaussMatrix = GetGauss(GetXPowSum(arrX, n), GetXPowYSum(arrX, arrY, n), n);
    }

    public double[,] GetGaussMatrix()
    {
        return gaussMatrix;
    }

    public double[] GetResult()
    {
        return ComputeGauss(gaussMatrix, coe);
    }

    /// <summary> 计算获取x散点的幂次和数组 </summary> 
    /// <param name="arrX">x散点序列</param> 
    /// <param name="n">函数拟合次数</param> 
    /// <returns></returns> 
    protected double[] GetXPowSum(double[] arrX, int n)
    {
        int m = arrX.Length;//X散点的个数

        double[] xPow = new double[2 * n + 1]; //存储X散点的幂次值

        for (int i = 0; i < xPow.Length; i++)
        {
            if (i == 0)
            {
                xPow[i] = m;
            }
            else
            {
                //计算x的i次方和

                double max = 0;
                for (int j = 0; j < m; j++)
                {
                    if (arrX[j] == 0)
                        max = max + 1;
                    else
                        max = max + Math.Pow(arrX[j], i);
                }
                xPow[i] = Math.Round(max, 4);
            }
        }
        return xPow;
    }

    /// <summary>计算获取xy的幂次和序列 </summary> 
    /// <param name="arrX">x散点序列</param> 
    /// <param name="arrY">y散点序列</param> 
    /// <param name="n">拟合曲线次数</param> 
    /// <returns></returns> 
    protected double[] GetXPowYSum(double[] arrX, double[] arrY, int n)
    {
        int m = arrX.Length;//X散点的个数

        double[] xyPow = new double[n + 1]; //仓储X散点的幂次值

        for (int i = 0; i < xyPow.Length; i++)
        {
            //计算xy的i次方和

            double max = 0;
            for (int j = 0; j < m; j++)
            {
                if (arrX[j] == 0)
                    max = max + 1;
                else
                    max = max + Math.Pow(arrX[j], i) * arrY[j];
            }
            xyPow[i] = Math.Round(max, 4);
        }
        return xyPow;
    }

    /// <summary> 获取高斯矩阵(增广矩阵) </summary>            
    /// <param name="arrX">X的幂次和</param> 
    /// <param name="arrXY">XY的幂次和</param> 
    /// <param name="n">拟合曲线次数</param> 
    /// <returns></returns> 
    protected double[,] GetGauss(double[] arrX, double[] arrXY, int n)
    {
        double[,] gauss = new double[n + 1, n + 2];
        for (int i = 0; i < n + 1; i++)
        {
            int j;
            int m = i;
            for (j = 0; j < n + 1; j++)
            {
                gauss[i, j] = arrX[m];
                m++;
            }
            gauss[i, j] = arrXY[i];
        }

        return gauss;
    }

    /// <summary> 求解拟合曲线的系数 </summary>                  
    /// <param name="gauss">线性方程的增广矩阵</param> 
    /// <param name="n">方程次数</param> 
    /// <returns></returns> 
    protected double[] ComputeGauss(double[,] gauss, int n)
    {
        double[] a = new double[n + 1];
        double s;
        int matrixLine = n + 1;
        for (int i = 0; i < n + 1; i++)
            a[i] = 0;
        //循环每列

        for (int j = 0; j < matrixLine; j++)
        {
            //每列J行以后的绝对值最大值

            double max = 0;
            int k = j;
            for (int i = j; i < matrixLine; i++)
            {
                if (Math.Abs(gauss[i, j]) > max)
                {
                    max = gauss[i, j];
                    k = i;
                }
            }
            //判断j行否为最大值行 若不是将j行调换为最大值行

            if (k != j)
            {
                double temp; for (int m = j; m < matrixLine + 1; m++)
                {
                    temp = gauss[j, m];
                    gauss[j, m] = gauss[k, m];
                    gauss[k, m] = temp;
                }
            }
            if (max == 0)
            {
                //奇异矩阵无解

                return a;
            }
            //进行初等行变换得到上三角矩阵

            for (int i = j + 1; i < matrixLine; i++)
            {
                s = gauss[i, j];
                for (int m = j; m < matrixLine + 1; m++)
                {
                    gauss[i, m] = Math.Round(gauss[i, m] - gauss[j, m] * s / gauss[j, j], 6);
                }
            }
        }
        //根据倒推方式一次计算现行方程的解

        for (int i = matrixLine - 1; i >= 0; i--)
        {
            s = 0;
            for (int j = i + 1; j < matrixLine; j++)
            {
                s += gauss[i, j] * a[j];
            }
            a[i] = Math.Round((gauss[i, matrixLine] - s) / gauss[i, i], 6);
        }
        //返回方程的解即拟合曲线的系数

        return a;
    }
}
    ------------------------
    以上是本人在网上看到的一个例子,但是不理解该怎么样测试这个类,请各位大神赐教!或者可以提供相关参考链接也可以。
0

2个回答

MatrixEquation me = new MatrixEquation(x点的数组, y点的数组, n);
me.XXX调用,具体看你上面注释

0

http://blog.sina.com.cn/s/blog_6e51df7f0100thie.html
c#版实现最小二乘法的例子,个人认为非常好!

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
最小二乘法进行线性拟合c++代码 含详细注释
最小二乘法进行线性拟合c++代码 含详细注释
C#实现最小二乘法非线性拟合
使用C#的Mathnet类库实现最小二乘法非线性拟合 作者:linbor tinka
最小二乘法-直线拟合-C代码实现
最小二乘法(又称最小平方法)是一种数学优化技术。nnn nnn它通过最小化误差的平方和寻找数据的最佳函数匹配。nnn nnn利用最小二乘法可以简便地求得未知的数据,nnn nnn并使得这些求得的数据与实际数据之间误差的平方和为最小。nn假设已知有N个点,设这条直线方程为:  y = a·x + bnn其中,a和b的计算公式如下:nnnn nn nn本文对于推导过程不在赘述,网上都有。nn nn n...
C#最小二乘法拟合及曲线绘制
可以最小二乘法拟合任意次数的曲线,绘制了原始折线和拟合曲线的对比图,有现成代码可供引用
非常好的最小二乘法直线拟合完整代码
很好用的最小二乘法直线拟合代码 可运行 VC平台
数值作业:最小二乘法进行线性拟合之C语言代码
作图法求出直线的斜率a和截据b,可以确定这条直线所对应的经验公式,但用作图法拟合直线时,由于作图连线有较大的随意性,尤其在测量数据比较分散时,对同一组测量数据,不同的人去处理,所得结果有差异,因此是一种粗略的数据处理方法,求出的a和b误差较大。用最小二乘法拟合直线处理数据时,任何人去处理同一组数据,只要处理过程没有错误,得到的斜率a和截据b是唯一的。 n最小二乘法就是将一组符合Y=a+bX关系的测
线性最小二乘法拟合实验及代码详解
1. 实验目的nn了解法方法求解步骤以及QR分解方法具体实现方式,通过最小二乘法得出最佳的拟合系数;nn2. 实验内容nn求一个二次多项式,使得在最小二乘意义下拟合下面的数据nnn tn n n -1n n n -0.75n n n -0.5n n n 0n n n 0.25n n n 0.5n n n 0.7...
最小二乘法之一元线性拟合
n n 开发十年,就只剩下这套Java开发体系了n&amp;gt;&amp;gt;&amp;gt;   n n ...
最小二乘法拟合直线-C++实现
最近公司的一个项目需要计算TVDI(Temperature Vegetation Dryness Index ,温度植被干旱指数) ,TVDI的计算公式如下(具体原理自行百度):nnnn其中,为任意像元的地表温度;为某一NDVI对应的最小地表温度,对应的是湿边;为某一NDVI对应的最大地表温度,对应的是干边;a,b为湿边的拟合方程系数,c,d为干边的拟合方程系数。n在拟合干边和湿边的过程
【代码】最小二乘法线性拟合Python实现(不使用任何数学库函数)
文章最后是代码,是用最简单的方式来实现最小二乘,除了使用了一个读取csv文件的库以外不再调用其他库。nn最小二乘法的原理我就不再介绍了,现引用维基百科的一个例子。nn---------------------------------------------------------------------------------------------------------------------...
线性最小二乘拟合算法实现-附C++源码
最近由于工作需要要做一套线性方程的拟合算法,在网上找了很多,不是用gsl就是用matlab做的,都不符合要求。实在找不到合适的于是就决定自己从头写,于是自己写了一个,用了一段时间决得还行,就决定贴出来和大家分享一下,一方面可以顺便骗点积分,另一方面也算是做个备忘吧。rn源代码可以在百度云盘中下载:https://pan.baidu.com/s/1nvgjf41 密码:8kqsrn如果觉得积分用不完
线性拟合最小二乘法Python实现
下面代码实现的是最小二乘法线性拟合,并且包含自己造的轮子与别人造的轮子的结果比较。问题:对y=2.5x+0.8y=2.5x+0.8直线附近的带有噪声的数据进行线性拟合,最终求出w,b的估计值。最小二乘法基本思想是使得样本方差最小。代码中self_func()函数为自定义拟合函数,skl_func()为调用scikit-learn中线性模块的函数。import numpy as npnimport ...
java实现一元、多元、对数、指数等拟合(最小二乘法拟合直线、曲线)
java实现一元、多元、对数、指数等拟合(最小二乘法拟合直线、曲线)
利用labview制作的简单最小二乘法求解线性方程工具
利用labview制作的简单最小二乘法求解线性方程工具 简单易操作 纯软件制作
最小二乘法多项式曲线拟合原理与实现(数学公式详细推导,代码方面详细注释)
n最小二乘法概念: n最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法n推导过程nn给定函数y=f(x),在点x1x1x_1,x2x2x_2, x3x3x_3 ,,,,xnxnx_n 处的函数值y1y1y_1,y2y2y_2,y3y3y_3,,,...
基于最小二乘法的——线性回归拟合(一)
http://www.ikeguang.com/nn阅读本文需要的知识储备:nn高等数学n 概率论与数理统计n Python基础n最近对线性回归很感兴趣,就研究了一下。其实生活中有很多这样的例子,比如:票价与行车距离、服务质量之间的关系,买房时房价与面积、地域等的关系。给我们一组这样的数据,我们想找出一个数学关系来描述这个问题,从而得到自己想要的结论。那么,怎么样才能使得你确定出的关系是一个好的线...
C++实现最小二乘法一元回归和多项式拟合
此类的具体使用方法见:http://blog.csdn.net/czyt1988/article/details/21743595 在进行曲线拟合时用的最多的是最小二乘法,其中以一元函数(线性)和多元函数(多项式)居多,下面这个类专门用于进行多项式拟合,可以根据用户输入的阶次进行多项式拟合,算法来自于网上,和GSL的拟合算法对比过,没有问题。此类在拟合完后还能计算拟合之后的误差:SSE(剩余平方和),SSR(回归平方和),RMSE(均方根误差),R-square(确定系数)。
最小二乘法(c语言实现线性,matlab进行拟合)及相关系数的求解
现在给定n个点,(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5)..(xn,yn).现在希望得到一条最好的曲线(也就是求一个函数关系式~~)能尽可能的描述这n个点(不一定所有点都经过,但是总的拟合最小)n现在探讨什么叫总的拟合误差最小:n为了方便,我们考虑最简单的线性模型。nn 1,nnnn∑(yi-f(xi))  nni=1n但是考虑到有些点在线
关于Matlab中的线性与非线性最小二乘拟合
1、线性最小二乘拟合rn最小二乘法(又称最小平方法)是一种数学优化技术,其通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法通过变量的数据来描述变量之间的相互关系。例如通过描述x、y之间的相互关系。rn常见的多项式拟合曲线有:直线、多项式、双曲线、指数曲线。Matlab中的最小二乘函数:P=poly
最小二乘法线性函数模型 - python实现
最小二乘法线性函数模型 - python实现 对应博客文章链接随后发布!
最小二乘法入门(Matlab直线和曲线拟合)
参考博客:https://blog.csdn.net/wokaowokaowokao12345/article/details/72850143nn多的就不多说了,持续脱发中!!!nn最小二乘法历史起源之类的:https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346?fr=aladdinnn...
vb编写的最小二乘法线性拟合程序
用vb编写的 用于最小二乘法数据拟合的 小程序 。 多多指教
最小二乘法曲线拟合C语言可执行代码
最小二乘法曲线拟合C语言可执行代码
最小二乘法曲线拟合原理与实现
参考文章http://blog.csdn.net/jairuschan/article/details/7517773最小二乘学习法是对模型的输出和训练集输出的平方误差为最小时的参数进行学习,式中之所以加上系数1/2,是为了约去对进行微分时得到的2。“LS”是Least Squares的首字母。平方误差是残差的范数,因此最小二乘学习法有时也称为损失最小化学习法。 n如果使用线性模型 n的话,训练样本
Python最小二乘法线性回归
今天的第一个任务是拟合三个点。 n三个点。。nn复习了一下线性回归nnimport matplotlib.pyplot as pltnimport numpy as npnfrom sklearn import datasets, linear_modelnfrom sklearn.metrics import mean_squared_error, r2_scorennclass Linear(...
最小二乘法曲线拟合以及Matlab实现
最小二乘法曲线拟合以及Matlab实现nn在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。nnnn目录nnn最小二乘法直线拟合原理n曲线拟合nMatlab实现代码nnnnnnn最小二乘法直线线拟合原理nn首先,我们从曲线拟合的最简单情况——直线拟合来引
MATLAB最小二乘法线性拟合
MATLAB 最小二乘法 线性拟合算法 线性相关系数
拟合直线 二次函数曲线 最小二乘法 javascript(p5.js,附完整代码)
最小二乘法拟合rnrnrnrn使用工具rnrnp5.js 是开源的设计师工具,专攻画图 rn下面是文档、工具包和官网(本文只用了其中的p5.min.js) rn链接:https://pan.baidu.com/s/1i5D0OpZ 密码:e04v rnhttps://p5js.org/rnrnrnrn拟合直线rnrnrnrn最终效果rnrn rn rnrnrnrnrn数学公式rnrn∑ni=0(x−x¯)(y−y¯)∑ni=0(x−x¯)(x−x¯)
Python基于最小二乘法的一元线性回归方程
基于最小二乘法的一元线性回归方程要求n关于房价的,只需要一个自变量一个因变量n用到最小二乘,但不是封装好的函数,有算法的具体实现n原理最小二乘法我们以最简单的一元线性模型来解释最小二乘法。什么是一元线性模型呢? n监督学习中,如果预测的变量是离散的,我们称其为分类(如决策树,支持向量机等),如果预测的变量是连续的,我们称其为回归。回归分析中,如果只包括一个自变量和一个因变量,且二者的关系可用一条直
最小二乘法用于直线,多项式,圆,椭圆的拟合及程序实现
参考:nhttp://blog.csdn.net/jairuschan/article/details/7517773/
Python最小二乘法拟合直线
Python最小二乘法拟合直线,采用了2种不同的方式,一种是直接计算,另一种是调用numpy.linalg.solve()
最小二乘法曲线拟合,龙贝格算法matlab源程序
最小二乘法曲线拟合,龙贝格算法matlab源程序,显示界面等等
如何使用线性代数实现最小二乘法拟合曲线
也许在我们读高中的时候,就知道在数学的世界里,有一种直线拟合的方式:最小二乘法。它是一种数学优化技术,原理是通过最小化误差的平方和寻找数据的最佳函数匹配。nn比如研究x和y之间的关系,假设我们拥有的数据是将这些数据描绘在x-y直角坐标系中,发现这些点并没有能够连接成一条直线。nnnn但趋势近似一条曲线,这时可以假设这条曲线为: 。nn根据最小二乘的原理,使即最小化,可以得到值,再根据直线过点得出b...
曲线最小二乘法多项式拟合(C++,Qt实现界面)
一个C++实现的最小二乘法原理的曲线拟合程序,由Qt实现界面。需要Qt creator, 主要拟合封装在fitting.h中的fitting类。
最小二乘法拟合
最小二乘法线性拟合,数值计算方法中的一种经典算法。。
最小二乘曲线拟合Fortran源程序
最小二乘曲线拟合Fortran源程序,可直接用于求拟合的曲线
C#开发-最小二乘拟合圆
最小二乘拟合圆曲线方程为:R²=(X-A)²+(Y-B)² n因此只需求出圆心坐标(A,B)和半径R即可。 n拟合圆的详细推导公式见:http://blog.163.com/small_duan/blog/static/28584262200872340079/ n这里只给出使用C#编写的拟合圆程序: /// <summary>n /// 拟合圆n /// </s
线性回归原理及实现(一):最小二乘法
线性回归到底要干什么,顾名思义很简单,即在已有数据集上通过构建一个线性的模型来拟合该数据集特征向量的各个分量之间的关系,对于需要预测结果的新数据,我们利用已经拟合好的线性模型来预测其结果。关于线性回归的方法,现在使用得比较广泛的就是梯度下降和最小二乘法;我打算把最小二乘法和梯度下降分两篇博客来写,这篇就来说一说我对线性回归及最小二乘法的理解以及原理实现。nnnn线性...
空间直线的最小二乘拟合
        空间直线最小二乘拟合理论推导如下:nn         nn                                     nn         从推导过程可以看出,只需求出四个参数即可确定一条直线,即求出矩阵即可。 ...
最小二乘拟合平面
最小二乘拟合平面n#include <iostream> n#include <windows.h> n#include "opencv.hpp" n#include <string>n#include <stdlib.h>n#include <stdio.h>nusing namespace std;nusing namespace cv;//Ax+by+cz=D nvoid cvFitP
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 python拟合曲线教程 区块链实现