1 文本格式

using System;

namespace Legalsoft.Truffer
{
    /// <summary>
    /// fit a line minimizing absolute deviation
    /// </summary>
    public class Fitmed
    {
        private int ndata { get; set; }
        private double a { get; set; }
        private double b { get; set; }
        private double abdev { get; set; }
        private double[] x { get; set; }
        private double[] y { get; set; }

public Fitmed(double[] xx, double[] yy)
        {
            this.ndata = xx.Length;
            this.x = xx;
            this.y = yy;

double sx = 0.0;
            double sy = 0.0;
            double sxy = 0.0;
            double sxx = 0.0;
            double chisq = 0.0;
            for (int j = 0; j < ndata; j++)
            {
                sx += x[j];
                sy += y[j];
                sxy += x[j] * y[j];
                sxx += Globals.SQR(x[j]);
            }
            double del = ndata * sxx - sx * sx;
            a = (sxx * sy - sx * sxy) / del;
            b = (ndata * sxy - sx * sy) / del;
            for (int j = 0; j < ndata; j++)
            {
                double temp = y[j] - (a + b * x[j]);
                chisq = temp * temp;
            }
            double sigb = Math.Sqrt(chisq / del);
            double b1 = b;
            double f1 = rofunc(b1);
            if (sigb > 0.0)
            {
                double b2 = b + Globals.SIGN(3.0 * sigb, f1);
                double f2 = rofunc(b2);
                //if (b2 == b1)
                if (Math.Abs(b2 - b1) <= float.Epsilon)
                {
                    abdev /= ndata;
                    return;
                }
                while (f1 * f2 > 0.0)
                {
                    b = b2 + 1.6 * (b2 - b1);
                    b1 = b2;
                    f1 = f2;
                    b2 = b;
                    f2 = rofunc(b2);
                }
                sigb = 0.01 * sigb;
                while (Math.Abs(b2 - b1) > sigb)
                {
                    b = b1 + 0.5 * (b2 - b1);
                    //if (b == b1 || b == b2)
                    if (Math.Abs(b - b1) <= float.Epsilon || Math.Abs(b - b2) <= float.Epsilon)
                    {
                        break;
                    }
                    double f = rofunc(b);
                    if (f * f1 >= 0.0)
                    {
                        f1 = f;
                        b1 = b;
                    }
                    else
                    {
                        f2 = f;
                        b2 = b;
                    }
                }
            }
            abdev /= ndata;
        }

public double rofunc(double b)
        {
            double EPS = float.Epsilon;
            double[] arr = new double[ndata];
            for (int j = 0; j < ndata; j++)
            {
                arr[j] = y[j] - b * x[j];
            }
            if ((ndata & 1) == 1)
            {
                a = Sorter.select((ndata - 1) >> 1, arr);
            }
            else
            {
                int jj = ndata >> 1;
                a = 0.5 * (Sorter.select(jj - 1, arr) + Sorter.select(jj, arr));
            }
            abdev = 0.0;
            double sum = 0.0;
            for (int j = 0; j < ndata; j++)
            {
                double d = y[j] - (b * x[j] + a);
                abdev += Math.Abs(d);
                if (y[j] != 0.0)
                {
                    d /= Math.Abs(y[j]);
                }
                if (Math.Abs(d) > EPS)
                {
                    sum += (d >= 0.0 ? x[j] : -x[j]);
                }
            }
            return sum;
        }
    }
}

2 代码格式

using System;namespace Legalsoft.Truffer
{/// <summary>/// fit a line minimizing absolute deviation/// </summary>public class Fitmed{private int ndata { get; set; }private double a { get; set; }private double b { get; set; }private double abdev { get; set; }private double[] x { get; set; }private double[] y { get; set; }public Fitmed(double[] xx, double[] yy){this.ndata = xx.Length;this.x = xx;this.y = yy;double sx = 0.0;double sy = 0.0;double sxy = 0.0;double sxx = 0.0;double chisq = 0.0;for (int j = 0; j < ndata; j++){sx += x[j];sy += y[j];sxy += x[j] * y[j];sxx += Globals.SQR(x[j]);}double del = ndata * sxx - sx * sx;a = (sxx * sy - sx * sxy) / del;b = (ndata * sxy - sx * sy) / del;for (int j = 0; j < ndata; j++){double temp = y[j] - (a + b * x[j]);chisq = temp * temp;}double sigb = Math.Sqrt(chisq / del);double b1 = b;double f1 = rofunc(b1);if (sigb > 0.0){double b2 = b + Globals.SIGN(3.0 * sigb, f1);double f2 = rofunc(b2);//if (b2 == b1)if (Math.Abs(b2 - b1) <= float.Epsilon){abdev /= ndata;return;}while (f1 * f2 > 0.0){b = b2 + 1.6 * (b2 - b1);b1 = b2;f1 = f2;b2 = b;f2 = rofunc(b2);}sigb = 0.01 * sigb;while (Math.Abs(b2 - b1) > sigb){b = b1 + 0.5 * (b2 - b1);//if (b == b1 || b == b2)if (Math.Abs(b - b1) <= float.Epsilon || Math.Abs(b - b2) <= float.Epsilon){break;}double f = rofunc(b);if (f * f1 >= 0.0){f1 = f;b1 = b;}else{f2 = f;b2 = b;}}}abdev /= ndata;}public double rofunc(double b){double EPS = float.Epsilon;double[] arr = new double[ndata];for (int j = 0; j < ndata; j++){arr[j] = y[j] - b * x[j];}if ((ndata & 1) == 1){a = Sorter.select((ndata - 1) >> 1, arr);}else{int jj = ndata >> 1;a = 0.5 * (Sorter.select(jj - 1, arr) + Sorter.select(jj, arr));}abdev = 0.0;double sum = 0.0;for (int j = 0; j < ndata; j++){double d = y[j] - (b * x[j] + a);abdev += Math.Abs(d);if (y[j] != 0.0){d /= Math.Abs(y[j]);}if (Math.Abs(d) > EPS){sum += (d >= 0.0 ? x[j] : -x[j]);}}return sum;}}
}

