高考考试网
当前位置: 首页 高考资讯

最小二乘算法与二次拟合区别(最小二乘法ordinaryleast)

时间:2023-08-23 作者: 小编 阅读量: 4 栏目名: 高考资讯

最小二乘法理论最小二乘法是一种数学优化技术。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。是解决曲线拟合最常用的方法,其思路如下:其中,是预选定的一组线性相关的函数,是待定系数,拟合准则是使与的距离的平方和最小,称为最小二乘法准则。三维空间中,定义4x4的网格,首先定义z值,而网格点上的z值不一样,我们所要做的就是根据这个z值去拟#合这个面上所有点的值。

  • 最小二乘法理论

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。是解决曲线拟合最常用的方法,其思路如下:

其中,是预选定的一组线性相关的函数,是待定系数,拟合准则是使与的距离的平方和最小,称为最小二乘法准则。

最小二乘准则进行最小二乘平差计算的一个基本原则

  • 代码示例

import pandas as pdimport numpy as npfrom sklearn.linear_model import LinearRegressionimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D#----------------------------------------------------------------------------------------------------------------------# Step1:创建需要被拟合的目标。三维空间中,定义4x4的网格,首先定义z值,而网格点上的z值不一样,我们所要做的就是根据这个z值去拟#合这个面上所有点的值。#----------------------------------------------------------------------------------------------------------------------np.random.seed(0)dim = 4Z = (np.ones((dim, dim)) * np.arange(1, dim 1, 1))**3np.random.rand(dim, dim) * 200x = np.arange(1, dim 1).reshape(-1, 1)y = np.arange(1, dim 1).reshape(1, -1)X, Y = np.meshgrid(x, y)#----------------------------------------------------------------------------------------------------------------------# Step2:自定义一组线性相关的函数, 3阶。#----------------------------------------------------------------------------------------------------------------------features = {}features['x^0*y^0'] = np.matmul(x**0, y**0).flatten()features['x*y'] = np.matmul(x, y).flatten()features['x*y^2'] = np.matmul(x, y**2).flatten()features['x^2*y^0'] = np.matmul(x**2, y**0).flatten()features['x^2*y'] = np.matmul(x**2, y).flatten()features['x^3*y^2'] = np.matmul(x**3, y**2).flatten()features['x^3*y'] = np.matmul(x**3, y).flatten()features['x^0*y^3'] = np.matmul(x**0, y**3).flatten()dataset = pd.DataFrame(features)#----------------------------------------------------------------------------------------------------------------------# Step3:将选定函数与目标值带入SkLearn包中的线性回归拟合模块,它可以使平方和最小,结果返回截距和斜率。#----------------------------------------------------------------------------------------------------------------------reg = LinearRegression().fit(dataset.values, Z.flatten())# reg.intercept_为截距, reg.coef_为斜率z_pred = reg.intercept_np.matmul(dataset.values, reg.coef_.reshape(-1, 1)).reshape(dim, dim)#----------------------------------------------------------------------------------------------------------------------# Step4:可视化。#----------------------------------------------------------------------------------------------------------------------fig = plt.figure(figsize=(5, 5))ax = Axes3D(fig)ax.plot_surface(X, Y, z_pred, label='prediction', cmap=plt.get_cmap('rainbow'))ax.scatter(X, Y, Z, c='r', label='datapoints')plt.show()

结果如下:

图1

上例定义的多项式阶数为3,对于大多数问题已经足够了,如果想定义更高阶数,则可参考如下代码:

