最小二乘法多元函数超曲面拟合问题

网上很多用最小二乘法拟合曲面的问题,但是最后给的例子都是拟合高维平面,本篇文章简单介绍用最小二乘法进行曲面拟合的方法,以二元函数的曲面逼近为例,用python实现,代码在文章最后。

一、最小二乘法

首先还是对最小二乘法的原理进行简单介绍:
考虑模型:

的辨识问题,式中z(k)和h(k)都是可观测数据,θ是待估参数,取准则函数:

极小化J(θ),求得θ的估计值,将使模型的输出最好的预报系统的输出。
将上式对θ求导,然后使导数等于零的时候取得的θ值即为参数矩阵的最优解,本篇文章中从头至尾忽略噪声项e(k)。推导过程我就不写了这个到处都是,直接写结果,参数矩阵θ的最优解为:

这里面要注意括号里必须是正则矩阵(即矩阵为非奇异,行列式的值不为0)

二、在拟合曲面时输入矩阵的选取

因为这篇文章是在二元函数的曲面方程拟合的情况下,多元的道理一样,自己去写参数多项式的项就可以了。
所以先假定两个输入值是x和y,z是函数的输出,如果z=ax + by, 就是一个最普通的平面,但是当扩展到一个二次曲面的时候,曲面的一般式就变成了z = ax^2 + by^2+cxy +dx +ey+f ,更高次的也是一样。本质上就是把原本只能用来解决线性问题的最小二乘法用来解决非线性问题,方法就是用多项式组合形式来替换输入值,让输出结果变成是各多项式线性组合的结果。

如图所示,在二元函数的情况下就不停地升高曲面的次数去逼近曲面,在每个次数下都要遍历各种可能的线性组合的多项式,上图中红色框里表示的是在升高次数之后已经含有的较低次数里的项,在编写生成多项式算法的时候就可以利用这个特性来简化算法的描述,这里显然就是利用递归来描述的。而最小二乘法拟合曲面时就是去得到各个多项式前面的参数,然后线性叠加各个项,那如果少掉某项的话当然也是可以的,只是会影响精度。最小二乘法的精髓就在于它会自己利用输入项里面的各种线性叠加来得到你想要的准确的估计值。下面就来写最关键的生成输入多项式的函数:

def Hl_matrix_generate(input_x,input_y,n):if n==0 :#判断初始情况,也就是在输入矩阵的最后填上一个常数项Hl_array = np.ones([144,1])#这里行数表示的是观测数据的总数,根据自己的情况改return Hl_arrayelif n > 0 :#判断n的值Hl_array = np.zeros([144, 1])#初始化矩阵数据for i in range(n+1):Hl_array = np.c_[Hl_array,(input_x**(n-i))*(input_y**i)]#生成在该阶次下更新的多项式的值,更新矩阵Hl_array = np.delete(Hl_array,0,axis= 1)#删掉第一列初始化的Hl_array = np.c_[Hl_array,Hl_matrix_generate(input_x,input_y,n-1)]#在该阶次下更新的多项式加上n-1次包含的多项式的值,完成递归return Hl_array

生成输入数据的函数和生成多项式的函数基本上是相同的,只不过输入只有一行,多项式函数里包含所有观测数据。输入函数如下:

def input_Func(input_x,input_y,n):if n==0 :Hl_array = np.ones([1,1])return Hl_arrayelif n > 0 :Hl_array = np.zeros([1, 1])for i in range(n+1):Hl_array = np.c_[Hl_array,(input_x**(n-i))*(input_y**i)]Hl_array = np.delete(Hl_array,0,axis= 1)Hl_array = np.c_[Hl_array,input_Func(input_x,input_y,n-1)]result = Hl_arrayreturn result

这个就不多解释了

然后就是生成估计参数矩阵,也就是刚刚的第三个公式:

#生成估计参数矩阵
def predicParamater_array_generate(input_paramater_array,output_paramater_array):predicPara_arr = (np.linalg.inv(np.mat(input_paramater_array).T * np.mat(input_paramater_array)))*np.mat(input_paramater_array).T*np.mat(output_paramater_array).Treturn predicPara_arr