C#,数值计算——数据建模,直线拟合(Fitmed,最小化绝对偏差法)的计算方法与源程序相关推荐

  1. UDA一致正则化和熵最小化

    2021SC@SDUSC Consistency Regularization 一致性正则化 在监督学习中,一种常见的正则化技术是数据增强,它应用于对输入进行转换,同时假定这种转换不影响类语义分类.例 ...

  2. 数据拟合: 直线拟合--多项式拟合

    数据拟合: 直线拟合--多项式拟合 1.问题概述 在实际问题中,常常需要从一组观察数据        (xi,yi)  i=1,2,,..,n 去预测函数 y=f(x) 的表达式,从几何角度来说,这个 ...

  3. 非线性最小二乘法 python_[数值计算] 数据拟合——非线性最小二乘法

    前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合--线性最小二乘法​zhuanlan.zhihu.com 现在来看另一个问题:非线性最小二乘法 1. 定义 首先是如何定义这里这 ...

  4. 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?

    我的理解是,直接求距离之和可能导致多个解存在的情况,而求距离平方和可以保证唯一解,参考: 当且仅当a=b时,不等式等号成立 参考文章:利用最小二乘法,用直线拟合5点时,为什么计算竖直距离而非垂直距离?

  5. 如何用机器学习方法进行数据建模?(文末福利)

    本文节选自CCF大数据教材系列丛书之<大数据导论>,由中国科学院院士梅宏主编.本书系统地介绍大数据涵盖的内容,包括数据与大数据概述.大数据感知与获取.大数据存储与管理.大数据分析.大数据处 ...

  6. OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合

    1 图像的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义. ...

  7. RANSAC估计——以直线拟合为例

    RANSAC(RANdom SAmple Consensus),即随机采样一致性.该方法最早是由Fischler和Bolles提出的一种鲁棒估计方法,最早用于计算机视觉中位姿估计问题,现在已广泛应用于 ...

  8. 数学建模4 拟合算法

    1.插值与拟合 插值算法中,得到的多项式f(x)要经过所有样本点.但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象.尽管我们可以选择分段的方法避免这种现象,但是更多时候我们倾向于得到一个确定 ...

  9. 数据建模 Database Modeling:概念 (Conceptual) vs 逻辑 (Logical) vs 物理数据 (Physical) 模型

    数据建模是一种使用实体关系图(ER图)记录软件系统的技术,实体关系图是公司数据库表中数据结构的表示.它是公司业务需求的非常有力的表达.数据模型有多种用途,从高级概念模型.逻辑到物理数据模型,通常由实体 ...

  10. OpenCV | 直线拟合fitline函数(Python)

    简介 之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好.个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了OpenCV中的fi ...

最新文章

  1. 关于 Method Swizzing方法
  2. TypeScript class 的静态成员变量
  3. CSS3属性之text-indent文本缩进使用详解
  4. 暴力推荐2:硬盘分区丢失之DiskGenius
  5. linux下硬盘安装ubuntu,Ubuntu硬盘安装
  6. 为Python安装Redis库
  7. 35、html制作QQ彩贝热销时装页面(注意:需要素材)
  8. 如何使用python将数据写入txt文件
  9. Kafka之sync、async以及oneway
  10. vue使用高德地图显示坐标
  11. 2018滴滴校招(秋招)内推笔试编程题题解
  12. 腾讯云数据库TDSQL-C(原CynosDB)的外网访问配置
  13. 收录拒绝指定ip请求黑名单lua脚本、拒绝ip频次请求的lua脚本
  14. ROS:bag数据包内容提取——雷达点云数据和imu数据
  15. JavaSE自学笔记016_Real(多线程)
  16. PTA寒假基础题训练(含解题思路)(下)
  17. Javascript 16进制转有符号的10进制整数
  18. 基于JAVA高考报考指南网站计算机毕业设计源码+数据库+lw文档+系统+部署
  19. 老虎证券web端PWA实践总结
  20. 斐波那契数列的编程题,青蛙跳台

热门文章

  1. 【老生谈算法】matlab实现有导师学习神经网络的回归拟合——基于近红外光谱的汽油辛烷值预测
  2. Android--Dialog/DialogFragment宽度高度修改/全屏,自定义样式
  3. 用Ogre固定渲染管线实现火炬之光X-RAY效果 .
  4. Mac技巧之让U盘、移动硬盘在苹果电脑和Windows PC都能识别/读写,且支持4GB大文件:exFAT格式
  5. git 提交代码的时候报错: ! [remote rejected] xxx -> xxx (pre-receive hook declined)
  6. 诺基亚CEO埃洛普2012年薪酬降了近一半
  7. 丁小平微积分研究成果刍议【转载】
  8. 联想K43G无线网卡
  9. “功能机时代”的可穿戴设备,数据从哪里来,该怎么用?
  10. orcale无法登录问题解决方法