【问题标题】:TypeError: Improper input: N=2 must not exceed M=1TypeError:输入不当:N=2 不得超过 M=1
【发布时间】:2016-07-17 15:54:06
【问题描述】:

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

TypeError: Improper input: N=2 must not exceed M=1. 

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

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 ) 

我正在读取一个数据框,它是这样的扩展版本:

   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),是否有类似的方法专门针对无穷大?

【问题讨论】:

  • 这里有很多活动部件。哪一行抛出错误,回溯是什么?修剪将有助于调试:它是读取 CSV 还是 pandas 中的某些内容或 curve_fit 中的某些内容
  • 当我在popt, pcov = curve_fit( v, df['substrateConcentration'], df['productFinal'], p0=p0 ) 调用try_michaelis_menten_fit 时会抛出错误。我已经用上面的小数据框尝试过这个并且它有效,只有当我使用df.groupby('sample').apply(try_michaelis_menten_fit)调用它时它才会失败。

标签: python-3.x pandas scipy curve-fitting


【解决方案1】:

我相信这个错误是指你的xy(例如df['substrateConcentration']df['productFinal'])输入数据的长度小于给@987654325的拟合参数的数量@,在您的拟合函数 v 中定义。这是数学的结果;试图在约束太少的情况下执行曲线拟合(优化)。

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

例如

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

但是,由于您没有在问题中提供拟合函数v,因此无法确认这是您问题的具体原因。

也许您的输入数据的格式与您想象的不完全一样。我建议您检查将数组传递给curve_fit 时的外观。您可能会错误地解析数据,从而导致行数非常少。

我发现我在优化方法中传递了 method='trf' 而不是 lm 我得到了错误 OverflowError: cannot convert float infinity to integer, 但是我确实使用了 df.dropna(inplace=True) ,有没有专门针对无穷大的类似方法?

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

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 2020-12-05
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多