最后输入乘上参数估计矩阵就得到了在该参数估计下的预测值,也是使得准则函数取值最小的估计值,更高次更多元的最小二乘法拟合大抵如此,在设计系统变化时也可以加进时间维度,可以根据这个方法举一反三,总之广义的最小二乘法是无敌的。

最后附上全部代码:

import numpy as np
np.set_printoptions(suppress=True)
np.set_printoptions(threshold=np.inf)#加载数据集函数
def loadDataSet():dataMat = []; labelMat = []fr = open('database_2D.txt')for line in fr.readlines():lineArr = line.strip().split()dataMat.append([float(lineArr[0]),float(lineArr[1])])labelMat.append([float(lineArr[2]),float(lineArr[3]),float(lineArr[4]),float(lineArr[5]),float(lineArr[6]),float(lineArr[7]),float(lineArr[8]),float(lineArr[9]),float(lineArr[10]),float(lineArr[11]),float(lineArr[12]),float(lineArr[13])])return dataMat,labelMat#生成输入矩阵函数
def Hl_matrix_generate(input_x,input_y,n):if n==0 :Hl_array = np.ones([144,1])return Hl_arrayelif n > 0 :Hl_array = np.zeros([144, 1])for i in range(n+1):Hl_array = np.c_[Hl_array,(input_x**(n-i))*(input_y**i)]Hl_array = np.delete(Hl_array,0,axis= 1)Hl_array = np.c_[Hl_array,Hl_matrix_generate(input_x,input_y,n-1)]return Hl_array#生成估计参数矩阵
def predicParamater_array_generate(input_paramater_array,output_paramater_array):predicPara_arr = (np.linalg.inv(np.mat(input_paramater_array).T * np.mat(input_paramater_array)))*np.mat(input_paramater_array).T*np.mat(output_paramater_array).Treturn predicPara_arr#生成数据预测函数
def input_Func(input_x,input_y,n):if n==0 :Hl_array = np.ones([1,1])return Hl_arrayelif n > 0 :Hl_array = np.zeros([1, 1])for i in range(n+1):Hl_array = np.c_[Hl_array,(input_x**(n-i))*(input_y**i)]Hl_array = np.delete(Hl_array,0,axis= 1)Hl_array = np.c_[Hl_array,input_Func(input_x,input_y,n-1)]result = Hl_arrayreturn result'''
********************************************
***             main code                ***
********************************************
'''
#参数设置  input_X  和 input_Y  是 两个输入角度 n 是最小二乘法阶数
input_x = 45
input_y = 135
n = 8 #阶#加载数据集
input_data , output_data = loadDataSet()#转换矩阵格式
input_data = np.array(input_data)
output_data = np.array(output_data)#生成输入数据矩阵
Hl_array = Hl_matrix_generate(input_data[:,0],input_data[:,1],n)
input_data = input_Func(input_x,input_y,n)
#print(Hl_array)for i in range(12):#生成参数矩阵predicParamater_arr = predicParamater_array_generate(Hl_array,output_data[:,i])#数据预测result = input_data*predicParamater_arrprint(result)

