Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将curve_fit或多拟合限制为单调函数

将curve_fit或多拟合限制为单调函数
EN

Stack Overflow用户
提问于 2018-07-09 03:35:53
回答 1查看 895关注 0票数 1

我试图创建一个函数,该函数接受一组观察到的和预期的数据点,确定最佳的校准函数,并将此校准应用于整个数据集(其中数据点是子集)。但是,我想确保由scipy.optimize.curve_fitnumpy.polyfit拟合的多项式函数是单调的(一阶导数不改变符号)。

下面是我的当前测试代码:

代码语言:javascript
运行
AI代码解释
复制
#! /usr/bin/env python
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
import numpy as np
import math
import sys
import random
random.seed(28)

#############
# Test Data #
#############
measuredMaximaMZ = [100.0, 201.0, 222.0, 401.0, 500.0]
presentCalibrants = [100.5, 200.5, 300.5, 400.5, 500.5]

Fake_Raw_X = np.linspace(100,500,1000)
Fake_Raw_Y = random.sample(xrange(100000), 1000)

#############
# Functions #
#############
def powerLaw(x,a,b,c):
    penalty = 0
    if b > 2.:
        penalty = abs(b-1.)*10000
    if b < 0.:
        penalty = abs(2.-b)*10000
    return a*x**b + c + penalty

class powerLawCall:
    def __init__(self,x,a,b,c):
        self.a = a
        self.b = b
        self.c = c
        self.f = lambda x: a*x**b+c
    def __call__(self,x):
        return self.f(x)
    def describe(self):
        return str(self.a)+"*X^"+str(self.b)+"+"+str(self.c)

def performCalibration(measured, expected):
    RMS = sys.maxint
    func = None

    # Power Law
    z = curve_fit(powerLaw, measured, expected)
    RMS_buffer = []
    for index, i in enumerate(measured):
        RMS_buffer.append((powerLaw(i,*z[0])-expected[index])**2)
    RMS_buffer = np.mean(RMS_buffer)
    RMS_buffer = math.sqrt(RMS_buffer)
    if RMS_buffer < RMS:
        RMS = RMS_buffer
        func = powerLawCall(0,*z[0])

    # Polynomials between 1 and len(expected)
    for i in range(1,len(expected)):
        RMS_buffer = []
        z = np.polyfit(measured, expected, i)
        f = np.poly1d(z)
        for index, j in enumerate(measured):
            RMS_buffer.append((f(j) - expected[index])**2)
        RMS_buffer = np.mean(RMS_buffer)
        RMS_buffer = math.sqrt(RMS_buffer)
        if RMS_buffer < RMS:
            RMS = RMS_buffer
            func = f
    return func

############# 
# Test Main #
#############
f = performCalibration(measuredMaximaMZ, presentCalibrants)

if isinstance(f,powerLawCall):
    label = f.describe()
else:
    label = ""
    for index,i in enumerate(f):
        if index < len(f):
            label += "{0:.2e}".format(i)+"x^"+str(len(f)-index)+" + "
        else:
            label += "{0:.2e}".format(i)

# Write results
with open("UPC Results.txt",'w') as fw:
    fw.write("Function: "+str(label)+"\n")
    fw.write("Expected\tOriginal\tCalibrated\n")
    for index, i in enumerate(measuredMaximaMZ):
        fw.write(str(presentCalibrants[index])+"\t"+str(i)+"\t"+str(f(i))+"\n")

# Plotting
X_data = []
Y_data = []
for index, i in enumerate(measuredMaximaMZ):
    X_data.append(presentCalibrants[index])
    Y_data.append(f(i))
newX = np.linspace(X_data[0],X_data[-1],1000)
newY = f(newX)

fig =  plt.figure(figsize=(8,6))
ax = fig.add_subplot(211)
plt.scatter(X_data,measuredMaximaMZ,c='b',label='Raw',marker='s',alpha=0.5)
plt.scatter(X_data,Y_data,c='r',label='Calibrated',marker='s',alpha=0.5)
plt.plot(newX,newY,label="Fit, Function: "+str(label))
plt.legend(loc='best')
plt.title("UPC Test")
plt.xlabel("Expected X")
plt.ylabel("Observed X")

ax = fig.add_subplot(212)
plt.plot(Fake_Raw_X,Fake_Raw_Y,c='b')
plt.plot(f(Fake_Raw_X),Fake_Raw_Y,c='r')
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

它为列出的测试数据(图中的第一幅图)生成以下非单调的校准曲线(和数据点):

从这张图片的第二幅图中可以看到,在X区域的300-450附近出现了问题(红色是后校准,X值在这个范围内有多个Y值):

更新

此后,我发现了如何根据bounds问题使用curve_fit的this部分来指定函数的边界。具体而言,问题是是否有一种方法可以限制curve_fitpolyfit只使用单调(多项式)函数(它返回的函数的导数在整个指定区域具有相同的符号)。

