多项式和Bezier曲线拟合

2024-04-24 00:12

本文主要是介绍多项式和Bezier曲线拟合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


目录

  • 1. 多项式拟合
  • 2. Bezier曲线拟合
  • 3. 源码地址


1. 多项式拟合

在曲线拟合中,多项式拟合方法的性能受到三个主要因素的影响:采样点个数、多项式阶数和正则项。

  • 采样点个数 N N N:从Figure 1中可以看出较少的采样点个数可能导致过拟合(overfitting)问题,即拟合曲线过于贴合训练数据,但在新数据上的泛化能力较差。而较多的采样点个数可以提供更多的信息,有助于拟合更精确的曲线,但也会增加计算的复杂性,所以当采样点增加到100时所有方法的拟合效果都很好。
  • 多项式阶数 M M M:随着多项式的阶数增加,模型的复杂度也随之增加。高阶多项式可以更好地拟合复杂的曲线,但也容易发生过拟合,比如9阶比3阶在采样点较少时表现非常差。如果选择了过低的多项式阶数,模型可能无法捕捉到数据中的复杂模式,但由于该曲线比较简单,所以在图中无法体现这一点。
  • 正则项 λ \lambda λ:正则项用于控制模型的复杂度,避免过拟合。它通过在损失函数中引入一个惩罚项,限制模型参数的大小。更大的正则化参数(如L1或L2正则化中的λ值)会使得模型更加趋向于简单的拟合曲线。如果正则化参数过大,可能导致欠拟合(underfitting)问题,模型无法很好地拟合数据。我们这里选择 l n λ = − 3 ln\lambda=-3 l=3在9阶多项式拟合中表现比较合适,采样点较少时大大降低模型复杂度,拟合结果更贴合真实曲线。
# 使用多项式拟合
def polynomial_fit(x, y, degree, alpha=None):coeffs = np.polyfit(x, y, degree, rcond=alpha)return coeffs# 返回拟合曲线的计算结果
def polynomial_curve(x, coeffs):return np.polyval(coeffs, x)

请添加图片描述

Fig. 1. 曲线拟合结果. a, 3阶多项式分别在10,15,100个采样点上的拟合结果. b, 9阶多项式分别在10,15,100个采样点上的拟合结果. c, 9阶多项式(添加正则项, ln λ=-3)分别在10,15,100个采样点上的拟合结果. d, Bezier曲线分别在10,20,100个采样点上的拟合结果.

2. Bezier曲线拟合

Bezier曲线是计算机图形学中广泛使用的一种参数曲线,它由一组控制点定义,并可以创建平滑的曲线路径。这种曲线在图形设计、动画和其他领域有着广泛的应用。在数据分析和信号处理领域,Bezier曲线也可以用来对散点数据进行平滑拟合。

我们这里将采样点作为Bezier曲线的控制点进行拟合,采样点较少时不如3阶多项式,而采样点达到20个及以上时效果有了明显提升。

在实践中,确定合适的贝塞尔曲线控制点是一个迭代的过程,需要根据实际情况不断调整和改进。经验和直觉在初始阶段可能起到重要的作用,但通过实际观察和评估,结合优化算法和交叉验证,可以逐步优化控制点的位置,以获得更好的拟合效果和形状调整。

下面源码是简单的Bezier曲线拟合实现:

# 使用贝塞尔(Bernstein basis)曲线进行拟合
class BezierCurve:def __init__(self, control_points, ):self.control_points = control_pointsself.n = len(control_points) - 1def bernstein_basis(self, i, n, t):"""Calculate the i-th Bernstein basis polynomial of degree n at t."""return np.math.comb(n, i) * (t ** i) * ((1 - t) ** (n - i))def evaluate(self, t):"""Evaluate the Bezier curve at the given parameter t."""point = np.zeros_like(self.control_points[0])for i in range(self.n + 1):point += self.control_points[i] * self.bernstein_basis(i, self.n, t)return pointdef fit(self, samples):"""Fit the Bezier curve to the given samples using the least squares method."""t = np.linspace(0, 1, self.n + 1)A = np.zeros((len(samples), self.n + 1))for i, sample in enumerate(samples):for j in range(self.n + 1):A[i, j] = self.bernstein_basis(j, self.n, t[i])b = samplesx, _, _, _ = np.linalg.lstsq(A, b, rcond=None)self.control_points = x

3. 源码地址

如果对您有用的话可以点点star哦~

https://github.com/Jurio0304/cs-math/blob/main/hw1_bezier_fitting.py


创作不易,麻烦点点赞和关注咯!

这篇关于多项式和Bezier曲线拟合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930261

相关文章

