首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:不正确的输入: N=2不能超过M=1

TypeError:不正确的输入: N=2不能超过M=1
EN

Stack Overflow用户
提问于 2016-03-29 21:25:34
回答 1查看 21.5K关注 0票数 4

我正在编写一个函数来进行非线性曲线拟合,并且遇到了这样的错误:

代码语言:javascript
复制
TypeError: Improper input: N=2 must not exceed M=1. 

当我只从csv文件中读取列时,我不知道为什么它认为我试图使用太大的数组。

代码语言:javascript
复制
import math

#stolen sig-fig function <--trust but verify
def round_figures(x, n): 
    return round(x, int(n - math.ceil(math.log10(abs(x))))) 

def try_michaelis_menten_fit( df, pretty=False ):

    # auto-guess
    p0 = ( df['productFinal'].max(), df['substrateConcentration'].mean() )

    popt, pcov = curve_fit( v, df['substrateConcentration'], df['productFinal'], p0=p0 )
    perr = sqrt( diag( pcov ) )

    kcat_km = popt[0] / popt[1]
    # error propegation
    kcat_km_err = (sqrt( (( (perr[0])  / popt[0])**2) + ((  (perr[1])  / popt[1])**2) ))

    kcat = ( popt[0] )
    kcat_std_err = ( perr[0] )

    km_uM = ( popt[1] * 1000000 )
    km_std_err = ( perr[1] *1000000)


    if pretty:



        results = { 

        'kcat': round_figures(kcat, 3),
        'kcat_std_err': round_figures(kcat_std_err, 3),

        'km_uM': round_figures(km_uM, 5),
        'km_std_err': round_figures(km_std_err, 3),

        'kcat/km': round_figures(kcat_km, 2),
        'kcat/km_err': round_figures(kcat_km_err, 2),

        }

        return pandas.Series( results )
    else: 
        return popt, perr 

df = pandas.read_csv( 'PNP_Raw2Fittr.csv' ) 



fits = df.groupby('sample').apply( try_michaelis_menten_fit, pretty=True ) 
fits.to_csv( 'fits_pretty_output.csv' )
print( fits ) 

我是在一个数据框架中阅读的,它是这样的扩展版本:

代码语言:javascript
复制
   sample   yield    dilution  time  productAbsorbance  substrateConcentration  internalStandard  
0  PNPH_I_4  2.604     10000  2400              269.6                0.007000   2364.0
1  PNPH_I_4  2.604     10000  2400              215.3                0.002333   2515.7
2  PNPH_I_4  2.604     10000  2400              160.3                0.000778   2252.2
3  PNPH_I_4  2.604     10000  2400              104.1                0.000259   2302.4
4  PNPH_I_4  2.604     10000  2400               60.9                0.000086   2323.5
5  PNPH_I_4  2.604     10000  2400               35.4                0.000029   2367.9
6  PNPH_I_4  2.604     10000  2400                0.0                0.000000   2165.3

当我在我的数据框架的这个较小的版本上调用这个函数时,它看起来是有效的,但是当我在大的版本上使用它时,我会得到这个错误。当我添加internalStandard列时,这个错误就开始了,并在此之前工作得很好。更令人困惑的是,当我用旧版本的数据框架返回旧代码时,它工作得很好,但是如果我添加了这一行,就会得到预期的错误,但是,当我删除数据框架中的同一行并再次运行代码时,仍然会得到相同的错误!

我已经知道我传递的是method='trf'而不是lm作为我的优化方法,我得到了错误OverflowError: cannot convert float infinity to integer,但是我确实使用了df.dropna(inplace=True),是否有类似的方法是针对无穷大的?

EN

回答 1

Stack Overflow用户

发布于 2018-09-24 11:11:18

我认为这个错误指的是,您的xy (例如df['substrateConcentration']df['productFinal'])输入数据的长度小于拟合函数v中给curve_fit的拟合参数数。这是数学的结果,试图用太少的约束来进行曲线拟合(优化)。

我通过提供一个fit函数来再现与scipy.optimize.curve_fit相同的错误,该函数要求一个形状(2,)数组的4个拟合参数。

例如:

代码语言:javascript
复制
import numpy as np
from scipy.optimize import curve_fit

x, y = np.array([0.5, 4.0]), np.array([1.5, 0.6])

def func(x, a, b, c, d):
    return a*x**3. + b*x**2. - c/x + d

popt, pcov = curve_fit(func, x, y)

TypeError:不正确的输入: N=4不能超过M=2

但是,由于您没有在问题中提供fit函数v,所以无法确定这是问题的具体原因。

也许您的输入数据不是按照您认为的方式格式化的。我建议您检查数组在传递给curve_fit时的外观。您可能对数据进行了错误的解析,这样行的数量就会非常少。

我已经知道,对于我的优化方法,我传入方法=‘trf’而不是lm,我得到了错误OverflowError:不能将浮点数无穷大转换为整数,但是我确实使用了df.dropna(inplace=True),是否有类似的方法是针对无穷大的?

是的,所以不同的优化方法会以不同的方式检查输入数据并抛出不同的错误。这再次表明,您的输入数据存在某种问题。第一种方法可能是拒绝(忽略)那些“trf”抛出此错误的行,并且可能最终没有任何行。

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

https://stackoverflow.com/questions/36295380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档