我发现问题真的很有趣,所以我决定尝试一下.我不知道pythonic或natural,但我认为我已经找到了一种更准确的方法,可以在使用每个点的信息时将边缘拟合到像您这样的数据集.

首先,让我们生成一个看起来像你所展示的随机数据.这个部分可以很容易地跳过,我发布它只是为了使代码完整和可重复.我使用了两个双变量正态分布来模拟那些过度密度,并在其上撒上一层均匀分布的随机点.然后将它们添加到与您类似的线方程中,线下的所有内容都被截断,最终结果如下所示:

以下是制作它的代码段:

import numpy as np

x_res = 1000

x_data = np.linspace(0, 2000, x_res)

# true parameters and a function that takes them

true_pars = [80, 70, -5]

model = lambda x, a, b, c: (a / np.sqrt(x + b) + c)

y_truth = model(x_data, *true_pars)

mu_prim, mu_sec = [1750, 0], [450, 1.5]

cov_prim = [[300**2, 0 ],

[ 0, 0.2**2]]

# covariance matrix of the second dist is trickier

cov_sec = [[200**2, -1 ],

[ -1, 1.0**2]]

prim = np.random.multivariate_normal(mu_prim, cov_prim, x_res*10).T

sec = np.random.multivariate_normal(mu_sec, cov_sec, x_res*1).T

uni = np.vstack([x_data, np.random.rand(x_res) * 7])

# censoring points that will end up below the curve

prim = prim[np.vstack([[prim[1] > 0], [prim[1] > 0]])].reshape(2, -1)

sec = sec[np.vstack([[sec[1] > 0], [sec[1] > 0]])].reshape(2, -1)

# rescaling to data

for dset in [uni, sec, prim]:

dset[1] += model(dset[0], *true_pars)

# this code block generates the figure above:

import matplotlib.pylab as plt

plt.figure()

plt.plot(prim[0], prim[1], '.', alpha=0.1, label = '2D Gaussian #1')

plt.plot(sec[0], sec[1], '.', alpha=0.5, label = '2D Gaussian #2')

plt.plot(uni[0], uni[1], '.', alpha=0.5, label = 'Uniform')

plt.plot(x_data, y_truth, 'k:', lw = 3, zorder = 1.0, label = 'True edge')

plt.xlim(0, 2000)

plt.ylim(-8, 6)

plt.legend(loc = 'lower left')

plt.show()

# mashing it all together

dset = np.concatenate([prim, sec, uni], axis = 1)

现在我们有了数据和模型,我们可以集体讨论如何拟合点分布的边缘.常用的回归方法,如非线性最小二乘scipy.optimize.curve_fit,取数据值y并优化模型的自由参数,使y和模型(x)之间的残差最小.非线性最小二乘是一个迭代过程,试图在每一步摆动曲线参数,以改善每一步的拟合.现在显然,这是我们不想做的一件事,因为我们希望我们的最小化程序能够让我们尽可能远离最合适的曲线(但不要太远).

因此,让我们考虑以下功能.它不是简单地返回残差,而是在迭代的每一步也“翻转”曲线上方的点,并将它们考虑在内.这样,曲线下面的点总是比它上面的点多,导致曲线每次迭代都向下移动!达到最低点后,找到函数的最小值,散点的边缘也是如此.当然,这种方法假设你没有曲线下面的异常值 – 但是你的数字似乎并没有受到太多影响.

以下是实现此想法的功能:

def get_flipped(y_data, y_model):

flipped = y_model - y_data

flipped[flipped > 0] = 0

return flipped

def flipped_resid(pars, x, y):

"""

For every iteration, everything above the currently proposed

curve is going to be mirrored down, so that the next iterations

is going to progressively shift downwards.

"""

y_model = model(x, *pars)

flipped = get_flipped(y, y_model)

resid = np.square(y + flipped - y_model)

#print pars, resid.sum() # uncomment to check the iteration parameters

return np.nan_to_num(resid)

让我们看看它如何查找上面的数据:

# plotting the mock data

plt.plot(dset[0], dset[1], '.', alpha=0.2, label = 'Test data')

# mask bad data (we accidentaly generated some NaN values)

gmask = np.isfinite(dset[1])

dset = dset[np.vstack([gmask, gmask])].reshape((2, -1))

from scipy.optimize import leastsq

guesses =[100, 100, 0]

fit_pars, flag = leastsq(func = flipped_resid, x0 = guesses,

args = (dset[0], dset[1]))

# plot the fit:

y_fit = model(x_data, *fit_pars)

y_guess = model(x_data, *guesses)

plt.plot(x_data, y_fit, 'r-', zorder = 0.9, label = 'Edge')

plt.plot(x_data, y_guess, 'g-', zorder = 0.9, label = 'Guess')

plt.legend(loc = 'lower left')

plt.show()