算法笔记02--归纳法之多项式求值(Horner规则)

多项式求值 假设有n+2个实数a0,a1,...,an和x的序列,求多项式 p_nx = a_nx^n + a_n-1x^n-1 + ...+ a_1x + a_0; 则需要乘法:n+n-1 + ...+2+1 = n(n+1)/2 需要加法:n 可见算法效率为O(n^2) 而p_nx = ((...((((a_n)x + a_n-1)x + a_n-2)x + a_n-3)....)

链表(篇5)用链表实现多项式相加

使用链接实现两个多项式相加 例: 输入:第一数= 5x ^ 2 + 4x ^ 1 + 2x ^ 0第二数= 5x ^ 1 + 5x ^ 0输出:5x ^ 2 + 9x ^ 1 + 7x ^ 0输入:第一数= 5x ^ 3 + 4x ^ 2 + 2x ^ 0第二数= 5x ^ 1 + 5x ^ 0输出:5x ^ 3 + 4x ^ 2 + 5x ^ 1 + 7x ^ 0 代码

【机器学习】基扩展的基本概念以及其中的多项式回归、样条方法和广义可加模型的简单介绍(含python代码实例)

引言 基扩展是提升模型性能的重要工具,正确选择和应用基扩展方法可以显著提高模型的预测能力和解释性 文章目录 引言一、基扩展1.1 基扩展定义1.2 基扩展方法1.2.1 多项式基扩展1.2.2 样条基扩展1.2.3 径向基函数(RBF)1.2.4 傅里叶基扩展1.2.5 wavelet基扩展1.2.6 单隐藏层神经网络 1.3 应用场景1.4 使用基扩展的注意点 二、多项式回归2.

约瑟夫环和一元多项式

约瑟夫环 一、问题描述     假设有 n 个人围成一圈,从第一个人开始报数,报数到 m 的人将被淘汰出圈,然后从下一个人开始继续从 1 报数,如此重复,直到最后只剩下一个人。求最后剩下的这个人的编号。 二、问题分析 可以使用循环链表来模拟这个过程。 1.创建一个包含 n 个节点的循环链表,每个节点代表一个人,节点中存储这个人的编号。 2.从第一个节点开始报数,每报到 m,就将对应

《高等代数》多项式互素典型例题

说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:判断两个多项式是否互素主要用的方法是反证法。

采用不高于3次的勒让德多项式拟合原函数

利用勒让德多项式进行拟合的区域是[-1,1],如果不是这个区域,比如是[a,b],利用转化到[-1,1]。 参考以下例题计算系数 C语言代码如下 //用三阶的勒让德多项式进行拟合#include<math.h>#include<stdio.h>#include "main.c"double f(double x);double fl1(double x);double f

回归分析系列19— 多项式回归进阶

24 多项式回归进阶 24.1 简介 多项式回归是一种扩展线性回归的方法,用来建模非线性关系。通过将输入变量升至多项式次幂,可以捕捉数据中的非线性特征。虽然模型复杂度增加,但也带来了更高的拟合能力。然而,过高次幂的多项式可能会导致过拟合问题。 24.2 多项式特征的构建 在多项式回归中,我们首先需要生成多项式特征,即将原始特征升至不同次幂并组合。Python中的scikit-learn库提

03-1. 二分法求多项式单根(20) MOOC

二分法求函数根的原理为:如果连续函数f(x)在区间[a, b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。 二分法的步骤为: 检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则如果f(a)f(b)<0,则计算中点的值f((a+b)/2);如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则如果f((a+b)

基于Python的机器学习系列(10):朴素贝叶斯 - 多项式模型

在之前的文章中,我们已经探讨了朴素贝叶斯分类器在不同情况下的应用。本文将继续深入探讨,重点介绍朴素贝叶斯分类器中的多项式模型。 1. 背景介绍         朴素贝叶斯分类器是一种基于贝叶斯定理的简单却强大的分类算法。在之前的文章中,我们介绍了高斯朴素贝叶斯模型,它假设特征服从高斯分布。然而,对于一些特定类型的数据,例如词频或计数数据,高斯分布并不是最合适的选择。这时,我们可

机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)

文章目录 前言一、普通实现1 数据集准备2 逻辑回归模型3 损失函数4 计算损失函数的梯度5 梯度下降算法6 训练模型 二、多项式特征实现非线性分类1 数据准备与多项式特征构造2 逻辑回归模型 三、逻辑回归 --- 正则化实现1 数据准备2 逻辑回归模型3 正则化损失函数4 计算损失函数的梯度5 梯度下降6 训练模型 总结 前言 今天我们开始介绍逻辑回归的从零开始实现代码了,