找到的散点线性拟合方法都是基于最小二乘法的(numpy.polyfit()scipy.optimize())

以下是根据 GB/T 18459-2001中附录 A2 提供的独立线性度拟合方法,求得的最佳拟合直线

import mathdef find_line(x0, y0):'''根据散点求得端基直线k,b,并得到每点对端基直线的偏差dy:param x0: x坐标数组:param y0: y坐标数组:return: 每点的偏差dy'''# 求得端基直线的k,bk = (y0[-1] - y0[0]) / (x0[-1] - x0[0])d = y0[-1] - (k * x0[-1])# 根据端基直线的k,b,求得每点对端基直线的偏差dydy = [(y0[i] - ((k * x0[i]) + d)) for i in range(len(x0))]return dydef find_poly(x_lst, y_lst):'''找到凸多边形,可以包含全部偏差点dy:param x_lst:x数组:param y_lst:偏差点dy数组:return:最佳凸多边形各个点'''g_x = []g_y = []# 从起始点开始,向右(x增大方向),找到最大斜率点,再从最大斜率点开始,向右继续寻找start_index = 0x_tmp = x_lst[1:]y_tmp = y_lst[1:]while len(x_tmp) > 0:k_lst = [((j - y_lst[start_index]) / (i - x_lst[start_index])) for i, j in zip(x_tmp, y_tmp)]start_index = k_lst.index(max(k_lst)) + 1 + start_indexg_x.append(x_lst[start_index])g_y.append(y_lst[start_index])x_tmp = x_lst[start_index + 1:]y_tmp = y_lst[start_index + 1:]# 从最末点开始,向左(x减小方向),也找到最大斜率点(有人说找最小斜率点,但是结果算出来不对),再从最大斜率点开始,向左继续寻找start_index = len(x_lst) - 1x_tmp = x_lst[:start_index]y_tmp = y_lst[:start_index]while len(x_tmp) > 0:k_lst = [((j - y_lst[start_index]) / (i - x_lst[start_index])) for i, j in zip(x_tmp, y_tmp)]start_index = k_lst.index(max(k_lst))g_x.append(x_lst[start_index])g_y.append(y_lst[start_index])x_tmp = x_lst[:start_index]y_tmp = y_lst[:start_index]return g_x, g_ydef find_cross(p1, p2, p3):'''根据一个点p1和一条直线(p2和p3的连线),求得该点对直线的铅垂线(平行于纵轴坐标的直线)和直线的交点:param p1: 点:param p2: 线上一点:param p3: 线上另一点:return: 铅垂线与线(p2-p3)的交点'''k = (p2[1] - p3[1]) / (p2[0] - p3[0])b = p2[1] - k * p2[0]p4 = [p1[0], (k * p1[0]) + b]return p4def find_perfect_line(a, b, x0, y0):'''根据凸多边形的每个点,找到凸多边形内最长的一根铅垂线,与最长垂线相交的直线l1的斜率就是最佳直线的斜率过最长铅垂线的中点作直线l2平行于直线l1,直线l2为最佳直线:param a:凸多边形的x轴数组:param b:凸多边形的y轴数组:param x0: 实际x轴数组:param y0: 实际y轴数组:return:最佳直线的斜率k, 截距b'''dic = {}point_lst = [[i, j] for i, j in zip(a, b)]for i in range(len(a)):p1 = (a[i], b[i])  # 凸多边形的每个点坐标rp1 = (x0[x0.index(p1[0])], y0[x0.index(p1[0])])for j in range(len(a)):p2 = (a[j], b[j])  # 凸多边形的每个点坐标rp2 = (x0[x0.index(p2[0])], y0[x0.index(p2[0])])if j == len(a) - 1:p3 = (a[0], b[0])else:p3 = (a[j + 1], b[j + 1])rp3 = (x0[x0.index(p3[0])], y0[x0.index(p3[0])])if p1 == p2 or p1 == p3:passelse:# print('====+++===', p1, p2, p3)# print('====+++===', rp1, rp2, rp3)# 铅垂线长度s_length = abs((p2[1] * (p1[0] - p3[0])) + (p1[1] * (p3[0] - p2[0]) + (p3[1] * (p2[0] - p1[0]))) / (p3[0] - p2[0]))s = find_cross(p1, p2, p3)if isPointinPolygon(s, point_lst):dic[s_length] = [rp1, rp2, rp3]print('铅垂线长度', s_length, s, dic[s_length])# print(dic)max_s_length = dic[max(dic)]rp1 = max_s_length[0]rp2 = max_s_length[1]rp3 = max_s_length[2]# 点和直线两端点中点连线的斜率k = (((rp1[1] + rp2[1]) / 2) - ((rp1[1] + rp3[1]) / 2)) / (((rp1[0] + rp2[0]) / 2) - ((rp1[0] + rp3[0]) / 2))b = ((rp1[1] + rp2[1]) / 2) - (k * ((rp1[0] + rp2[0]) / 2))return k, bdef isPointinPolygon(point, rangelist):  # [[0,0],[1,1],[0,1],[0,0]] [1,0.8]print(point)# 判断是否在外包矩形内,如果不在,直接返回falselnglist = []latlist = []for i in range(len(rangelist) - 1):lnglist.append(rangelist[i][0])latlist.append(rangelist[i][1])# print(lnglist, latlist)maxlng = max(lnglist)minlng = min(lnglist)maxlat = max(latlist)minlat = min(latlist)# print(maxlng, minlng, maxlat, minlat)if (point[0] > maxlng or point[0] < minlng orpoint[1] > maxlat or point[1] < minlat):return Falsecount = 0point1 = rangelist[0]for i in range(1, len(rangelist)):point2 = rangelist[i]# 点与多边形顶点重合if (point[0] == point1[0] and point[1] == point1[1]) or (point[0] == point2[0] and point[1] == point2[1]):print("在顶点上")return False# 判断线段两端点是否在射线两侧 不在肯定不相交 射线(-∞,lat)(lng,lat)if (point1[1] < point[1] and point2[1] >= point[1]) or (point1[1] >= point[1] and point2[1] < point[1]):# 求线段与射线交点 再和lat比较point12lng = point2[0] - (point2[1] - point[1]) * (point2[0] - point1[0]) / (point2[1] - point1[1])# print(point12lng)# 点在多边形边上if (point12lng == point[0]):print("点在多边形边上")return Trueif (point12lng < point[0]):count += 1point1 = point2print(count)if count % 2 == 0:return Trueelse:return Trueif __name__ == '__main__':x0 = [1.00, 2.00, 3.00, 4.00, 5.00, 6.00]y0 = [2.02, 4.00, 5.98, 7.90, 10.10, 12.05]dy = find_line(x0, y0)print(dy)a0, b0 = find_poly(x0, dy)print(a0, b0)print(find_perfect_line(a0, b0, x0, y0))