上面最重要的部分是对leastsq函数的调用.确保您在初始猜测时要小心 – 如果猜测没有落在散点上,则模型可能无法正确收敛.在适当的猜测后……

瞧!边缘与真实边缘完美匹配.

python绘制拟合回归散点图_python – 将曲线拟合到散点图的边界相关推荐

  1. python绘制拟合回归散点图_Python之简单线性回归

    线性回归一是能够定量的解释因变量与解释变量间的相互关系,二是用来预测因变量. 本文通过Python拟合一元线性回归模型,实现对一元线性回归的学习,过程较简单. 主要知识点: 1.散点图绘制,查看变量间 ...

  2. python绘制拟合回归散点图_matplotlib中散点图的回归线和拟合曲线

    我有一个很大的数据集,我正在循环使用以生成绘图.我已经成功地计算出了散点图,但是我在如何生成回归线和拟合曲线时遇到了一些问题.在 这是我的代码:# import modules import pand ...

  3. python函数拟合不规则曲线_python曲线拟合

    Python曲线拟合 前言 这篇文章的由来:前几天在做大学物理居家实验水滴法测量声速的时候需要使用phyphox软件导出的数据拟合y=1/(a+b*x)曲线.虽然老师要求使用Origin软件拟合,但是 ...

  4. phython拟合曲面方程_python数据关系型图表散点图系列曲面拟合图

    曲面拟合图 曲面拟合用于二维变量与目标函数之间关系的分析: 曲面拟合: 根据实际实验测试数据,求取函数f(x,y)与变量x及y之间的解析式,使其通过或近似通过所有的实验测试点:即使所有实验数据点能近似 ...

  5. python绘制3d动态模型_Python绘制3D图形

    3D图形在数据分析.数据建模.图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何使用python进行3D图形的绘制,包括3D散点.3D表面.3D轮廓.3D直线(曲线)以及3D文字等的绘制 ...

  6. python绘制直方图显示数字_Python实现绘制双柱状图并显示数值功能示例

    本文实例讲述了Python实现绘制双柱状图并显示数值功能.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 import matplotlib.py ...

  7. python绘制好几个子图_python绘制多个子图的实例

    python绘制多个子图的实例 更新时间:2019年07月07日 12:22:01 作者:水之魂2018 今天小编就为大家分享一篇python绘制多个子图的实例,具有很好的参考价值,希望对大家有所帮助 ...

  8. 用python绘制一条直线_python绘制直线的方法

    本文实例为大家分享了python绘制直线的具体代码,供大家参考,具体内容如下 #!/usr/bin/env python import vtk # 绘制通用方法 def myshow(linepoly ...

  9. python绘制四边螺旋线代_Python绘制3d螺旋曲线图实例代码

    Line plots Axes3D.plot(xs, ys, *args, **kwargs) 绘制2D或3D数据 参数 描述 xs, ys X轴,Y轴坐标定点 zs Z值,每一个点的值都是1 zdi ...

最新文章

  1. android读取SDCard任意路径下的文件
  2. MySQL学习随笔记录
  3. PHP下使用FPDF在PDF中插入图片
  4. mysql jdbc 分页查询_JDBC与MySQL实现分页查询技术
  5. js实现随机生成小方块
  6. 关于拓扑排序的问题-P3116 [USACO15JAN]会议时间Meeting Time
  7. 新年立个小目标!代码写得更规范!
  8. 汇编实验五 编写、调试具有多个段的程序
  9. [Python] 使用 UN Comtrade API 高效获取数据
  10. C语言复习 -- 知识点总结(全)
  11. python:base64与图片的互转
  12. 图片标注工具LabelImg安装与使用
  13. png格式的图片怎么变成jpg格式?png图片怎么转格式?
  14. python 简单字体解密
  15. 爬虫--Item Pipeline 介绍(21)
  16. 朋友圈(java版)
  17. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园新闻发布管理系统574ec
  18. ro服务器物品掉率修改,洪水世界如何调整物品爆率 物品掉率修改方法解析
  19. 诺基亚C2-03 - 简单才是首要的诺基亚C2-03
  20. 手机号码归属地查询api接口

热门文章

  1. php模拟登录京东,京东jos 获取授权及php-sdk的使用示例
  2. Python菜鸟入门:day15编程学习
  3. 谷歌紧急更新,Chrome 今年第二个零日漏洞曝光
  4. 历史上的今天:乔布斯出生;苹果推出 Thunderbolt 接口;WhatsApp 创始人诞生
  5. 让我们用 SQL 开发一个图形数据库吧
  6. 新的一年,这7个“菜鸟坑”千万别再踩了!
  7. 小众却顽强的编程语言 Erlang ,你了解多少?
  8. 一行代码能做什么? 看到最后一个我终于忍不住...
  9. 风靡业内的跨端开源框架 uni-app 入驻 GitCode
  10. Linux 操作系统开篇!