如何matlab或者python实现多元函数的非线性拟合。

2021-02-07 09:56发布

比如z=f(x,y),给出(x,y,z)的多个数据点,然后怎么拟合出f函数,给出源码就更好了

比如z=f(x,y),给出(x,y,z)的多个数据点,然后怎么拟合出f函数,给出源码就更好了

2条回答
是开心果呀 - 热爱生活
2楼 · 2021-02-07 10:34

import matplotlib.pyplot as ptimport numpy as npfrom scipy.optimize import leastsqfrom pylab import *time = []counts = []for i in open('/some/folder/to/file.txt', 'r'):
segs = i.split()
time.append(float(segs[0]))
counts.append(segs[1])time_array = arange(len(time), dtype=float)counts_array = arange(len(counts))time_array[0:] = time
counts_array[0:] = counts

def model(time_array0, coeffs0):
a = coeffs0[0] + coeffs0[1] * np.exp( - ((time_array0-coeffs0[2])/coeffs0[3])**2 )
b = coeffs0[4] + coeffs0[5] * np.exp( - ((time_array0-coeffs0[6])/coeffs0[7])**2 )
c = a+b return c

kitidog2016
3楼 · 2021-02-07 18:22

现在用最小二乘法拟合多元函数,实现线性拟合与非线性拟合,其中非线性拟合要求自定义拟合函数。

    下面给出三种拟合方式,第一种是多元线性拟合(回归),第二三种是多元非线性拟合,实际中第二三种方法是一个意思,任选一种即可,推荐第二种拟合方法。

1. MATLAB程序

fit_nonlinear_data.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function [beta, r]=fit_nonlinear_data(X, Y, choose)
% Input: X 自变量数据(N, D), Y 因变量(N, 1),choose 1-regress, 2-nlinfit 3-lsqcurvefit
if choose==1
    X1=[ones(length(X(:, 1)), 1), X];
    [beta, bint, r, rint, states]=regress(Y, X1)
    % 多元线性回归
    % y=beta(1)+beta(2)*x1+beta(3)*x2+beta(4)*x3+...
    ?ta—系数估计
    % bint—系数估计的上下置信界
    % r—残差
    % rint—诊断异常值的区间
    % states—模型统计信息
    rcoplot(r, rint)
    saveas(gcf,sprintf('线性曲线拟合_残差图.jpg'),'bmp');
elseif choose==2
    beta0=ones(7, 1);
    % 初始值的选取可能会导致结果具有较大的误差。
    [beta, r, J]=nlinfit(X, Y, @myfun, beta0)
    % 非线性回归
    ?ta—系数估计
    % r—残差
    % J—雅可比矩阵
    [Ypred,delta]=nlpredci(@myfun, X, beta, r, 'Jacobian', J)
    % 非线性回归预测置信区间
    % Ypred—预测响应
    ?lta—置信区间半角
    plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r');
    saveas(gcf,sprintf('非线性曲线拟合_1.jpg'),'bmp');
elseif choose==3
    beta0=ones(7, 1);
    % 初始值的选取可能会导致结果具有较大的误差。
    [beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@myfun,beta0,X,Y)
    % 在最小二乘意义上解决非线性曲线拟合(数据拟合)问题
    ?ta—系数估计
    % resnorm—残差的平方范数 sum((fun(x,xdata)-ydata).^2)
    % r—残差 r=fun(x,xdata)-ydata
    % J—雅可比矩阵
    [Ypred,delta]=nlpredci(@myfun, X, beta, r, 'Jacobian', J)
    plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r');
    saveas(gcf,sprintf('非线性曲线拟合_2.jpg'),'bmp');
end
end
 
 
function yy=myfun(beta,x) %自定义拟合函数
yy=beta(1)+beta(2)*x(:, 1)+beta(3)*x(:, 2)+beta(4)*x(:, 3)+beta(5)*(x(:, 1).^2)+beta(6)*(x(:, 2).^2)+beta(7)*(x(:, 3).^2);
end

demo.m

1
2
3
4
5
6
clear
clc
X=[1 13 1.5; 1.4 19 3; 1.8 25 1; 2.2 10 2.5;2.6 16 0.5; 3 22 2; 3.4 28 3.5; 3.5 30 3.7];
Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];
choose=1;
fit_nonlinear_data(X, Y, choose)

2. 结果

(1)多元线性拟合(regress)

choose=1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
>> demo
 
beta =
 
   0.200908829282537
   0.044949392540298
  -0.003878606875016
   0.070813489681112
 
 
bint =
 
  -0.026479907290565   0.428297565855639
  -0.057656451966002   0.147555237046598
  -0.017251051845827   0.009493838095795
   0.000201918738160   0.141425060624065
 
 
r =
 
   0.028343433030705
  -0.066584917256987
   0.038333946339215
   0.037954851676187
  -0.082126284727611
   0.058945364984698
  -0.010982985302994
  -0.003883408743214
 
 
rint =
 
  -0.151352966773048   0.208039832834458
  -0.188622801533810   0.055452967019837
  -0.090283529625345   0.166951422303776
  -0.090266067743345   0.166175771095720
  -0.108068661106325  -0.056183908348897
  -0.130409602930181   0.248300332899576
  -0.206254481234707   0.184288510628719
  -0.184329400080620   0.176562582594191
 
 
states =
 
   0.768591079367914   4.428472778943478   0.092289917768436   0.004625488283939

(2)多元非线性拟合(nlinfit)

choose=2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
>> demo
 
beta =
 
   0.312525876099987
   0.015300533415459
  -0.036942272680920
   0.299760796634952
   0.009412595106141
   0.000976411370591
  -0.062931846673372
 
 
