首页 置换 选车 估价 问答 生活 经销商 车管所 汽车资讯 汽车销量 车牌查询 今日油价 天气预报
您的位置: 首页 > 生活 > 生活 > 最小二乘算法与二次拟合区别(最小二乘法ordinaryleast)
最小二乘算法与二次拟合区别(最小二乘法ordinaryleast)
更新时间:2024-08-09 02:46:25
  • 最小二乘法理论

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

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

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

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

  • 代码示例

import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D #---------------------------------------------------------------------------------------------------------------------- # Step1:创建需要被拟合的目标。三维空间中,定义4x4的网格,首先定义z值,而网格点上的z值不一样,我们所要做的就是根据这个z值去拟 # 合这个面上所有点的值。 #---------------------------------------------------------------------------------------------------------------------- np.random.seed(0) dim = 4 Z = (np.ones((dim, dim)) * np.arange(1, dim 1, 1))**3 np.random.rand(dim, dim) * 200 x = 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()

结果如下:

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

图1

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

import itertools import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D #----------------------------------------------------------------------------------------------------------------------- # Step1: 创建线性相关的函数,阶数自己定义,结果为拟合系数; #----------------------------------------------------------------------------------------------------------------------- def polyfit2d(x, y, z, order): ncols = (order 1)**2 G = 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**j m, _, _, _ = 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**j return 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 = 4 m = polyfit2d(x, y, z, N_ORDER) N_MESH = 10 xx, 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()

结果如下:

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

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

声明:仅供参考

,
相关推荐RECOMMEND
微信名字怎么取好听(怎样取微信名字)
微信名字怎么取好听?有文学素养的人,取:流年、易染、浅陌、沫忆失忆丶旧城少#等,下面我们就来说一说关于微信名字怎么取好听?我们一起去了解并探讨一下这个问题吧!微信名字怎么取好听有文学素养的人,取:流年...
兰花叶子偏黄的原因怎么处理呢(兰花叶子颜色淡)
兰花叶子“颜色淡、发黄”,学会这三招,绿得发油!兰花属十大名花之一,之所以有这么大的名气,自然是需要靠它本身的颜值来维持的。它拥有着极高的颜值,其品种繁多、颜色各异,深获花友们关心。但在最近小花却发现...
万科天空之城上海1期开盘价格(上海神盘即将加推)
相对于上海的许多新盘,天空之城大家并不陌生。项目距离虹桥交通枢纽地铁3站,距进博会主办场地仅2站,紧邻虹桥商务区是整个"大虹桥之心"徐泾板块的第一个复合"住宅、商业、办公、幼儿园"等多重业态的地铁上盖...
炖羊鞭的正确方法和做法(炖羊鞭的做法)
炖羊鞭的正确方法和做法?羊鞭2条,绞股蓝30克,淫羊藿10克,生地黄10克,白芍10克,黄芪10克,肉苁蓉5克,车前子5克,菟丝子5克,露蜂房5克,山茱萸5克,枸杞子10克,姜片3克,葱节10克,盐3...
我的世界乐高史蒂夫的矿场(乐高我的世界史蒂夫狩猎)
我的世界乐高史蒂夫的矿场?,今天小编就来说说关于我的世界乐高史蒂夫的矿场?下面更多详细答案一起来看看吧!我的世界乐高史蒂夫的矿场乐高我的世界史蒂夫狩猎世界,乐高,我的世界,史蒂夫,世界史,我的,乐高我...
共享充电宝能否直接购买(二手平台公然售卖共享充电宝)
来源|都市现场综合南方卫视出门在外,手机是一定随身带的,以往都得随身带个充电宝和充电线才敢放肆玩手机,如今遍地的共享充电宝,让你不用再担心电量问题。但是最近有网友爆料称,在二手交易平台有商家公然售卖共...