import itertoolsimport numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D#-----------------------------------------------------------------------------------------------------------------------# Step1: 创建线性相关的函数,阶数自己定义,结果为拟合系数;#-----------------------------------------------------------------------------------------------------------------------def polyfit2d(x, y, z, order):ncols = (order1)**2G = np.zeros((x.size, ncols))ij = itertools.product(range(order 1), range(order 1))for k, (i, j) in enumerate(ij):G[:, k] = x**i * y**jm, _, _, _ = np.linalg.lstsq(G, z, rcond=-1) # lstsq的输出包括四部分:回归系数、残差平方和、自变量X的秩、X的奇异值return m#-----------------------------------------------------------------------------------------------------------------------# Step2: 创建拟合函数,将欲拟合值和拟合系数待入,返回预测值;#-----------------------------------------------------------------------------------------------------------------------def polyval2d(x, y, m):order = int(np.sqrt(len(m))) - 1 # 根据多项式的列数反算阶数ij = itertools.product(range(order 1), range(order 1))z = np.zeros_like(x)for a, (i, j) in zip(m, ij):z= a * x**i * y**jreturn z#-----------------------------------------------------------------------------------------------------------------------# Step3: 示例;#-----------------------------------------------------------------------------------------------------------------------x = np.array([4, 5, 5, 4])y = np.array([2, 3, 4, 5])z = np.array([2, 3, 4, 7])N_ORDER = 4m = polyfit2d(x, y, z, N_ORDER)N_MESH = 10xx, yy = np.meshgrid( np.linspace(x.min(), x.max(), N_MESH),np.linspace(y.min(), y.max(), N_MESH))zz = polyval2d(xx, yy, m)#-----------------------------------------------------------------------------------------------------------------------# Step4: 可视化;#-----------------------------------------------------------------------------------------------------------------------fig = plt.figure(figsize=(5, 5))ax = Axes3D(fig)ax.plot_surface(xx, yy, zz, label='prediction', cmap=plt.get_cmap('rainbow'))ax.scatter(x, y, z, c='r', label='datapoints')plt.show()

结果如下:

最小二乘法很基本也很常用,其本质是插值,但是我发现在当数值非常大时它的效果却不是很好,这时候就需要用到一些其他的方法,比如克里金法等。