转载于:https://www.cnblogs.com/sunqim16/p/9121011.html

独立线性度 最佳直线相关推荐

  1. 使用线性回归拟合平面最佳直线及预测之Python+sklearn实现

    本文代码采用sklearn扩展库实现,使用线性回归算法解决下面的问题:根据平面上已知3个点的坐标,拟合最佳直线斜率k和截距b,然后根据拟合的结果对给出的x坐标进行预测,得到y坐标. from skle ...

  2. 根据离散点画直线_离散数据的最佳直线求解方法

    离散数据的最佳直线求解方法 高少蔚 ; 丁红胜 [期刊名称] <计量技术> [年 ( 卷 ), 期] 1997(000)012 [摘要] 本文提出了一种在最大偏差最小准则下寻找离散点最佳直 ...

  3. 程序员面试金典 - 面试题 16.14. 最佳直线(哈希map+set)

    1. 题目 给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi]. 请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号 ...

  4. Leetcode刷题面试题 16.14. 最佳直线

    给定一个二维平面及平面上的 N 个点列表Points,其中第i个点的坐标为Points[i]=[Xi,Yi].请找出一条直线,其通过的点的数目最多. 设穿过最多点的直线所穿过的全部点编号从小到大排序的 ...

  5. 【云贝学院】腾讯云TDSQL独立部署最佳实践

    [云贝学院]云贝学院TDSQL TCP认证课程已上线,学院有不定期公开课 需要的同学可以加老师微信:19941464235 作者:崔鹏 创建四台云主机或者本地四台Centos7.6的VM虚拟机 (四台 ...

  6. matlab 传感器的迟滞,线性度、迟滞、重复性matlab计算.docx

    2015-04-26 PAGE \* MERGEFORMAT- 7 - 传感与测试--线性度.迟滞.重复性 压力传感器 知识点回顾: ① ①线性度(非线性误差): 输出-输入校准曲线(实际) 与所选定 ...

  7. 计算机科学湖北的大学排行,2015年湖北省大学最佳专业排行榜

    2015年高考[微博]即将拉开帷幕,又到了一年一度最关键的挑大学选专业季节,湖北省哪些高校本科专业办学实力最强.办学水准最高.办学特色最鲜明?为了给即将参加2015年全国高考的考生.外国留学[微博]生 ...

  8. python最佳身高_Python+sklearn使用线性回归算法预测儿童身高

    原标题:Python+sklearn使用线性回归算法预测儿童身高 问题描述:一个人的身高除了随年龄变大而增长之外,在一定程度上还受到遗传和饮食以及其他因素的影响,本文代码中假定受年龄.性别.父母身高. ...

  9. 数据挖掘——正规方程拟合直线

    一.问题描述 假设平面上3个点: (-1.0,-1.2) , (0.0,1.0),  (1.0,2.8). (1)请写出相应的正规方程. (2)并通过求解正规方程来计算这3个点的最佳直线拟合. 二.实 ...

最新文章

  1. RAC -代替OC 中的代理
  2. 2021-01-14python函数传参是传值还是传引用? 参数若是简单类型是传值 若是对象类型则是传引用,python是兼容两者传参方式的
  3. IBM:破解密码并不是量子计算机主要用途,不必为此担心
  4. 电子技术基础三_电子技术基础
  5. 深入探索 Java 热部署--转
  6. 三种流行的数据库查询表记录数【转】
  7. SAP Fiori Launchpad的后台配置路径
  8. C语言函数名以及取地址的区别和联系
  9. ServiceStack.Ormlit 使用Insert的时候自增列不会被赋值
  10. 增量式速度pid调节策略_增量式PID是什么?不知道你就落伍了
  11. 帧中继多点子接口下配置OSPF
  12. Android中关于键盘的处理
  13. 【Unity3D日常BUG】Unity3D中使用高亮插件Highlighting出现的错误:Parameter name:shader
  14. FS FT DTFT DFT关系及频谱分析总结
  15. Axure8.1破解码 注册码 授权码
  16. 大气压力换算公式_压力单位换算及计算公式
  17. 学校做计算机教室锐捷,锐捷网络云课堂:让学生爱上每一节课
  18. 微信公众账号登陆授权开发——2
  19. 样本均值的特征与分布
  20. Java内存泄漏分析系列之七:使用MAT的Histogram和Dominator Tree定位溢出源

热门文章

  1. [BZOJ2834]回家的路
  2. MicroRNA Ranking(Tehran2016)
  3. redis学习之——redis.conf配置(基本)文件学习
  4. 调试 ASP 程序脚本
  5. Android Studio使用说明
  6. 【解决】insert 语句无效果,在查询中正常运行问题
  7. 15 个最新的 CSS3 教程
  8. Javolution 2.2.5 - Java Struct/Union Simplified
  9. 加密安装Kli Linux
  10. java impliments,dubbo使用GenericService泛化调用