EN

回答 1

Stack Overflow用户

发布于 2018-07-09 15:28:23

PchipInterpolator和Akima1DInterpolator提供了单调插值。Dierckx的FITPACK有一些带约束的样条拟合,但是它没有暴露在python中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51244636

复制
相关文章
Android开发(37) 使用DrawerLayout实现抽屉式导航菜单
最近流行 左侧抽屉式的导航条菜单,知乎,360,QQ都使用了这样的导航菜单,我们也了解下:
张云飞Vir
2020/03/16
3.7K0
[flutter专题]6详解AppBar小部件
应用栏是各种应用程序中最常用的组件之一。它可用于容纳搜索字段、以及在页面之间导航的按钮,或者只是页面标题。由于它是一个如此常用的组件,因此 Flutter 为该功能提供了一个名为AppBar的专用小部件。
徐建国
2021/11/30
16.8K0
[flutter专题]6详解AppBar小部件
Android入门教程 | DrawerLayout 侧滑栏
要使用 DrawerLayout,可以在 layout xml 文件中将 DrawerLayout 设置为根视图。
Android_anzi
2021/12/08
2.3K0
2、wxWidgets介绍–菜单栏、状态栏、图标简介
wxWidgets是一个用来编写C++程序的GUI(图形用户界面)工具包。它是一个开源的、成熟的、跨平台的工具包。wxWidgets应用程序能在所有主流的操作系统上运行,Windows,Unix,Mac。这个项目由Julian Smart在1992年启动。wxWidgets提供各种各样的C++类来处理数据流、数据库、多线程、在线帮助、应用程序设置。wxWidgets由大量的窗口小部件组成。
全栈程序员站长
2022/09/06
3.1K0
2、wxWidgets介绍–菜单栏、状态栏、图标简介
Windows 7 操作系统
Windows 7 的主要特性有:  更简单  更安全  更好的连接  更低的成本
青灯古酒
2023/10/16
6270
如何在Mac上轻松更改Finder的外观
macOS Finder是一个方便的实用程序,但是如果您自定义外观,它可能会为您提供更好的服务。这里有一些改变Finder外观的技巧!
office小助手
2020/12/24
6.3K0
如何在Mac上轻松更改Finder的外观
vs code 打开顶部菜单栏和左侧菜单栏的方法
按快捷键 F1 或者 shift+ctrl+p 切换出命令行,然后输入menu 有个view:toggle Menu bar 的功能,即可打开顶部菜单栏
朵朵花儿
2019/09/19
11.7K0
vs code 打开顶部菜单栏和左侧菜单栏的方法
『React Navigation 3x系列教程』createDrawerNavigator开发指南
这篇文章将向大家分享createDrawerNavigator的一些开发指南和实用技巧。
CrazyCodeBoy
2019/12/10
7.3K0
『React Navigation 3x系列教程』createDrawerNavigator开发指南
Parallels Toolbox for mac(pd工具箱)
专为富有创造力的个人、学生、小企业主、长期多任务处理者、IT 经理以及介于两者之间的任何人而设计。Parallels Toolbox 讓每個人都可以充分利用他們的 Mac,而不必學習複雜的系統設定。
Mac小小心
2023/04/10
5.9K0
Parallels Toolbox for mac(pd工具箱)
Android 侧滑抽屉菜单
  滑动菜单相信都不会陌生,你可能见过很多这样的文章,但我的文章会给你不一样的阅读和操作体验。
晨曦_LLW
2021/03/23
4K0
Android 侧滑抽屉菜单
pycharm如何调试代码_pycharm怎么分段运行代码
  (2)已经创建了一个python工程并且添加了内容,具体参考: Getting Started tutorial
全栈程序员站长
2022/09/27
2.3K0
pycharm如何调试代码_pycharm怎么分段运行代码
VsCode中使用Jupyter
(以前称为IPython Notebook)是一个开源项目,可让您轻松地在一个名为Notebook的画布上组合Markdown文本和可执行的Python源代码。
云深无际
2020/11/03
6.2K0
VsCode中使用Jupyter
Windows中的键盘快捷方式大全
Windows有很多键盘快捷方式,使用键盘快捷方式能够大大提高使用windows的效率,同时还能提升自己的逼格,背熟几个快捷方式,操作起来行云流水犹如大神一般!
用户7657330
2020/08/14
5.9K0
点击加载更多

相似问题

在TypeScript中使用ENUM有什么意义?

20

在代码(不是URL)中"javascript:“有什么意义?

43

C++ --使用< T>而不是<typename T>有什么意义吗?

11

使用ostringstream而不是只使用常规字符串有什么意义?

12

使用SubSink而不是订阅数组有什么意义

239
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档