我发现问题真的很有趣,所以我决定尝试一下.我不知道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解决最小二乘法拟合并绘制散点图

    问题背景 最近物理老师让用Excel弄一个最小二乘法拟合然后弄出方程来求玻尔兹曼常数.无奈发现Linux上的WPS没有绘图功能无语啊O__O"-,据说绘图功能是用delphi写的,不好做跨平 ...

  2. python散点图拟合曲线-python散点图拟合

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 下面是我在文本文件中绘制数据散点图的代码. 我打开的文件包含两列. 左列为x坐标 ...

  3. python散点图拟合曲线-python 绘制拟合曲线并加指定点标识的实现

    python 绘制拟合曲线并加指定点标识 import os import numpy as np from scipy import log from scipy.optimize import c ...

  4. python散点图拟合曲线-python曲线拟合

    http://blog.sina.com.cn/s/blog_aed5bd1d0102vid7.html 1.多项式拟合范例: import matplotlib.pyplot as plt impo ...

  5. python散点图拟合曲线-python 拟合曲线并求参

    需要对数据进行函数拟合,首先画一下二维散点图,目测一下大概的分布, 所谓正态分布,就是高斯分布,正态曲线是一种特殊的高斯曲线. python的scipy.optimize包里的curve_fit函数来 ...

  6. python散点图拟合曲线-python散点图:如何添加拟合线并显示拟合方程与R方?

    原标题:python散点图:如何添加拟合线并显示拟合方程与R方? polyfit()函数可以使用最小二乘法将一些点拟合成一条曲线. numpy.polyfit(x, y, deg, rcond=Non ...

  7. python散点图拟合曲线-python中的多元(多项式)最佳拟合曲线?

    Tyson 对this question的公认回答 提供了 您只需将x和y点的数组以及所需的拟合度(顺序)传递到multipolyfit.这将返回系数,然后可以使用numpy的polyval绘制. 注 ...

  8. python散点图拟合曲线如何求拟合_python散点图最佳拟合直线的代码

    你可以用numpy的polyfit.我使用以下(您可以安全地删除关于确定系数和误差界限的位,我只是认为它看起来不错):#!/usr/bin/python3 import numpy as np imp ...

  9. origin中文版散点图拟合曲线_Origin绘图:3D散点图如何绘制拟合线、如何给数据图“化妆”...

    您潜心做科学实验!我潜心绘制曲线!您可以将文献中的"帅图"发给"编辑之谭",谭编辑重现其绘制过程.今天谭编辑为数据图"拟合"和"化 ...

最新文章

  1. 谷歌「模型汤」靠微调屠了ImageNet的榜!方法竟然只有半页纸
  2. Java多线模式-Producer-Consumer模式(生产者、消费者模式)
  3. Nginx的index指令
  4. [转载]MIT牛人解说数学体系
  5. 欢乐纪中A组赛【2019.8.20】
  6. Nginx + Tomcat Windows下的负载均衡配置
  7. machinery入门看这一篇(异步任务队列)
  8. 不学无数——适配器模式
  9. oracle内置函数 wmsys.wm_concat使用
  10. shell特殊符、sort、tee、
  11. 使用Redis单实例实现分布式锁
  12. DS18B20驱动详解(蓝桥杯单片机)
  13. nanomsg交叉编译
  14. 英语单词词性顺口溜_英语单词速记顺口溜背诵技巧
  15. 《广西经济社会发展报告(2019)》正式发布 聚焦发展热点
  16. iPhone无法开机? 一招帮你“救活”
  17. 物联网智慧物流平台开发
  18. salesforce架构_使用Salesforce扩展用户研究运营基础架构
  19. Sklearn KDTree 的使用
  20. 4--STM32RCC时钟树

热门文章

  1. ES批量索引写入时的ID自动生成算法
  2. LNMP平台搭建之一:nginx编译安装
  3. python filter函数
  4. list(列表) python
  5. ConfigParser-- 读取写入配置文件
  6. Type difference of character literals in C and C++
  7. 数据挖掘技术简介[转]
  8. java连接服务器读取日志
  9. nefu 628 Garden visiting
  10. Qt + VS 【如何添加图片资源】