最小二乘法多元函数超曲面拟合(python)相关推荐

  1. 最小二乘法拟合python实现

    最小二乘法拟合python实现 最小二乘法通过最小化误差的平方和找到一组数据的最佳函数匹配.下面列出其python实现. import numpy as np import random import ...

  2. 最小二乘多项式拟合程序matlab,最小二乘法的多项式拟合(matlab实现)

    1.用最小二乘法进行多项式拟合(matlab实现)西安交通大学 徐彬华算法分析:对给定数据 (i=0 ,1,2,3,.,m),一共m+1个数据点,取多项式P(x),使函数P(x)称为拟合函数或最小二乘 ...

  3. matlab最小二乘法_基于最小二乘法的线性回归拟合

    阅读本文需要的知识储备: 高等数学 概率论与数理统计 Python基础 线性回归,其实生活中有很多这样的例子,比如:票价与行车距离.服务质量之间的关系,买房时房价与面积.地域等的关系.给我们一组这样的 ...

  4. matlab最小二乘法拟合二次多项式,最小二乘法的多项式拟合(matlab实现)

    用最小二乘法进行多项式拟合(matlab 实现) 西安交通大学 徐彬华 算法分析: 对给定数据|(斗』i=0 ,1,2,3,..,m), -共m+1个数据点,取多项式P(x), 使 战 m 刃:ITb ...

  5. 最小二乘法多项式曲线拟合及其python实现

    最小二乘法多项式曲线拟合及其python实现 多项式曲线拟合问题描述 最小二乘法 针对overfitting,加入正则项 python实现 运行结果 多项式曲线拟合问题描述 问题描述:给定一些数据点, ...

  6. PCL最小二乘法进行平面拟合原理

    最小二乘法进行平面拟合原理 1 最小二乘原理 2 最小二乘拟合平面 1 最小二乘原理 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可以 ...

  7. 『矩阵论笔记』详解最小二乘法(矩阵形式求导)+Python实战

    详解最小二乘法(矩阵形式求导)+Python实战! 文章目录 一. 矩阵的迹 1.1. 转置矩阵 1.2. 迹的定义 1.3. 七大定理 二. 最小二乘法 2.1. 求解介绍 2.2. 另一角度 2. ...

  8. 最小二乘法实现椭圆拟合

    本文仅使用Eigen库,使用C++手推最小二乘法实现椭圆拟合 首先定义平面点的结构体: struct Point2d {double u;double v;Point2d() {u = -1;v = ...

  9. python多元函数求解_一元和多元函数求极值(Python)-牛顿法

    1. 引言 我们在中学的时候学过一元二次函数,求解时引入一个求根公式,代入公式就可以得到不同的根,假如想计算一个高次方程的解,我们还能推导出求根公式吗? 伽罗瓦在群论中证实,五次及以上多项式方程没有显 ...

最新文章

  1. 反转链表:输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。...
  2. UICollectionView下拉使header放大模糊
  3. 附9 elasticsearch-curator + Linux定时任务
  4. 把房子交给“我爱我家”后,我都不敢再进去了
  5. Image-to-Image Translation with Conditional Adversarial Networks
  6. ffmpeg源码简析(八)解码 av_read_frame(),avcodec_decode_video2(),avformat_close_input()
  7. 无人驾驶全局路径规划之A星算法
  8. PCI、PCIE、PIC
  9. 扁平和树形结构的几种互转
  10. AdGuard更多规则推荐
  11. 我的CentOS 7 U盘安装之路 (Win 8.1 Profession + CentOS 7双系统)
  12. 第一次实验报告:使用Packet Tracer分析HTTP数据包
  13. DOM windows对象 navigator对象 详细介绍
  14. 禁止宣传高考状元,学校秒变果园。。
  15. 关于光猫连接无线路由设置问题
  16. VGA成像原理与简单实现
  17. 获取三维线条的笔画 - Inventor 2013新功能
  18. 缓冲区溢出分析第06课:W32Dasm缓冲区溢出分析
  19. Band in a Box 2019+RealTracks+RealDrums 智能编曲软件免安装版含音色库
  20. python~计算公式的值

热门文章

  1. 计算机的iscsi配置,电脑Win10系统的iscsi target(共享存储)如何进行连接
  2. 所有系统如何创建宽带连接服务器,Win7系统怎么建立宽带连接?Win7宽带连接的设置方法...
  3. 计算机和网络连接不上,电脑宽带连不上怎么办_台式电脑连不上宽带怎么回事-win7之家...
  4. 使用天平只用3次求出12个球中的次品球并确认轻重
  5. 两个同品牌路由器有线连接
  6. 笔记本可以跑虚拟机吗_什么笔记本跑虚拟机不卡?
  7. Metasploit6.0系列教程 -- 渗透Joomla网站
  8. 获取Angular中的AngularJS功能
  9. [电路]5-电压源、电流源的串联和并联
  10. 分布式架构项目的衡量指标及其目标