直线拟合相关系数公式

开发语言:C#

在实际项目中,经常需要用到直线拟合,比如已有一些数值,需要插值出一些离散点,本文利用常见的一元线性回归算法和最小二乘法拟合直线。

调用方法:

LineFitMethod.LinearFit(pionts, out a, out b);

double y1 = LineFitMethod.LinearVal(x, a, b);

dCorr1 = LineFitMethod.Corrcoef(DY.ToArray(), listY.ToArray());

(0<|Corr(X,Y)|<1 表示具有一定线性相关性,越接近1表示越线性相关)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Drawing; namespace Method.Yosao{ /*=================================================== * 类名称: LineFitMethod * 类描述:直线拟合及相关系数计算 * 创建人: Yosao * 创建时间: 2020/6/6/星期六 11:49:28 * 修改人: * 修改时间: * 版本: @version 1.0 =====================================================*/ class LineFitMethod { /// <summary> /// 一元线性回归 最小平方算法 /// 将离散点拟合为 y = a x + b 型直线 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="a"></param> /// <param name="b"></param> public static bool LinearFit(double[] x, double[] y, out double a, out double b) { double xsum = 0; double ysum = 0; double xysum = 0; double x2sum = 0; int size = x.Length; if (size < 2) { a = 0; b = 0; return false; } for (int i = 0; i < size; i++) { xsum = xsum + x[i]; ysum = ysum + y[i]; xysum = xysum + x[i] * y[i]; x2sum = x2sum + x[i] * x[i]; } a = (size * xysum - xsum * ysum) / (size * x2sum - xsum * xsum + 1e-10); b = (ysum - a * xsum) / size; return true; } /// <summary> /// 计算拟合后的值 /// </summary> /// <param name="x"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="y"></param> public static void LinearVal(double[] x, double a, double b, double[] y) { for (int i = 0; i < x.Length; i++) { y[i] = a * x[i] + b; } } /// <summary> /// 计算拟合后的值 /// </summary> /// <param name="x"></param> /// <param name="a"></param> /// <param name="b"></param> /// <returns>y</returns> public static double LinearVal(double x, double a, double b) { return a * x + b; } /// <summary> /// 计算相关系数,线性相关性 /// l=线性相关 0<| Corr(X,Y)|<1的时候,说明两个随机变量具有一定程度的线性关系。越大线性相关性越强 /// </summary> /// <param name="y1"></param> /// <param name="y2"></param> /// <returns></returns> public static double Corrcoef(double[] y1, double[] y2) { double xy = 0, x = 0, y = 0, xsum = 0, ysum = 0; double corrc = 0; int m = y1.Length; for (int i = 0; i < m; i++) { xsum += y1[i]; ysum += y2[i]; } for (int i = 0; i < m; i++) { x = x + (m * y1[i] - xsum) * (m * y1[i] - xsum); y = y + (m * y2[i] - ysum) * (m * y2[i] - ysum); xy = xy + (m * y1[i] - xsum) * (m * y2[i] - ysum); } corrc = Math.Abs(xy) / (Math.Sqrt(x) * Math.Sqrt(y)); return corrc; } /// <summary> /// * 最小二乘法直线拟合(不是常见的一元线性回归算法) /// * 将离散点拟合为 a x + b y + c = 0 型直线 /// * 假设每个点的 X Y 坐标的误差都是符合 0 均值的正态分布的。 /// * 与一元线性回归算法的区别:一元线性回归算法假定 X 是无误差的,只有 Y 有误差。 /// * 最后将直线改写为 y = a x + b 形式 /// </summary> /// <param name="points"></param> /// <param name="a"></param> /// <param name="b"></param> /// <param name="c"></param> /// <returns></returns> public static bool LinearFit(List<PointF> points, out double a, out double b) { double c = 0; int size = points.Count; if (size < 2) { a = 0; b = 0; c = 0; return false; } double x_mean = 0; double y_mean = 0; for (int i = 0; i < size; i++) { x_mean += points[i].X; y_mean += points[i].Y; } x_mean /= size; y_mean /= size; //至此,计算出了 x y 的均值 double Dxx = 0, Dxy = 0, Dyy = 0; for (int i = 0; i < size; i++) { Dxx += (points[i].X - x_mean) * (points[i].X - x_mean); Dxy += (points[i].X - x_mean) * (points[i].Y - y_mean); Dyy += (points[i].Y - y_mean) * (points[i].Y - y_mean); } double lambda = ((Dxx + Dyy) - Math.Sqrt((Dxx - Dyy) * (Dxx - Dyy) + 4 * Dxy * Dxy)) / 2.0; double den = Math.Sqrt(Dxy * Dxy + (lambda - Dxx) * (lambda - Dxx)); a = Dxy / den; b = (lambda - Dxx) / den; c = -a * x_mean - b * y_mean; //将参数由 a x + b y + c = 0转换为y = a x + b if (b != 0) { a = - a / b; b = - c / b; } else { //直线方程则为x=c/a; return false; } return true; } }}

欢迎关注@机器视角,我们将结合机器视觉技术、RPA技术、机器人技术,和大家一起讨论工业人工智能的新技术新方法。同时也会不定期给大家推荐分析一些好用的工具、产品和代码。

本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023-01-25 16:05
下一篇 2023-01-25 16:33

相关推荐

  • 两个字的微信昵称漫画

    随着社会的快速发展,现在也是以网络为主的信息化手段,越来越多的人们也是过上了离不开手机的生活,恨不得一天24个小时都要在买手机当中度过。 我们在日常刷手机的时候,也会发现有很多的聊…

    2023-01-09
  • 为什么成龙大哥一直都对洪金宝好

    成龙说到:只有他能欺负我一辈子!哈喽大家好,网友们对于成龙肯定是不会陌生,作为国际巨星的成龙在娱乐圈有着相当高的地位,并且成龙还获得了奥斯卡终身成就奖,这个奖项的份量是非常的沉。 …

    2023-02-28
  • 会当凌绝顶一览众山小是谁的诗词

    子墨老师一直认为作为男子就要有“会当凌绝顶,一览众山小”的气魄,和壮志凌云,继往开来的胸怀。 男子是每个家庭的核心力量,要撑起一片天地,就不能少了气魄和胆识,我们作为父母给男孩起名…

    2023-09-28
  • 2008奥运会男篮排名,2008年奥运会中国男篮vs美国

    我始终认为2008年奥运会那支中国男篮,是我国历史上最强一届国家队。队中拥有世界第一中锋NBA状元姚明,王治郅,易建联、孙悦都曾在NBA效力,朱芳雨几次拒绝NBA球队试训请求。 还…

    2023-04-05
  • 刺激战场服饰币,刺激战场什么枪最好用

    感请 题主你好,我是玩电脑板的绝地求生的,刺激战场也玩过,不过对手机游戏不是很感兴趣的 通过我的了解,刺激战场是光子研发代理的,现在很多人说光子还不错,比起天美好多了,不是很氪金,…

    用户投稿 2022-11-26
  • 人民的名义中最正能量的人是谁

    副检察长陈岩石,这个角色太多正能量,真正能够做到为人民的就是他,为了大风厂几百号百姓的吃饭问题,他奉献了自己太多的精力。八十多岁的人为了说服绑架蔡成功儿子的王文革,不惜挺身而出,最…

    2023-07-26
  • 人类绝地求生

    你真的了解吃鸡游戏的原型吗? 目前我们所熟知的是,绝地求生的设计思路来自电影《大逃杀》,轰炸区的原型也来自于电影中学生们戴的项圈炸弹。 但其实它可能还有更早的原型,在沙漠地图,老工…

    2022-11-27
  • 怎样让虎皮兰快速爆崽

    虎皮兰,又被称为千岁兰、虎尾掌,属于百合科虎尾兰属的多年生草本观叶植物,叶片挺拔精神,叶色青翠饱满,还带有星星点点的纹路斑点,威武又霸气,犹如一把把利剑,有镇宅驱邪的寓意,因此在入…

    2024-01-17
  • 手游造梦西游ol官网公告

    二 毛发表于 2016-01-28 11:19 今日,2D横板闯关游戏《造梦西游OL》在各大渠道首发,并开启全新服务器“水帘洞天”。 《造梦西游OL》是一款2D横板闯关游戏,除了战…

    2023-11-23
  • 项羽是个什么样的人

    一直在考虑怎么把“楚汉相争”这段璀璨的历史呈现给大家,想了很久,有一点是我内心比较坚定的,那就是,要读透这中国历史上最为激奋人心的八年历史,读懂刘邦和项羽这两个关键人物是重中之重。…

    2022-11-25