python散点图获取边界_将曲线拟合到散点图的边界
Vlas Sokolov..
8
我发现问题真的很有趣,所以我决定尝试一下.我不知道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和之间model(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中获取文件大小_如何在Python中获取文件大小
python中获取文件大小 We can get file size in Python using the os module. 我们可以使用os模块在Python中获取文件大小. Python中的 ...
- python爬虫获取方法_小白学python爬虫:2.获得数据
在上一篇文章我我们已经完成了对网页的分析,包括了:在源码中数据的定位:获取方法(xpath).那么在获得数据之前我们考虑的则是如何获取源码. 接下来我们将学习如何从服务器获得源码. #写在前面&quo ...
- python流获取控制台_对Python捕获控制台输出流的方法详解
有时候我们的代码里可能要调用控制台命令,比如我想用Python写一个批量编译 .java 文件的脚本,用到如下代码 常规用法 os.system import os,traceback try: p ...
- python自动获取天气_用python获取天气数据,并作定时播报
原标题:用python获取天气数据,并作定时播报 数据挖掘入门与实战 公众号: datadw 思路 1.调用和风天气的API,获取天气数据 2.用百度语音API,将天气数据合成语音 3.用树莓派每天早 ...
- 奥维查看行政边界_全国乡镇行政区划数据乡镇边界数据查询获取方式
原标题:全国乡镇行政区划数据乡镇边界数据查询获取方式 北京揽宇方圆信息技术有限公司提供全国遥感影像数据,全国乡镇行政区划数据,是结合野外实测资料,同时参照有关地理图件,采用人机交互的方式开展行政区划地 ...
- python 乡镇轮廓 高德_百度高德地图小区景点边界轮廓实现
经常的我们在使用地图功能时,会发现在选择一个小区或者一个热门景点的时候,地图上面会给出其边界轮廓,能够方便我们知道其范围大小,有时候在我们使用地图组件的时候,也会面临着类似的需求.比如在地图上面标识出 ...
- python如何获取信息_如何使用Python获取系统信息?
I need to get the info under what environment the software is running. Does python have a library fo ...
- python实时获取数据显示_如何从ROS实时获取python中的数据?
cd放入源文件夹 并创建新包:catkin_create_pkg playground 那个目录中的cdcd playground 创建一个listener.py文件并添加以下内容:#!/usr/bi ...
- python 画出决策边界_决策边界可视化,让你的分类合理有序
作者--Navoneel Chakrabarty 在数据科学领域,分类问题是一个非常普遍和重要的问题.例如:糖尿病视网膜病变.情绪分析.数字识别.癌症类型预测(恶性或良性)等.这些问题往往通过机器学习 ...
最新文章
- 实现数据“一键脱敏”,Sharding Sphere帮你搞定
- 孙立岩 python-basic: 用于学习python基础的课件(五六七八九十)
- tensorflow1.14.0 包含了1.x和2.x内容,此后版本要求兼容该版本
- 中国CIO最关心的八大问题(下)
- ASP.NET操作文件大全
- 闪存我自己来——HDS公布闪存路线图
- astype函数_从Excel到Python:最常用的36个Pandas函数!最完整的Pandas教程!
- 各互联网公司延期上班一览
- 2019 .NET China Conf:路一直都在,社区会更好
- 《.Net 软件设计新思维》作者讲述成书的背后故事
- 2021年行政区划代码
- java utm坐标转经纬度,utm坐标和经纬度相互转换
- 【数据分析与挖掘实战】金融风控之贷款违约预测详解1(有代码和数据集)
- 宋宝华: 纪念金庸先生——程序员的武侠世界
- 常规机械硬盘分类应用场景与硬盘接口存储方案介绍
- 修改el-pagination分页样式
- iOS新知识学习之React Native开发工具集
- 【独家】微软中国开始挖人,看中搜索人才
- Windows 撤销快捷键“ctrl+z“失效解决方法
- 新世纪的群众性幻想与癫狂3