精华内容
下载资源
问答
  • 拟合未知数量的参数在本例中,我们尝试重现一些测量数据measData。在本例中,measData由函数measuredData(x, a=.2, b=-2, c=-.8, d=.1)生成。我练习,我们可能以某种方式测量了measData,所以我们不知道数学上是如何...

    拟合未知数量的参数

    在本例中,我们尝试重现一些测量数据measData。

    在本例中,measData由函数measuredData(x, a=.2, b=-2, c=-.8, d=.1)生成。我练习,我们可能以某种方式测量了measData,所以我们不知道数学上是如何描述的。因此适合。

    我们用多项式拟合,多项式由函数polynomFit(inp, *args)描述。由于我们要尝试不同阶的多项式,所以在输入参数的数量上要灵活是很重要的。

    自变量(在您的例子中是x和y)被编码在inp的“列/第二维度”。import numpy as np

    import matplotlib

    import matplotlib.pyplot as plt

    from scipy.optimize import curve_fit

    def measuredData(inp, a=.2, b=-2, c=-.8, d=.1):

    x=inp[:,0]

    y=inp[:,1]

    return a+b*x+c*x**2+d*x**3 +y

    def polynomFit(inp, *args):

    x=inp[:,0]

    y=inp[:,1]

    res=0

    for order in range(len(args)):

    print(14,order,args[order],x)

    res+=args[order] * x**order

    return res +y

    inpData=np.linspace(0,10,20).reshape(-1,2)

    inpDataStr=['({:.1f},{:.1f})'.format(a,b) for a,b in inpData]

    measData=measuredData(inpData)

    fig, ax = plt.subplots()

    ax.plot(np.arange(inpData.shape[0]), measData, label='measuered', marker='o', linestyle='none' )

    for order in range(5):

    print(27,inpData)

    print(28,measData)

    popt, pcov = curve_fit(polynomFit, xdata=inpData, ydata=measData, p0=[0]*(order+1) )

    fitData=polynomFit(inpData,*popt)

    ax.plot(np.arange(inpData.shape[0]), fitData, label='polyn. fit, order '+str(order), linestyle='--' )

    ax.legend( loc='upper left', bbox_to_anchor=(1.05, 1))

    print(order, popt)

    ax.set_xticklabels(inpDataStr, rotation=90)

    结果:

    展开全文
  • It works fine with the test code I created but when I try to implement this on my actual data I keep getting the following error TypeError: only arrays length -1 can be converted to python scalars ...

    I have been trying to use scipy.optimize curve_fit using multiple variables. It works fine with the test code I created but when I try to implement this on my actual data I keep getting the following error

    TypeError: only arrays length -1 can be converted to python scalars

    The shape of the arrays and the data types of their elements in my test code and actual code are exactly the same so I am confused as to why I get this error.

    Test code:

    import numpy as np

    import scipy

    from scipy.optimize import curve_fit

    def func(x,a,b,c):

    return a+b*x[0]**2+c*x[1]

    x_0=np.array([1,2,3,4])

    x_1=np.array([5,6,7,8])

    X=scipy.array([x_0,x_1])

    Y=func(X,3.1,2.2,2.1)

    popt, pcov=curve_fit(func,X,Y)

    Actual code:

    f=open("Exp_Fresnal.csv", 'rb')

    reader=csv.reader(f)

    for row in reader:

    Qz.append(row[0])

    Ref.append(row[1])

    Ref_F.append(row[2])

    Qz_arr,Ref_Farr=scipy.array((Qz)),scipy.array((Ref_F))

    x=scipy.array([Qz_arr,Ref_Farr]

    def func(x,d,sig_int,sig_cp):

    return x[1]*(x[0]*d*(math.exp((-sig_int**2)*(x[0]**2)/2)/(1-cmath.exp(complex(0,1)*x[0]*d)*math.exp((-sig_cp**2)*(x[0]**2)/2))))**2

    Y=scipy.array((Ref))

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

    EDIT

    Here is the full error message

    Traceback (most recent call last):

    File "DCM_03.py", line 46, in

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

    File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 651, in curve_fit

    res = leastsq(func, p0, args=args, full_output=1, **kwargs)

    File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 377, in leastsq

    shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)

    File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 26, in _check_func

    res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))

    File "//anaconda/lib/python2.7/site-packages/scipy/optimize/minpack.py", line 453, in _general_function

    return function(xdata, *params) - ydata

    File "DCM_03.py", line 40, in func

    return (0.062/(2*x))**4*(x*d*(math.exp((-sig_int**2)*(x**2)/2)/(1-cmath.exp(complex(0,1)*x*d)*math.exp((-sig_cp**2)*(x**2)/2))))**2

    TypeError: only length-1 arrays can be converted to Python scalars

    解决方案

    I figured out the issue. The problem for some reason was the use of math.exp and cmath.exp in the fitting function func. In place of these functions I used np.exp(). I am not completely sure the reason why though.

    展开全文
  • 本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn)表示为:引入x0=1,则...

    本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记

    现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,...,xn)

    表示为:

    引入x0=1,则公式

    转化为:

    1、加载训练数据

    数据格式为:

    X1,X2,Y

    2104,3,399900

    1600,3,329900

    2400,3,369000

    1416,2,232000

    将数据逐行读取,用逗号切分,并放入np.array

    #加载数据

    #加载数据

    def load_exdata(filename):

    data = []

    with open(filename, 'r') as f:

    for line in f.readlines():

    line = line.split(',')

    current = [int(item) for item in line]

    #5.5277,9.1302

    data.append(current)

    return data

    data = load_exdata('ex1data2.txt');

    data = np.array(data,np.int64)

    x = data[:,(0,1)].reshape((-1,2))

    y = data[:,2].reshape((-1,1))

    m = y.shape[0]

    # Print out some data points

    print('First 10 examples from the dataset: \n')

    print(' x = ',x[range(10),:],'\ny=',y[range(10),:])

    First 10 examples from the dataset:

    x = [[2104 3]

    [1600 3]

    [2400 3]

    [1416 2]

    [3000 4]

    [1985 4]

    [1534 3]

    [1427 3]

    [1380 3]

    [1494 3]]

    y= [[399900]

    [329900]

    [369000]

    [232000]

    [539900]

    [299900]

    [314900]

    [198999]

    [212000]

    [242500]]

    2、通过梯度下降求解theta

    (1)在多维特征问题的时候,要保证特征具有相近的尺度,这将帮助梯度下降算法更快地收敛。

    解决的方法是尝试将所有特征的尺度都尽量缩放到-1到1之间,最简单的方法就是(X - mu) / sigma,其中mu是平均值,sigma是标准差。

    (2)损失函数和单变量一样,依然计算损失平方和均值

    我们的目标和单变量线性回归问题中一样,是要找出使得代价函数最小的一系列参数。多变量线性回归的批量梯度下降算法为:

    求导数后得到:

    (3)向量化计算

    向量化计算可以加快计算速度,怎么转化为向量化计算呢?

    在多变量情况下,损失函数可以写为:

    对theta求导后得到:

    (1/2*m) *(X.T.dot(X.dot(theta) -y))

    因此,theta迭代公式为:

    theta = theta -(alpha/m) *(X.T.dot(X.dot(theta) -y))

    (4)完整代码如下:

    #特征缩放

    def featureNormalize(X):

    X_norm = X;

    mu = np.zeros((1,X.shape[1]))

    sigma = np.zeros((1,X.shape[1]))

    for i in range(X.shape[1]):

    mu[0,i] = np.mean(X[:,i]) # 均值

    sigma[0,i] = np.std(X[:,i]) # 标准差

    # print(mu)

    # print(sigma)

    X_norm = (X - mu) / sigma

    return X_norm,mu,sigma

    #计算损失

    def computeCost(X, y, theta):

    m = y.shape[0]

    # J = (np.sum((X.dot(theta) - y)**2)) / (2*m)

    C = X.dot(theta) - y

    J2 = (C.T.dot(C))/ (2*m)

    return J2

    #梯度下降

    def gradientDescent(X, y, theta, alpha, num_iters):

    m = y.shape[0]

    #print(m)

    # 存储历史误差

    J_history = np.zeros((num_iters, 1))

    for iter in range(num_iters):

    # 对J求导,得到 alpha/m * (WX - Y)*x(i), (3,m)*(m,1) X (m,3)*(3,1) = (m,1)

    theta = theta - (alpha/m) * (X.T.dot(X.dot(theta) - y))

    J_history[iter] = computeCost(X, y, theta)

    return J_history,theta

    iterations = 10000 #迭代次数

    alpha = 0.01 #学习率

    x = data[:,(0,1)].reshape((-1,2))

    y = data[:,2].reshape((-1,1))

    m = y.shape[0]

    x,mu,sigma = featureNormalize(x)

    X = np.hstack([x,np.ones((x.shape[0], 1))])

    # X = X[range(2),:]

    # y = y[range(2),:]

    theta = np.zeros((3, 1))

    j = computeCost(X,y,theta)

    J_history,theta = gradientDescent(X, y, theta, alpha, iterations)

    print('Theta found by gradient descent',theta)

    Theta found by gradient descent [[ 109447.79646964]

    [ -6578.35485416]

    [ 340412.65957447]]

    绘制迭代收敛图

    plt.plot(J_history)

    plt.ylabel('lost');

    plt.xlabel('iter count')

    plt.title('convergence graph')

    使用模型预测结果

    def predict(data):

    testx = np.array(data)

    testx = ((testx - mu) / sigma)

    testx = np.hstack([testx,np.ones((testx.shape[0], 1))])

    price = testx.dot(theta)

    print('price is %d ' % (price))

    predict([1650,3])

    price is 293081

    展开全文
  • John Lyon..26这个问题的公认答案提供您只需传入x和y点...注意:下面的代码已经过修改,可以进行多变量拟合,但是情节图像是早期非多变量答案的一部分.import numpyimport matplotlib.pyplot as pltimport multipolyfi...

    John Lyon..

    26

    这个问题的公认答案

    提供

    您只需传入x和y点的数组以及所需的拟合度(顺序)即可multipolyfit.这将返回系数,然后您可以使用numpy的polyval进行绘图.

    注意:下面的代码已经过修改,可以进行多变量拟合,但是情节图像是早期非多变量答案的一部分.

    import numpy

    import matplotlib.pyplot as plt

    import multipolyfit as mpf

    data = [[1,1],[4,3],[8,3],[11,4],[10,7],[15,11],[16,12]]

    x, y = zip(*data)

    plt.plot(x, y, 'kx')

    stacked_x = numpy.array([x,x+1,x-1])

    coeffs = mpf(stacked_x, y, deg)

    x2 = numpy.arange(min(x)-1, max(x)+1, .01) #use more points for a smoother plot

    y2 = numpy.polyval(coeffs, x2) #Evaluates the polynomial for each x2 value

    plt.plot(x2, y2, label="deg=3")

    注意:这是早期答案的一部分,如果您没有多变量数据,它仍然是相关的.而不是coeffs = mpf(...,使用coeffs = numpy.polyfit(x,y,3)

    对于非多变量数据集,最简单的方法是使用numpy polyfit:

    numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)

    最小二乘多项式拟合.

    拟合p(x) = p[0] * x**deg + ... + p[deg]度deg为项的多项式(x, y).返回最小化平方误差的系数p的向量.

    @jozzas模块`multipolyfit`来自哪里?尝试导入它会导致导入错误:`ImportError:没有名为multipolyfit.multipolyfit`的模块... (5认同)

    我刚刚注意到这个问题.我更新了repo的组织,添加了许可的开源许可证,并在PyPi上发布.你应该能够easy_install multipolyfit. (3认同)

    展开全文
  • 但是更的数据之间具有非线性关系。因此对线性回归法进行改进,使用多项式回归法,可以对非线性数据进行处理。1 什么是多项式回归 研究一个因变量与一个或个自变量间多项式的回归分析方法,称为多项式回归...
  • python线性拟合curve_fit

    千次阅读 2019-12-27 16:36:09
    曲线拟合转化为线性拟合     非线性回归的情况太过复杂,在...    一元非线性回归是指两个变量-----一个自变量,一个因变量之间呈现非线性关系,如双曲线、二次曲线、三()次曲线、幂曲线、指数曲线、对数...
  • 但是更的数据之间具有非线性关系。因此对线性回归法进行改进,使用多项式回归法,可以对非线性数据进行处理。0x01 什么是多项式回归 研究一个因变量与一个或个自变量间多项式的回归分析方法,称为多项式回归...
  • 缺点:对非线性的数据拟合不好。适用数据类型:数值型和标称型。1.2、分类一元线性回归:涉及到的变量只有一个。多元线性回归:涉及到的变量两个或两个以上。1.3、公式image.png其中????,????为矩阵:????,????为...
  • 多项式回归理论上可以以上的方法拟合任何曲线,但前提条件是要事先对模型的形式进行判断,即知道非线性模型的参数设置。在一般情况下, 通过绘制散点图的形式可以做到这一点。但是在更一般的情况下,如有个自变量...
  • 在数据科学和分析领域中,对非线性数据进行建模是一项常规任务。但找到一个结果随自变量线性变化的自然过程很不容易。因此,需要有一种简便并且稳健的...是否需要为多变量回归加上交叉耦合项?有没有简单的方法将这...
  • # 线性模型拟合 model = linear_model.LinearRegression() model.fit(x_train, y) 预测 #预测结果 result = model.predict(x_test) 二、逻辑回归 全部代码 1、代价函数 可以综合起来为: 其中: ...
  • Python机器学习应用 | 多项式回归

    千次阅读 2017-06-24 14:16:17
    在一元回归分析中,如果依变量y与自变量x的关系为非线性的,但是又找不到适当的函数曲线来拟合,则可以采用一元多项式回归。 多项式回归的最大优点就是可以通过增加x的高次项对实测点进行逼近,直
  • 多项式回归:处理的是一些非线性问题,像一些无法用直线拟合的离散点,比方说随着工龄的增长和职位的升高而 增加的薪酬。这样的问题,往往只有一个自变量。多项式回归还是比较简单的///举一个栗子///一家企业:十个...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

python多变量非线性拟合

python 订阅