r =
 
   1.0e-03 *
 
  -0.047521336834000
   0.127597019984715
  -0.092883949615763
  -0.040370056416994
   0.031209476614974
   0.211856736183458
  -0.727835090583939
   0.537947200592082
 
 
J =
 
   1.0e+02 *
 
   0.010000000000266   0.010000000001236   0.129999999998477   0.014999999999641   0.010000000007909   1.689999999969476   0.022499999999756
   0.010000000000266   0.014000000006524   0.189999999999301   0.029999999999283   0.019600000006932   3.609999999769248   0.089999999999024
   0.010000000000266   0.018000000011811   0.249999999990199   0.009999999999965   0.032399999999135   6.250000000033778   0.010000000000377
   0.009999999999679   0.022000000005116   0.099999999998065   0.025000000000218   0.048400000003999   1.000000000103046   0.062500000001264
   0.009999999999972   0.025999999998421   0.159999999998889   0.004999999999982   0.067599999997174   2.559999999999039   0.002499999999730
   0.009999999999679   0.029999999991726   0.219999999999713   0.019999999999930   0.089999999993269   4.839999999890361   0.040000000000052
   0.009999999999092   0.033999999985031   0.279999999990611   0.034999999998348   0.115599999997155   7.839999999636182   0.122500000000614
   0.010000000000266   0.034999999992344   0.299999999994194   0.037000000000420   0.122499999994626   8.999999999988553   0.136899999999292
 
 
Ypred =
 
   0.330047521336834
   0.335872402980015
   0.294092883949616
   0.476040370056417
   0.208968790523385
   0.450788143263817
   0.482727835090584
   0.499462052799408
 
 
delta =
 
   0.011997285626178
   0.011902559677366
   0.011954353934643
   0.012001513980794
   0.012005923574387
   0.011706970437467
   0.007666390995581
   0.009878186927507

(3)多元非线性拟合(lsqcurvefit)

choose=3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
>> demo
 
beta =
 
   0.312525876070457
   0.015300533464733
  -0.036942272680581
   0.299760796608728
   0.009412595094407
   0.000976411370579
  -0.062931846666179
 
 
resnorm =
 
     8.937848643213721e-07
 
 
r =
 
   1.0e-03 *
 
   0.047521324135769
  -0.127597015215197
   0.092883952947764
   0.040370060121864
  -0.031209466218374
  -0.211856745335304
   0.727835089662676
  -0.537947200236699
 
 
J =
 
   1.0e+02 *
 
   (1,1)      0.010000000000000
   (2,1)      0.010000000000000
   (3,1)      0.010000000000000
   (4,1)      0.010000000000000
   (5,1)      0.010000000000000
   (6,1)      0.010000000000000
   (7,1)      0.010000000000000
   (8,1)      0.010000000000000
   (1,2)      0.010000000000000
   (2,2)      0.014000000059605
   (3,2)      0.017999999970198
   (4,2)      0.022000000029802
   (5,2)      0.026000000014901
   (6,2)      0.030000000000000
   (7,2)      0.034000000059605
   (8,2)      0.035000000000000
   (1,3)      0.130000000000000
   (2,3)      0.190000000000000
   (3,3)      0.250000000000000
   (4,3)      0.100000000000000
   (5,3)      0.160000000000000
   (6,3)      0.220000000000000
   (7,3)      0.280000000000000
   (8,3)      0.300000000000000
   (1,4)      0.015000000000000
   (2,4)      0.030000000000000
   (3,4)      0.010000000000000
   (4,4)      0.025000000000000
   (5,4)      0.005000000000000
   (6,4)      0.020000000000000
   (7,4)      0.035000000000000
   (8,4)      0.036999999880791
   (1,5)      0.010000000000000
   (2,5)      0.019599999934435
   (3,5)      0.032399999983609
   (4,5)      0.048400000035763
   (5,5)      0.067599999997765
   (6,5)      0.090000000000000
   (7,5)      0.115600000023842
   (8,5)      0.122500000000000
   (1,6)      1.690000000000000
   (2,6)      3.610000000000000
   (3,6)      6.250000000000000
   (4,6)      1.000000000000000
   (5,6)      2.560000000000000
   (6,6)      4.840000000000000
   (7,6)      7.840000000000000
   (8,6)      9.000000000000000
   (1,7)      0.022500000000000
   (2,7)      0.090000000000000
   (3,7)      0.010000000000000
   (4,7)      0.062500000000000
   (5,7)      0.002500000000000
   (6,7)      0.040000000000000
   (7,7)      0.122500000000000
   (8,7)      0.136899999976158
 
 
Ypred =
 
   0.330047521324136
   0.335872402984785
   0.294092883952948
   0.476040370060122
   0.208968790533782
   0.450788143254665
   0.482727835089663
   0.499462052799763
 
 
delta =
 
   0.011997285618724
   0.011902559623756
   0.011954353977139
   0.012001513949620
   0.012005923574975
   0.011706970418735
   0.007666391016173
   0.009878186931566

 

注意

1)多元非线性函数拟合中参数的初始值需要提前设置,有些情况下,参数的初始选取对函数拟合结果影响极大,需要谨慎处理。

2)第二三种方法中,由于数据是多维的,因此只展示了第一个维度的拟合函数图。如有需要,可自行修改。

3)自定义拟合函数要看清楚数据X的维度,我这里是三维的,因此有x(:, 3),如果是D维,要写到x(:, D)。同时,参数beta的尺寸也要相应更新。

4)数据归一化方法自行选择,可能有些数据集不适合最大-最小归一化。

5)很多时候拟合函数很难构造,线性拟合效果又不理想,在这种情况下,可以尝试使用神经网络,深度学习,支持向量机等工具进行拟合非线性函数。这里是BP神经网络来进行拟合(回归)的一个例子


相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问