精华内容
下载资源
问答
  • python手写多项式拟合曲线拟合

    千次阅读 2018-04-26 18:24:08
    然后洗澡的时候就在想一个问题,线性回归会了,写线性拟合是完全没问题的,但是np库的多项式拟合到底是怎么做出来的呢?突然灵光一闪多项式拟合?多变量的线性回归?好像发现了什么?重新理清一下思路。什么是多项式...

    上篇博客写完之后,终于发现自己线性回归入门!

    然后洗澡的时候就在想一个问题,线性回归会了,写线性拟合是完全没问题的,但是np库的多项式拟合到底是怎么做出来的呢?突然灵光一闪多项式拟合?多变量的线性回归?好像发现了什么?重新理清一下思路。什么是多项式拟合?对的,这个问题以前没有好好思考过,以前的直观感觉是,不就是给一些x,y的点,让一个多项式去拟合,使得这个多项式的曲线看起来大致符合那些点。等等,好像忽略了什么,什么叫大致符合?对的,什么叫大致符合?答案已在心中了!就是让这些点距离这个拟合曲线的和最小!慢着,这其实就是线性回归的损失函数的定义嘛!最小化,损失函数!多项式多个参数怎么确定?多变量线性回归!每个一个次方项当成独立的一个变量!比如a*x^2+b*x+c这个标准的二次项,x^2当成x1,x当成x2,1当成x3!好了,整个思路有了,尝试一下实现吧!

    import numpy as np
    
    def my_fit(x, y, power):
        size = len(x)
        c = np.ones((1, size))
        x_arr = np.array(x)
        x_a=x_arr.copy()
        x_a.resize((1,size))
        x_mat = np.append(x_a, c, axis=0)
        y_arr = np.array(y)
        y_arr.resize((1, size))
        y_mat = np.mat(y_arr)
        for i in range(2, power+1):
            temp_x = x_arr**i
            temp_x.resize((1, size))
            x_mat = np.append(temp_x, x_mat, axis=0)
        x_mat=np.mat(x_mat)
        w = (x_mat * x_mat.T).I * x_mat * y_mat.T
        w0=w.T
        w0.resize(w0.size)
        return w0
    
    def f(x):
        return 2*x ** 2 +x+3
    
    x = np.linspace(-5, 5)
    y = f(x) + 0.5*np.random.randn(len(x))  # 加入噪音
    y_fit = np.polyfit(x, y, 2)  # 二次多项式拟合
    print(y_fit)
    w=my_fit(x,y,2)
    print(w)
    激动人心的时候到了,看下输出:
    [1.99205043 1.00302882 3.08335708]
    [1.99205043 1.00302882 3.08335708]

    竟然和np库的结果完全一样!惊了!虽说实现代码不算优美,但是基本思路没啥区别!懒得调参用梯度下降了,直接解出来。

    很好,还有一个疑问,scipy的曲线拟合怎么做的呢?一样嘛!当成多变量线性回归就好!

    code:

    import numpy as np
    from scipy.optimize import curve_fit
    
    
    def f_fit(x, a, b, c):
        return a*np.sin(x)+b*x+c
    
    
    def f_test(x):
        return 2*np.sin(x)+3*x+1
    
    
    def my_curve_fit1(fit_fun, x, y, p_num):  #p_num参数的个数
        size = len(x)
        if p_num <= 0 or p_num > size:
            print('no parameter to fit')
            return
        test_list = [0]*p_num
        test_list[0] = 1
        x_arr = np.array(fit_fun(x, *test_list))
        x_arr.resize((1, size))
        for i in range(1, p_num):
            test_list[i-1] = 0
            test_list[i] = 1
            temp_x = np.array(fit_fun(x, *test_list))
            temp_x.resize((1, size))
            x_arr = np.append(x_arr, temp_x, axis=0)
        x_mat = np.mat(x_arr)
        y_arr = np.array(y)
        y_arr.resize((1, size))
        y_mat = np.mat(y_arr)
        w = (x_mat * x_mat.T).I * x_mat * y_mat.T
        w0 = w.T
        w0.resize(w0.size)
        return w0
    
    #为了强行接近库函数的接口,无需参数的个数,但实现有点捞
    #很容易知道参数个数多于样本x的个数无法拟合
    def my_curve_fit2(fit_fun, x, y):
        test_list = [0]
        size = len(x)
        p_num = 1  #参数个数默认为1
        for i in range(0, size):
            try:
                fit_fun(x, *test_list)
                break
            except:
                p_num += 1
                test_list.append(0)
        if p_num > size:
            print('can not fit')
            return
        test_list[0] = 1
        x_arr = np.array(fit_fun(x, *test_list))
        x_arr.resize((1, size))
        for i in range(1, p_num):
            test_list[i - 1] = 0
            test_list[i] = 1
            temp_x = np.array(fit_fun(x, *test_list))
            temp_x.resize((1, size))
            x_arr = np.append(x_arr, temp_x, axis=0)
        x_mat = np.mat(x_arr)
        y_arr = np.array(y)
        y_arr.resize((1, size))
        y_mat = np.mat(y_arr)
        w = (x_mat * x_mat.T).I * x_mat * y_mat.T
        w0 = w.T
        w0.resize(w0.size)
        return w0
    
    
    
    
    
    x = np.linspace(-2*np.pi, 2*np.pi)
    y = f_test(x)+0.3*np.random.randn(len(x))   #加入噪音
    p_fit, prov = curve_fit(f_fit, x, y)  #曲线拟合
    my_fit1 = my_curve_fit1(f_fit, x, y, 3)
    my_fit2 = my_curve_fit2(f_fit, x, y)
    print('sicpy库的曲线拟合')
    print('a,b,c', p_fit)
    print('手写曲线拟合1')
    print('a,b,c', my_fit1)
    print('手写曲线拟合2')
    print('a,b,c', my_fit2)
    输出:
    sicpy库的曲线拟合
    a,b,c [1.99131057 3.00473361 1.05173153]
    手写曲线拟合1
    a,b,c [1.99131057 3.00473361 1.05173153]
    手写曲线拟合2
    a,b,c [1.99131057 3.00473361 1.05173153]

    结果竟然也就是一样!厉害了,竟然一样。好了,实现的小窍门用到了列表参数传递,想单独提出来的那个项,就令该项的参数为1,其他参数为0,然后就把每个项都单独提出来。一用多变量线性回归,搞掂!然后为了强行接近scipy库的曲线拟合的接口,不知道有几个参数拟合,怎么办呢?好像没有什么好的方法,只好用try来试了,反正传的参数个数不对就会报错的,就一个一个参数往上加咯。

    以上。

    展开全文
  • python + numpy + np.polyfit()(最小二乘多项式拟合曲线
    import numpy as np
    
    x = np.arange(1994, 2004, 1)
    y = np.array([67.052, 68.008, 69.803, 72.024, 73.400, 72.063, 74.669, 74.487, 74.065, 76.777])
    
    # 10代表拟合10次多项式,可以自由更改
    z1 = np.polyfit(x, y, 10)  # 系数的集合
    p1 = np.poly1d(z1)  # 多项式
    
    展开全文
  • python 曲线多项式拟合

    2020-02-24 13:36:02
    [参考文章:python 曲线拟合(numpy.polyfit、scipy.optimize.curve_fit)](https://blog.csdn.net/Fuxiu279/article/details/88429801)
    展开全文
  • 原文地址:http://wiki.klniu.com/zh-hans/Python/Modules/Scipy import numpy as np from scipy. optimize import leastsq import pylab as pl   x = np. arange ( 1 , 17 , 1 ) y = np. ...
    原文地址:http://wiki.klniu.com/zh-hans/Python/Modules/Scipy
    
    
    import numpy as np
    from scipy.optimize import leastsq
    import pylab as pl
     
    x = np.arange(1, 17, 1)
    y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
     
    #第一个拟合,自由度为3
    z1 = np.polyfit(x, y, 3)
    # 生成多项式对象
    p1 = np.poly1d(z1)
    print(z1)
    print(p1)
     
    # 第二个拟合,自由度为6
    z2 = np.polyfit(x, y, 6)
    
    # 生成多项式对象
    p2 = np.poly1d(z2)print(z2)print(p2) # 绘制曲线 # 原曲线pl.plot(x, y, 'b^-', label='Origin Line')pl.plot(x, p1(x), 'gv--', label='Poly Fitting Line(deg=3)')pl.plot(x, p2(x), 'r*', label='Poly Fitting Line(deg=6)')pl.axis([0, 18, 0, 18])pl.legend()# Save figurepl.savefig('scipy02.png', dpi=96)

    输出结果:

    [ 0.00624491 -0.20371114  2.18193147  2.57208791]
              3          2
    0.006245 x - 0.2037 x + 2.182 x + 2.572
    [ -1.89843481e-06   1.90557772e-04  -6.80682074e-03   1.16832830e-01
      -1.04793542e+00   4.90253564e+00   1.76057692e-02]
                6             5            4          3         2
    -1.898e-06 x + 0.0001906 x - 0.006807 x + 0.1168 x - 1.048 x + 4.903 x + 0.01761
    

    图像:

    Scipy02.png

    展开全文
  • 多项式曲线拟合Polynomial Curve Fitting实验目标实现过程- Step 1 :生成观测集和目标函数- Step 2 :比较不同阶数多项式拟合效果- Step 3 :通过增大数据...利用Python实现多项式曲线拟合。 实现过程 - Step 1...
  • ```python # -*- coding: utf-8 -*- """ @File : plot.py @Time : 2020/2/24 8:55 @Author : Dontla @Email : sxana@qq.com @Software: PyCharm """ import matplotlib.pyplot as plt import numpy as np # 如...
  • 多项式拟合正弦曲线

    2020-10-11 16:06:23
    用高阶多项式函数拟合曲线; 用解析解求解两种loss的最优解(无正则项和有正则项); 优化方法求解最优解(梯度下降,共轭梯度); 用你得到的实验数据,解释过拟合。 用不同数据量,不同超参数,不同的...
  • 多项式拟合.py

    2019-07-19 10:48:37
    python输入X,Y的数据散点,然后多项式拟合进行拟合曲线
  • 最小二乘法多项式曲线拟合及其python实现多项式曲线拟合问题描述最小二乘法针对overfitting,加入正则项python实现运行结果 多项式曲线拟合问题描述 ...多项式拟合问题本质是一个优化问题,目标函数是使R...
  • Tyson对this question的公认回答提供了您只需将x和y点的...注意:下面的代码已修改为进行多变量拟合,但绘图图像是早期非多变量答案的一部分。import numpyimport matplotlib.pyplot as pltimport multipolyfit as ...
  • python散点图拟合曲线-python曲线拟合

    千次阅读 2020-11-01 12:49:45
    http://blog.sina.com.cn/s/blog_aed5bd1d0102vid7.html1.多项式拟合范例:import matplotlib.pyplot as pltimport numpy as np#潘海东,2014/1/13x = np.arange(1, 17, 1)y = np.array([4.00, 6.40, 8.00, 8.80, ...
  • 问题: 梯度下降法——拟合函数 1.三次函数拟合正弦余弦函数 2.多项式函数拟合正弦余弦函数 3.傅里叶级数拟合正弦余弦函数 4.管他什么函数拟合什么函数 痛点难点一阵见血通通解决
  • 大家好,我正在尝试使用python拟合点的曲线,但是我还没有...在numpy中,对于多项式拟合,有polyfit()和polyval().但是我收到此错误,并且我不知道这意味着什么:File "plantilla.py", line 28, in polinomio=n...
  • 但不得不说的是Matlab只需五行代码就解决了~ import tensorflow as tf import numpy as np import matplotlib.pyplot as plt x_data = np.linspace(0, 1,11) y_data = 0.5 + 0.4 * np.sin(2 * np.pi * x_data) ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 132
精华内容 52
关键字:

python多项式拟合曲线

python 订阅