精华内容
下载资源
问答
  • 一次拟合和二次拟合
    千次阅读
    2021-05-22 10:52:07

    二次函数拟合算法

    原理:

    在给定一组数据序列(x i,y i),i=0,1,2…m,用二次多项式拟合这组数据时,设

    p(x)=a0+a1x+a2x2,则根据拟合函数与数据序列的均方误差最小原则,可以得到二次多项式函数拟合的矩阵计算方程如下所示:

    (

    m x i

    m

    i=1

    x i2

    m

    i=1

    x i

    m

    i=1

    x i2

    m

    i=1

    x i3

    m

    i=1

    x i2

    m

    i=1

    x i3

    m

    i=1

    x i4

    m

    i=1

    )(

    a0

    a1

    a2

    )= (

    y i

    m

    i=1

    x i y i

    m

    i=1

    x i2y i

    m

    i=1

    )

    在我们的计算库伦效应实例中,Y即为每个Cycle对应的DischargeC/ChargeC的比值,X即

    为每个Cycle对应的数字。

    代码中定义的三个矩阵XX,AA,YY则分别对应原理公式中等式左边X系数矩阵,A系数矩阵

    以及等式右边包含Y系数的矩阵。

    具体步骤:

    1:先将矩阵中需要的所有量计算出来,并且存放在XX,AA,YY三个矩阵中。

    2:为了求得系数矩阵AA,我们需要先把XX矩阵求逆,然后与YY矩阵相乘。函数MRinv

    即为矩阵求逆的函数,返回时存放其逆矩阵。

    3:得到系数矩阵AA之后,即得到了拟合好的二次函数,将此二次函数输出在Excel表中。具体代码实现:

    步骤1对应代码:

    更多相关内容
  • 基于LabVIEW的一元二次方程曲线拟合,输入组X的值,组Y的值拟合出一元二次方程。Y=aX^2+bX+c
  • 利用matlab拟合三维离散点对应的二次曲面。 其中,二次曲面公式为z = x^2 + y^2 + xy + x + y
  • Matlab多变量二次多项式拟合.pdfMatlab多变量二次多项式拟合.pdfMatlab多变量二次多项式拟合.pdfMatlab多变量二次多项式拟合.pdfMatlab多变量二次多项式拟合.pdfMatlab多变量二次多项式拟合.pdfMatlab多变量二次...
  • 器学习次回归和二次回归 reshape(行,列)可以根据指定的数值将数据转换为特定的行数列数###reshape(-1,1)之后,数据集变成了列 #采用线性回归方程预测 lr=LinearRegression() lr.fit (X,y) from sklearn....

    器学习一次回归和二次回归

    reshape(行,列)可以根据指定的数值将数据转换为特定的行数和列数###reshape(-1,1)之后,数据集变成了一列

    #采用线性回归方程预测
    lr=LinearRegression()
    lr.fit (X,y)
    from sklearn.linear_model import LinearRegression
    lr = LinearRegression()
    # 训练模型(为了方便没有拆封训练集和测试集)
    X = x.reshape(-1,1)
    print(X.shape)
    lr.fit(X,y)
    # 训练过程就是寻找最佳权重和偏置的过程
    print('权重',lr.coef_,'偏置',lr.intercept_)
    y_predict = lr.predict(X)
    plt.scatter(x,y)
    # 生成线性图,观察预测值与真实值的误差
    plt.plot(x,y_predict,color='r')
    plt.show()
    print(lr.score(X,y))

    一次线性方程不合适,转变为二次线性方程

    # y = w * x + b ===>  y = w1 * x**2 + w2 * x + b
    print((X**2).shape)
    # hstack 在水平方向追加, vstack垂直方向叠加
    X2 = np.hstack([X**2,X])   # 将x^2 作为跟X一样的参数,使多计算一个权重
    print(X2.shape)
    
    ## 
    
    ```python
    import numpy as np
    import matplotlib.pyplot as plt
    # 在指定[-3,3]随机生成size个随机数(代表的特征值)
    x = np.random.uniform(-3,3,size=100)
    print(x,x.shape)
    # 模拟目标值(y) 与x并不是简单的线性关系
    y = 0.5 * x**2 + x + 2 + np.random.normal(0,1,size=100)
    
    # 采用线性回归的方程来预测
    from sklearn.linear_model import LinearRegression
    lr = LinearRegression()
    # 训练模型(为了方便没有拆封训练集和测试集)
    X = x.reshape(-1,1)
    print(X.shape)
    lr.fit(X,y)
    # 训练过程就是寻找最佳权重和偏置的过程
    print('权重',lr.coef_,'偏置',lr.intercept_)
    y_predict = lr.predict(X)
    plt.scatter(x,y)
    # 生成线性图,观察预测值与真实值的误差
    plt.plot(x,y_predict,color='r')
    plt.show()
    print(lr.score(X,y))
    
    
    # y = w * x + b ===>  y = w1 * x**2 + w2 * x + b
    print((X**2).shape)
    # hstack 在水平方向追加, vstack垂直方向叠加
    X2 = np.hstack([X**2,X])   # 将x^2 作为跟X一样的参数,使多计算一个权重
    print(X2.shape)
    # 线性回归模型进行训练
    lr = LinearRegression()
    lr.fit(X2,y)
    # 训练过程就是寻找最佳权重和偏置的过程
    print('权重',lr.coef_,'偏置',lr.intercept_)
    y_predict = lr.predict(X2)
    # 真实的数据集采用散点图显示
    plt.scatter(x,y)
    # 预测数据集,采用线形图显示,必须按照x轴从小到大进行绘制
    # plt.plot(x,y_predict,color='r')
    plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
    plt.show()
    print(lr.score(X2,y))
    
    
    展开全文
  • 今天小编就为大家分享篇对python实现维函数高次拟合的示例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 二次曲面拟合

    2018-01-17 09:45:49
    完整的二次曲面拟合程序
  • 最小二乘法的二次曲线拟合程序,很好用 最小二乘法的二次曲线拟合程序,很好用
  • 二次拟合MATLAB m文件代码
  • 简单明了地对离散点进行二次拟合,数值算法中的种,准确度较高,误差小
  • 使用线性拟合和二次拟合的方法进行求解
  • #演示内容:二次回归线性回归的拟合效果的对比 """ print(__doc__) import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn....
  • Matlab源程序代码,著名的PSO程式代码,用于拟合二次曲线,曲面的代码,适用于粒子系统。(Matlab source code, the famous PSO program code for the quadratic curve-fitting, Surface code applicable to the ...
  • excel二次拟合

    2016-04-25 10:27:49
    二次拟合
  • 采样点数据、matlab代码(注释详细)、文献份、PPT份。。DEM 内插就是根据参考点 上的高程求 出其他待 定点上的高程 ,在...移动曲 面拟合法内插 ,是以每待定点为中心 ,定义个局部 函数去拟合周围的数据点。
  • 实现二次曲线的拟合.不是很完善,望多多指教。
  • 基于最小二乘法的离散点拟合曲线程序,可以拟合直线,圆,二次曲线
  • 该程序执行二次方程的曲线拟合
  • 通过二次曲面拟合的方式建立模型,实现大地高,正常高,高程异常值之间的相互转换,实现拟合模型成功建立。
  • matlab三维散乱点云数据拟合二次曲面,包括数据data.mat(以x,y,z坐标形式保存)、运行代码curfit.m、运行结果
  • 介绍基于双能量γ射线透射法测量煤灰分原理的二次曲线拟合算法,解决传统同一矿源煤灰分测量直线拟合算法过程烦琐有效测量范围小等问题,简要介绍最小二乘法的基本原理以及传统直线拟合算法的数学模型,并用MATLAB...
  • 一次函数 对于拟合一元一次函数,我们只需要个神经元:

    一次函数

    对于拟合一元一次函数,我们只需要一个神经元:

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    import numpy as np
    import matplotlib.pyplot as plt
    import os
    #tf.enable_eager_execution()
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    x_test = np.linspace(-200,200,1000)
    y_test = x_test * 3.14 + 2.12
    x_data = np.random.uniform(-100,100,10000)
    y_data = x_data * 3.14 + 2.12 + np.random.normal(0,20,10000)
    plt.plot(x_data,y_data,'.')
    plt.plot(x_test,y_test)
    
    model = tf.keras.Sequential()
    model.add(layers.Dense(1, activation=None))
    
    model.compile(optimizer=tf.keras.optimizers.Adam(0.1),
                  loss='mse',       # mean squared error
                  metrics=['mae'])  # mean absolute error
    
    model.fit(x_data.reshape(-1,1), y_data.reshape(-1,1), epochs=10, batch_size=20)
    
    y_pred = model.predict(x_test,batch_size=20)
    plt.plot(x_test,y_pred,'--')
    

    注意此时我们不需要激发函数,所以将神经元中的激发函数设置为None。(也可以设置为linear)

    神经网络模型中需要注意的是输出层的神经元数量需要与y_data的维度相同。
    如果y_data的维度为1,输出层有n个神经元,则之后的预测值y_pred也会相应的维度变为n,并且每一个维度数值相同。
    如果输出层有1一个神经元,y_data的维度为n,则之后的预测值y_pred维度变为1,训练结果更接近y_data取均值后的结果。这可能是矩阵运算中的降维处理造成的。
    其他维度不匹配的情况会报错。

    线性拟合

    我们尝试拟合一个多元线性模型:

    k1 = 3.14
    k2 = 5.67
    k3 = 2
    k4 = 2
    b = 10
    beta = 2
    
    x1_data = np.random.uniform(-100,100,10000)
    x2_data = np.random.uniform(-100,100,10000)
    x3_data = np.random.uniform(-100,100,10000)
    x4_data = np.random.uniform(-100,100,10000)
    be_data = np.zeros(10000)
    be_data[:5000] = 1
    y_data = k1*x1_data + k2 *x2_data + k3* x3_data + k4* x4_data + b + beta * be_data 
    x_data = np.concatenate([x1_data.reshape(-1,1),x2_data.reshape(-1,1),x3_data.reshape(-1,1),x4_data.reshape(-1,1),be_data.reshape(-1,1)],axis = 1)
    
    x1_test = np.random.uniform(-200,200,10000)
    x2_test = np.random.uniform(-200,200,10000)
    x3_test = np.random.uniform(-200,200,10000)
    x4_test = np.random.uniform(-200,200,10000)
    be_test = np.zeros(10000)
    be_test[:5000] = 5
    y_test = k1*x1_test + k2 *x2_test + k3* x3_test + k4* x4_test + b + beta * be_test 
    x_test = np.concatenate([x1_test.reshape(-1,1),x2_test.reshape(-1,1),x3_test.reshape(-1,1),x4_test.reshape(-1,1),be_test.reshape(-1,1)],axis = 1)
    
    model = tf.keras.Sequential()
    #model.add(layers.Dense(5, activation=None))
    model.add(layers.Dense(1, activation=None))
    
    callback = tf.keras.callbacks.EarlyStopping(monitor='loss')
    model.compile(optimizer=tf.keras.optimizers.Adam(0.1),
                  callback = [callback],
                  loss='mse',       # mean squared error
                  metrics=['mae'])  # mean absolute error
    
    model.fit(x_data, y_data.reshape(-1,1), epochs=500, batch_size=1000)
    
    y_pred = model.predict(x_data,batch_size=20)
    fig = plt.figure(figsize = [15,15])
    ax = fig.add_subplot(121)
    ax.plot(y_data,y_pred,'.')
    y_pred = model.predict(x_test,batch_size=20)
    ax = fig.add_subplot(122)
    ax.plot(y_test,y_pred,'.')
    

    在各个系数大小差距不大时,训练可以得到很好的结果,并且只需要一个神经元。

    但是,如果我们的系数相差很大,比如:

    k1 = 3.14
    k2 = 5.67
    k3 = 0.001
    k4 = 1311
    b = 10
    beta = 50
    

    我们可以打开上一段代码中的注释,加入一层5个神经元的hidden layer。这相当于一个感知器

    然后我们来测试一下这个模型对噪音的承受能力:

    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    k1 = 3.14
    k2 = 5.67
    k3 = 0.001
    k4 = 1311
    b = 10
    beta = 50
    
    x1_data = np.random.uniform(-100,100,10000)
    x2_data = np.random.uniform(-100,100,10000)
    x3_data = np.random.uniform(-100,100,10000)
    x4_data = np.random.uniform(-100,100,10000)
    be_data = np.zeros(10000)
    be_data[:5000] = 1
    y_data = k1*x1_data + k2 *x2_data + k3* x3_data + k4* x4_data + b + beta * be_data + np.random.normal(0,10,10000)
    x_data = np.concatenate([x1_data.reshape(-1,1),x2_data.reshape(-1,1),x3_data.reshape(-1,1),x4_data.reshape(-1,1),be_data.reshape(-1,1)],axis = 1)
    
    x1_test = np.random.uniform(-200,200,10000)
    x2_test = np.random.uniform(-200,200,10000)
    x3_test = np.random.uniform(-200,200,10000)#*1000
    x4_test = np.random.uniform(-200,200,10000)#/1000
    be_test = np.zeros(10000)
    be_test[:5000] = 5
    y_test = k1*x1_test + k2 *x2_test + k3* x3_test + k4* x4_test + b + beta * be_test + np.random.normal(0,10,10000)
    x_test = np.concatenate([x1_test.reshape(-1,1),x2_test.reshape(-1,1),x3_test.reshape(-1,1),x4_test.reshape(-1,1),be_test.reshape(-1,1)],axis = 1)
    
    model = tf.keras.Sequential()
    model.add(layers.Dense(5, activation=None))
    model.add(layers.Dense(1, activation=None))
    
    callback = tf.keras.callbacks.EarlyStopping(monitor='loss')
    model.compile(optimizer=tf.keras.optimizers.Adam(0.1),
                  callback = [callback],
                  loss='mse',       # mean squared error
                  metrics=['mae'])  # mean absolute error
    
    model.fit(x_data, y_data.reshape(-1,1), epochs=500, batch_size=1000)
    
    y_pred = model.predict(x_data,batch_size=20)
    fig = plt.figure(figsize = [15,15])
    ax = fig.add_subplot(121)
    ax.plot(y_data,y_pred,'.')
    y_pred = model.predict(x_test,batch_size=20)
    ax = fig.add_subplot(122)
    ax.plot(y_test,y_pred,'.')
    
    

    总体而言,拟合效果很不错。

    二次函数

    由于tensorflow.keras提供的激发函数大部分是局部线性的,所以神经网络可以看作是一个很多线性函数的组合(包括链式、分段、叠加等),所以很难提供很好的拟合结果,特别是在训练集的范围之外:

    # -*- coding: utf-8 -*-
    """
    Created on Thu Feb 27 12:01:59 2020
    
    @author: Danphnis
    """
    
    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    import numpy as np
    import matplotlib.pyplot as plt
    import os
    #tf.enable_eager_execution()
    os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
    
    x_test = np.linspace(-200,200,1000)
    y_test = x_test**2
    x_data = np.random.uniform(-100,100,10000)
    y_data = x_data**2 + np.random.normal(0,300,10000)
    xmax = x_test.max()
    ymax = y_test.max()
    x_test = x_test/xmax
    y_test = y_test/ymax
    x_data = x_data/xmax
    y_data = y_data/ymax
    plt.plot(x_data,y_data,'.')
    plt.plot(x_test,y_test)
    
    model = tf.keras.Sequential()
    #model.add(layers.Dense(1, activation='relu'))
    #model.add(layers.Dense(10, activation='exponential'))
    model.add(layers.Dense(1, activation=None))
    model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
                  loss='mse',       # mean squared error
                  metrics=['mae'])  # mean absolute error
    
    model.fit(x_data.reshape(-1,1), y_data.reshape(-1,1), epochs=1, batch_size=100)
    
    
    y_pred = model.predict(x_test.reshape(-1,1),batch_size=20)
    print(y_pred.shape)
    #plt.plot(x_test,y_pred,'--')
    

    如果你想使用‘exponential’的激发函数,注意由于其导数也是指数增加的,在大范围内将造成梯度爆炸,此时需要将学习率设置的很小,或者将训练数据归一化。

    展开全文
  • 高斯维拟合 最小二乘多次拟合
  • 通过已知点的【X,Y,高程异常ζ】,采用二次曲面拟合,通过最小二乘法计算未知点的高程异常ζ。注意这里原始数据是直接给出了高程异常值ξ,不是给的Hh(H是大地高,h是正常高),如果原始数据格式是Hh,可以...
  • spline 拟合二次函数

    2018-12-06 10:41:53
    使用spline(三次样条法)进行多项式逼近二次函数。code in matlab
  • matlab_GPS卫星钟差预报模型的精度评定_线性拟合模型、带有周期项的线性拟合模型、二次拟合模型、带有周期项的二次拟合
  • 该工具箱提供了个相当全面的工具集,用于在变量误差上下文中估计二次曲线曲面,有约束无约束。 除了经典的拟合方法,例如最小二乘法(有没有曲线或曲面法线)、Taubin 方法、Fitzgibbon 等人的直接椭圆拟合...
  • 二次拟合MATLAB m文件代码线性回归1变量 该项目展示了如何使用线性回归来预测Matlab中的数据趋势。 数据业务环境是从Coursera的Mahcine Learning课程的更大任务中提取的,该课程位于。 假设我们正在经营一家在多个...
  • Python 最小二乘法 拟合 二次曲线

    千次阅读 2021-01-14 10:55:46
    最小二乘Python 二次拟合 随机生成数据,并且加上噪声干扰构造需要拟合的函数形式,使用最小二乘法进行拟合输出拟合后的参数将拟合后的函数与原始数据绘图后进行对比import numpy as npimport matplotlib.pyplot as ...

    最小二乘

    Python 二次拟合

    随机生成数据,并且加上噪声干扰

    构造需要拟合的函数形式,使用最小二乘法进行拟合

    输出拟合后的参数

    将拟合后的函数与原始数据绘图后进行对比

    import numpy as np

    import matplotlib.pyplot as plt

    from scipy.optimize import leastsq

    # X = np.array(xx)

    # Y = np.array(yy)

    X = np.linspace(0, 10, 100)

    Y = 4 * X ** 2 - 9 * X + 3 + np.random.randn(100) * 3

    # 二次函数的标准形式

    def func(params, x):

    a, b, c = params

    return a * x * x + b * x + c

    # 误差函数,即拟合曲线所求的值与实际值的差

    def error(params, x, y):

    return func(params, x) - y

    # 对参数求解

    def slovePara():

    p0 = [1, 1, 1]

    Para = leastsq(error, p0, args=(X, Y))

    return Para

    # 输出最后的结果

    def solution():

    Para = slovePara()

    a, b, c = Para[0]

    print("a=", a, " b=", b, " c=", c)

    print("cost:" + str(Para[1]))

    plt.scatter(X, Y, color="green", label="sample data", linewidth=2)

    # 画拟合直线

    x = np.linspace(0, 10, 100)

    y = a * x * x + b * x + c

    plt.plot(x, y, color="red", label="solution line", linewidth=2)

    plt.legend() # 绘制图例

    plt.show()

    solution()

    样0本点很杂乱的情况下

    将异常点去除后进行拟合

    拟合的函数需要大致符合函数图像的趋势

    def func(params, x):

    a, b, c = params

    return 1 / (a + b * np.exp(-c * x))

    拟合结果

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,360
精华内容 40,944
热门标签
关键字:

一次拟合和二次拟合