C#,数值计算——数据建模,直线拟合(Fitmed,最小化绝对偏差法)的计算方法与源程序
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,最小化绝对偏差法)的计算方法与源程序相关推荐
- UDA一致正则化和熵最小化
2021SC@SDUSC Consistency Regularization 一致性正则化 在监督学习中,一种常见的正则化技术是数据增强,它应用于对输入进行转换,同时假定这种转换不影响类语义分类.例 ...
- 数据拟合: 直线拟合--多项式拟合
数据拟合: 直线拟合--多项式拟合 1.问题概述 在实际问题中,常常需要从一组观察数据 (xi,yi) i=1,2,,..,n 去预测函数 y=f(x) 的表达式,从几何角度来说,这个 ...
- 非线性最小二乘法 python_[数值计算] 数据拟合——非线性最小二乘法
前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合--线性最小二乘法zhuanlan.zhihu.com 现在来看另一个问题:非线性最小二乘法 1. 定义 首先是如何定义这里这 ...
- 利用最小二乘法,用直线拟合点时,为什么计算竖直距离而非垂直距离?为什么在线性回归分析中,求的是距离平方和最小,而不是距离之和最小?
我的理解是,直接求距离之和可能导致多个解存在的情况,而求距离平方和可以保证唯一解,参考: 当且仅当a=b时,不等式等号成立 参考文章:利用最小二乘法,用直线拟合5点时,为什么计算竖直距离而非垂直距离?
- 如何用机器学习方法进行数据建模?(文末福利)
本文节选自CCF大数据教材系列丛书之<大数据导论>,由中国科学院院士梅宏主编.本书系统地介绍大数据涵盖的内容,包括数据与大数据概述.大数据感知与获取.大数据存储与管理.大数据分析.大数据处 ...
- OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
1 图像的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓是图像目标的外部特征,这种特征对于我们进行图像分析,目标识别和理解等更深层次的处理都有很重要的意义. ...
- RANSAC估计——以直线拟合为例
RANSAC(RANdom SAmple Consensus),即随机采样一致性.该方法最早是由Fischler和Bolles提出的一种鲁棒估计方法,最早用于计算机视觉中位姿估计问题,现在已广泛应用于 ...
- 数学建模4 拟合算法
1.插值与拟合 插值算法中,得到的多项式f(x)要经过所有样本点.但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象.尽管我们可以选择分段的方法避免这种现象,但是更多时候我们倾向于得到一个确定 ...
- 数据建模 Database Modeling:概念 (Conceptual) vs 逻辑 (Logical) vs 物理数据 (Physical) 模型
数据建模是一种使用实体关系图(ER图)记录软件系统的技术,实体关系图是公司数据库表中数据结构的表示.它是公司业务需求的非常有力的表达.数据模型有多种用途,从高级概念模型.逻辑到物理数据模型,通常由实体 ...
- OpenCV | 直线拟合fitline函数(Python)
简介 之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好.个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了OpenCV中的fi ...
最新文章
- 关于 Method Swizzing方法
- TypeScript class 的静态成员变量
- CSS3属性之text-indent文本缩进使用详解
- 暴力推荐2:硬盘分区丢失之DiskGenius
- linux下硬盘安装ubuntu,Ubuntu硬盘安装
- 为Python安装Redis库
- 35、html制作QQ彩贝热销时装页面(注意:需要素材)
- 如何使用python将数据写入txt文件
- Kafka之sync、async以及oneway
- vue使用高德地图显示坐标
- 2018滴滴校招(秋招)内推笔试编程题题解
- 腾讯云数据库TDSQL-C(原CynosDB)的外网访问配置
- 收录拒绝指定ip请求黑名单lua脚本、拒绝ip频次请求的lua脚本
- ROS:bag数据包内容提取——雷达点云数据和imu数据
- JavaSE自学笔记016_Real(多线程)
- PTA寒假基础题训练(含解题思路)(下)
- Javascript 16进制转有符号的10进制整数
- 基于JAVA高考报考指南网站计算机毕业设计源码+数据库+lw文档+系统+部署
- 老虎证券web端PWA实践总结
- 斐波那契数列的编程题,青蛙跳台
热门文章
- 【老生谈算法】matlab实现有导师学习神经网络的回归拟合——基于近红外光谱的汽油辛烷值预测
- Android--Dialog/DialogFragment宽度高度修改/全屏,自定义样式
- 用Ogre固定渲染管线实现火炬之光X-RAY效果 .
- Mac技巧之让U盘、移动硬盘在苹果电脑和Windows PC都能识别/读写,且支持4GB大文件:exFAT格式
- git 提交代码的时候报错: ! [remote rejected] xxx -> xxx (pre-receive hook declined)
- 诺基亚CEO埃洛普2012年薪酬降了近一半
- 丁小平微积分研究成果刍议【转载】
- 联想K43G无线网卡
- “功能机时代”的可穿戴设备,数据从哪里来,该怎么用?
- orcale无法登录问题解决方法