拟合曲线时发生TypeError

时间:2019-02-14 15:40:43

标签: python numpy curve-fitting least-squares

我正在尝试将曲线拟合到我拥有的某些数据,但是由于某种原因,我仅收到错误“'numpy.float64'对象无法解释为整数”,并且我不明白为什么或如何修理它。感谢您的帮助,代码如下:

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize


mud=[0.0014700734999999996,
 0.0011840320799999997,
 0.0014232304799999995,
 0.0008501509799999997,
 0.0007235751599999999,
 0.0005770661399999999,
 0.0005581295999999999,
 0.00028703807999999994,
 0.00014850233999999998]
F=[0.5750972123893806,
 0.5512177433628319,
 0.5638906194690266,
 0.5240915044247788,
 0.5217873451327435,
 0.5066008407079646,
 0.5027256637168142,
 0.4847113274336283,
 0.46502123893805314]


fitfunc = lambda p, x: p[0]+p[1]*x # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
p0 = [0.46,80,1] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:], args=(mud, F))

m = np.linspace(max(mud),min(mud), 9)
ax = plot(mud,F,"b^")
ax3 = plot(m,fitfunc(p2,m),"g-")

2 个答案:

答案 0 :(得分:1)

您的问题是您的参数<div id="survey"> <div class="header-container"> <span class="header-txt">A question for you...</span> </div> <div id="question-body" class="modal-body"> <div id="q1" class="question-page"> <div class="question-container"> <span class="question-text">What is your relationship <br> with [brand]?</span> </div> <div class="option-container"><span class="checkmark"></span>Not a brand I'm familiar with <input class="question-option" type="radio" name="q1" value="1"> </div> <div class="option-container"><span class="checkmark"></span>I'm familiar, but not interested <input class="question-option" type="radio" name="q1" value="2"> </div> <div class="option-container"><span class="checkmark"></span>A brand I would consider purchasing <input class="question-option" type="radio" name="q1" value="3"> </div> <div class="option-container"><span class="checkmark"></span>My most preferred [product category] <input class="question-option" type="radio" name="q1" value="4"> </div> <div class="option-container"><span class="checkmark"></span>I plan to purchase [brand] when next buying [product category] <input class="question-option" type="radio" name="q1" value="5"> </div> </div> </div> </div>mud是列表,而不是数组,这意味着您不能仅将它们与数字相乘。因此,错误。如果您将这些参数定义为F,那么它将起作用:

np.ndarray

给予

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize

mud=np.array([0.0014700734999999996,
 0.0011840320799999997,
 0.0014232304799999995,
 0.0008501509799999997,
 0.0007235751599999999,
 0.0005770661399999999,
 0.0005581295999999999,
 0.00028703807999999994,
 0.00014850233999999998])
F=np.array([0.5750972123893806,
 0.5512177433628319,
 0.5638906194690266,
 0.5240915044247788,
 0.5217873451327435,
 0.5066008407079646,
 0.5027256637168142,
 0.4847113274336283,
 0.46502123893805314])


fitfunc = lambda p, x: p[0]+p[1]*x # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Distance to the target function
p0 = [0.46,80,1] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:], args=(mud, F))

print(p1, success)

答案 1 :(得分:0)

这里是使用Van Deemter色谱方程式的图形拟合器,它非常适合您的数据。

plot

import numpy, scipy, matplotlib
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

# mud
xData=numpy.array([0.0014700734999999996,
0.0011840320799999997,
0.0014232304799999995,
0.0008501509799999997,
0.0007235751599999999,
0.0005770661399999999,
0.0005581295999999999,
0.00028703807999999994,
0.00014850233999999998])

# F
yData=numpy.array([0.5750972123893806,
0.5512177433628319,
0.5638906194690266,
0.5240915044247788,
0.5217873451327435,
0.5066008407079646,
0.5027256637168142,
0.4847113274336283,
0.46502123893805314])


def func(x, a, b, c): # Van Deemter chromatography equation
    return a + b/x + c*x


# these are the same as the scipy defaults
initialParameters = numpy.array([1.0, 1.0, 1.0])

# curve fit the test data
fittedParameters, pcov = curve_fit(func, xData, yData, initialParameters)

modelPredictions = func(xData, *fittedParameters) 

absError = modelPredictions - yData

SE = numpy.square(absError) # squared errors
MSE = numpy.mean(SE) # mean squared errors
RMSE = numpy.sqrt(MSE) # Root Mean Squared Error, RMSE
Rsquared = 1.0 - (numpy.var(absError) / numpy.var(yData))

print('Parameters:', fittedParameters)
print('RMSE:', RMSE)
print('R-squared:', Rsquared)

print()


##########################################################
# graphics output section
def ModelAndScatterPlot(graphWidth, graphHeight):
    f = plt.figure(figsize=(graphWidth/100.0, graphHeight/100.0), dpi=100)
    axes = f.add_subplot(111)

    # first the raw data as a scatter plot
    axes.plot(xData, yData,  'D')

    # create data for the fitted equation plot
    xModel = numpy.linspace(min(xData), max(xData))
    yModel = func(xModel, *fittedParameters)

    # now the model as a line plot
    axes.plot(xModel, yModel)

    axes.set_xlabel('X Data (mud)') # X axis data label
    axes.set_ylabel('Y Data (F)') # Y axis data label

    plt.show()
    plt.close('all') # clean up after using pyplot

graphWidth = 800
graphHeight = 600
ModelAndScatterPlot(graphWidth, graphHeight)