声明:仅供参考

    推荐阅读
  • 海胆蒸蛋怎么做好吃(海胆蒸蛋如何做好吃)

    以下内容大家不妨参考一二希望能帮到您!海胆蒸蛋怎么做好吃原料:野生海胆1个鸡蛋一个清水30G左右生抽适量葱花适量。用剪刀把海胆嘴巴那里剪开,根据造型大小剪一个圆圈。用一把小刀或者小勺把海胆里面的黄膏与内脏挖出来。内脏是黑红色的,膏是黄的,用清水略微冲洗下黄膏,把海胆壳清洗干净,沥干水。鸡蛋打散加水搅打均匀。加入黄膏后继续蒸18分钟,中途需要几次用筷子搅动下蛋液。出锅后撒上葱花,开吃的时候淋上适量的生抽。

  • 酿苦瓜的家常做法(怎样制作家常酿苦瓜)

    酿苦瓜的家常做法苦瓜1条、猪肉200克,水发虾米10克、水发香菇1朵,红辣椒末、姜米、葱末各适量,盐少量,酱油1/3汤匙,蚝油1茶匙,胡椒粉少量、蛋清少量、淀粉适量。将猪肉剁碎,加上腌料拌匀,用手打至上劲。苦瓜洗净,切成3厘米左右的环形的苦瓜段,用汤匙挖空白瓤。在苦瓜段内抹上一层生粉。把肉馅酿入苦瓜段中。开水上蒸锅,放入酿好的苦瓜段,隔水蒸20分钟至熟。蒸苦瓜的原汁倒入油锅中,加入调料,用淀粉水勾芡。

  • 全境封锁第一期解说(全境封锁剧情背景故事详解)

    在短短几天内,失去生活必需品的整个社会陷入了混乱。TheDivision,一个由战术特工组成的团体被唤醒了。这些特工以普通人的身份藏身于人群中,他们受过专门训练,以在危机中拯救社会。为了他们的责任,为了留下来,他们付出了生命的代价。第二批特工出动三周后……幸存者军队原本是一支被华尔街大亨雇佣的私人武装,汇集了战争老兵和来自海外的退伍军人。他们的任务是在病毒危机每况愈下时保护雇主在华尔街的商业财产,房产、服务器、等等。

  • micro和typec区别 micro和typec区别适合什么手机

    micro和typec区别是:目前安卓的手机充电端口一般分为两种,一种是充电头两端都一样扁平的typec接口,另外一种就是一边宽一边窄的microusb接口,两种插口都能起到为手机传输信息或者充电的功效。全新出的一些高端旗舰机一般都是使用的typec接头,因为typec接头支持快充,并且充电的时候两头都可以插,插头比较扁平而没有正反,不会出现插口插反了的问题。typec插头充电速度比usb的快,并且插头更加薄而没有正反之分。

  • 高铁站可以寄快递吗(高铁站能不能寄快递)

    为减少旅客出行烦恼提升出行质量,铁路升级便民服务体系,推出新产品“高铁顺手寄,帮助旅客在高铁站内将不便随身携带的物品直接快递到家。以前旅客被查出携带不符合规定的物品只能选择丢弃或者寄存,而现在通过“高铁顺手寄,可以直接在高铁车站办理快递业务。

  • 宝丽金冷门珍藏版(怀旧宝丽金永恒的经典)

    紧接着推出的《Sha—La—La-La》成功巩固温拿好玩的乐天派形象。1988年初,谭咏麟宣布退出一切乐坛颁奖礼。宝丽金在第二年乘胜追击,为张学友推出《遥远的她·Amour》,唱片一经面世即引起抢购热潮,占据销量排行榜长达七周之久。宝丽金的男歌手中还有被称为小谭咏麟的李克勤。1985年,李克勤凭借谭咏麟的《雾之恋》夺得第二届香港十九区业余歌唱大赛冠军,签约成为宝丽金旗下歌手。

  • 你迟到的许多年演员表(你迟到的许多年演员表介绍)

    以下内容希望对你有帮助!你迟到的许多年演员表《你迟到的许多年》是由林柯执导,黄晓明、殷桃、秦海璐、曹炳琨主演的都市情感剧。该剧改编自严歌苓的小说《补玉山居》,讲述了改革开放浪潮下转业军人沐建峰在商海中沉浮、在情场中辗转,在成长的路上寻找迷失的自我、回归初心的故事。该剧于2018年9月28日在湖南卫视播出,并在爱奇艺、腾讯视频、芒果TV同步播出。

  • 正宗做馒头配方(酒店师傅教你正宗劲道馒头)

    正宗做馒头配方原料:面粉、新老面、食用碱、清油、温开水。一般可参照:500g面粉内加入50——150g的新老面或老面)。和面成团,覆盖保鲜膜,静置4小时左右。面团发酵至两倍大,即可。面团摊开,加入适量食用碱。双手用拳头,将面团向四周搋开。再折叠,再搋,反复几次,直到碱面均匀分布在面团中。剂子整形后放入蒸笼,盖上盖子,再次醒发20分钟。凉水上锅,水开后转小火,蒸约20分钟。熄火后,等约3一5分钟后再揭盖子,即可。

  • 电子表格中三线表的制作方法(电子表格中三线表的制作方法介绍)

    接下来我们就一起去研究一下吧!电子表格中三线表的制作方法首先我们打开一个空白的Excel表格。用鼠标选中标题行全部内容,右键点击,选择“设置单元格格式”。然后,我们选择除标题行以外的其他所有行,右键调出“设置单元格格式”,然后进行类似设置,只选择上框线和下框线,选线型后点击确定。这样,三线表就制作完成了。

  • 晏婴为什么阻止孔子(晏婴为何要阻止齐景公任用孔子)

    晏婴为什么阻止孔子婴当时是齐国的国相,辅佐齐景公。当时孔子还年轻,大概三十五六岁的样子,来齐国访问,和齐景公谈的很投机,谈到关于治国之道,孔子给了八个字“君君臣臣,父父子子”齐景公大喜,觉得很有道理。齐景公默认了晏婴的看法,就没有再提赏赐孔子的事情了,后来孔子也离开了齐国了。