曲线拟合、多项式拟合、最小二乘法

最近在做自车轨迹预测的工作,遇到 曲线拟合、多项式拟合、最小二乘法这些概念有点不清晰,
做一些概念区别的总结:

曲线拟合用于查找一系列数据点的“最佳拟合”线或曲线。 大多数情况下,曲线拟合将产生一个函数,可用于在曲线的任何位置找到点。 在某些情况下,也可能不关心找到函数,而是只想使用曲线拟合来平滑数据并改善绘图的外观。

简而言之,曲线拟合就是在受到一定约束条件的情况下,构建可以表示一系列数据点的曲线或数学函数的过程。更加数学化一点的话,对于一个给定的数据集,曲线拟合是以方程形式引入因变量和自变量之间的数学关系的过程。

多项式拟合是假设函数模型是多项式,是曲线拟合中的夹着数据符合的函数模型, 还有其他曲线模型拟合,如线性回归,指数型函数,其他非线性曲线拟合;

曲线拟合结果可以有很多,也就是说解有很多,拟合结果的好坏如何评价,如果找到最优解, 最优解的评判标准是什么。那么“最佳”的准则是什么?可以是所有观测点到直线的距离和最小,也可以是所有观测点到直线的误差(真实值-理论值)绝对值和最小,也可以是其它。

请添加图片描述

早在19世纪,勒让德就认为让“误差的平方和最小”估计出来的模型是最接近真实情形的。这就是最小二乘法的思想,所谓“二乘”就是平方的意思。从这里我们可以看到,所以最小二乘法其实就是用来做函数拟合的一种思想或者准则。至于怎么求出具体的参数那就是另外一个问题了,理论上可以用导数法、几何法,工程上可以用梯度下降法。

因此最小二乘法(又称最小平方法)是一种数学优化思想。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

参考下方 C 代码改写实现接口 :
实现的 2阶、 3阶 最小二乘 多项式拟合函数 C 语言接口:

2阶多项式
void QuadraticSpline(Point_xy *points, uint32 n, float32 *coeffs)
{
    coeffs[3] = 0;

    // 计算矩阵A和向量b
    float32 sum_x = 0.0, sum_x2 = 0.0, sum_y = 0.0, sum_xy = 0.0, sum_x3 = 0.0, sum_x4 = 0.0, sum_x2y = 0.0;
    for (uint32 i = 0; i < n; i++)
    {
        float32 xi = points[i].x, yi = points[i].y;
        sum_x += xi;
        sum_x2 += xi * xi;
        sum_y += yi;
        sum_xy += xi * yi;
        sum_x3 += xi * xi * xi;
        sum_x4 += xi * xi * xi * xi;
        sum_x2y += xi * xi * yi;
    }

    // 构造矩阵A和向量b
    float32 A[3][3] = {{n, sum_x, sum_x2},
                       {sum_x, sum_x2, sum_x3},
                       {sum_x2, sum_x3, sum_x4}};
    float32 b[3] = {sum_y, sum_xy, sum_x2y};

    // 求解线性方程组Ax=b
    for (uint8 k = 0; k < 3 - 1; k++)
    {
        for (uint8 i = k + 1; i < 3; i++)
        {
            float32 p = A[i][k] / A[k][k];
            for (uint8 j = k + 1; j < 3; j++)
            {
                A[i][j] -= p * A[k][j];
            }
            b[i] -= p * b[k];
        }
    }

    coeffs[2] = b[2] / A[2][2];
    coeffs[1] = (b[1] - A[1][2] * coeffs[2]) / A[1][1];
    coeffs[0] = (b[0] - A[0][1] * coeffs[1] - A[0][2] * coeffs[2]) / A[0][0];
}
3阶多项式
void CubicSpline(Point_xy* points, uint32 n, float32* coeffs)
{
    coeffs[3] = 0;

    // 计算矩阵A和向量b
    float32 sum_x = 0.0, sum_x2 = 0.0, sum_x3 = 0.0, sum_x4 = 0.0, sum_x5 = 0.0, sum_x6 = 0.0, sum_y = 0.0, sum_xy = 0.0, sum_x2y = 0.0, sum_x3y = 0.0;
    for (uint32 i = 0; i < n; i++)
    {
        float32 xi = points[i].x, yi = points[i].y;
        sum_x  += xi;
        sum_x2 += xi * xi;
        sum_x3 += xi * xi * xi;
        sum_x4 += xi * xi * xi * xi;
        sum_x5 += xi * xi * xi * xi * xi;
        sum_x6 += xi * xi * xi * xi * xi * xi;
        sum_y  += yi;
        sum_xy += xi * yi;
        sum_x2y += xi * xi * yi;
        sum_x3y += xi * xi * xi * yi;
    }

    // 构造矩阵A和向量b
    float32 A[4][4] = { {n, sum_x, sum_x2, sum_x3},
                       {sum_x, sum_x2, sum_x3, sum_x4},
                       {sum_x2, sum_x3, sum_x4,sum_x5},
                       {sum_x3, sum_x4, sum_x5,sum_x6}};

    float32 b[4] = { sum_y, sum_xy, sum_x2y,sum_x3y};

    // 求解线性方程组Ax=b
    for (uint8 k = 0; k < 4 - 1; k++)
    {
        for (uint8 i = k + 1; i < 4; i++)
        {
            float32 p = A[i][k] / A[k][k];
            for (uint8 j = k + 1; j < 4; j++)
            {
                A[i][j] -= p * A[k][j];
            }
            b[i] -= p * b[k];
        }
    }

    coeffs[3] = b[3] / A[3][3];
    coeffs[2] = (b[2] - A[2][3] * coeffs[3]) / A[2][2];
    coeffs[1] = (b[1] - A[1][2] * coeffs[2] - A[1][3] * coeffs[3]) / A[1][1];
    coeffs[0] = (b[0] - A[0][1] * coeffs[1] - A[0][2] * coeffs[2] - A[0][3] * coeffs[3]) / A[0][0];
}

C ++ 实现:
代码出处

#include <stdio.h>
#include "stdlib.h"
#include "math.h"
#include <vector>
using namespace std;
 
struct point
{
	double x;
	double y;
};
 
typedef vector<double> doubleVector;
vector<point> getFile(char *File);  //获取文件数据
doubleVector getCoeff(vector<point> sample, int n);   //矩阵方程
 
void main()
{
	int i, n;
	char *File = "XY.txt";
	vector<point> sample;
	doubleVector  coefficient;
	sample = getFile(File);
	printf("拟合多项式阶数n=");
	scanf_s("%d", &n);
	coefficient = getCoeff(sample, n);
	printf("\n拟合矩阵的系数为:\n");
	for (i = 0; i < coefficient.size(); i++)
		printf("a%d = %lf\n", i, coefficient[i]);
 
}
//矩阵方程
doubleVector getCoeff(vector<point> sample, int n)
{
	vector<doubleVector> matFunX;  //公式3左矩阵
	vector<doubleVector> matFunY;  //公式3右矩阵
	doubleVector temp;
	double sum;
	int i, j, k;
	//公式3左矩阵
	for (i = 0; i <= n; i++)
	{
		temp.clear();
		for (j = 0; j <= n; j++)
		{
			sum = 0;
			for (k = 0; k < sample.size(); k++)
				sum += pow(sample[k].x, j + i);
			temp.push_back(sum);
		}
		matFunX.push_back(temp);
	}
 
	//打印matFunX矩阵
	printf("matFunX矩阵:\n");
	for (i = 0;i < matFunX.size();i++) {
		for (j = 0;j < matFunX.size();j++)
			printf("%f\t", matFunX[i][j]);
		printf("\n");
	}
	printf("matFunX.size=%d\n", matFunX.size());
	//printf("matFunX[3][3]=%f\n", matFunX[3][3]);
 
	//公式3右矩阵
	for (i = 0; i <= n; i++)
	{
		temp.clear();
		sum = 0;
		for (k = 0; k < sample.size(); k++)
			sum += sample[k].y*pow(sample[k].x, i);
		temp.push_back(sum);
		matFunY.push_back(temp);
	}
	printf("matFunY.size=%d\n", matFunY.size());
	//打印matFunY的矩阵
	printf("matFunY的矩阵:\n");
	for (i = 0;i < matFunY.size();i++) {
			printf("%f\n", matFunY[i][0]);
	}
	//矩阵行列式变换,将matFunX矩阵变为下三角矩阵,将matFunY矩阵做怎样的变换呢?
	//AX=Y在将X变换为下三角矩阵X'时,是左右两边同乘ratio
	double num1, num2, ratio;
	for (i = 0; i < matFunX.size() - 1; i++)
	{
		num1 = matFunX[i][i];
		for (j = i + 1; j < matFunX.size(); j++)
		{
			num2 = matFunX[j][i];
			ratio = num2 / num1;
			for (k = 0; k < matFunX.size(); k++)
				matFunX[j][k] = matFunX[j][k] - matFunX[i][k] * ratio;
			matFunY[j][0] = matFunY[j][0] - matFunY[i][0] * ratio;
		}
	}
	//打印matFunX行列变化之后的矩阵
	printf("matFunX行列变换之后的矩阵:\n");
	for (i = 0;i < matFunX.size();i++) {
		for (j = 0;j < matFunX.size();j++)
			printf("%f\t", matFunX[i][j]);
		printf("\n");
	}
	//打印matFunY行列变换之后的矩阵
	printf("matFunY行列变换之后的矩阵:\n");
	for (i = 0;i < matFunY.size();i++) {
		printf("%f\n", matFunY[i][0]);
	}
	//计算拟合曲线的系数
	doubleVector coeff(matFunX.size(), 0);
	for (i = matFunX.size() - 1; i >= 0; i--)
	{
		if (i == matFunX.size() - 1)
			coeff[i] = matFunY[i][0] / matFunX[i][i];
		else
		{
			for (j = i + 1; j < matFunX.size(); j++)
				matFunY[i][0] = matFunY[i][0] - coeff[j] * matFunX[i][j];
			coeff[i] = matFunY[i][0] / matFunX[i][i];
		}
	}
	return coeff;
}
 
//获取文件数据
vector<point> getFile(char *File)
{
	int i = 1;
	vector<point> dst;
 
	FILE *fp = fopen(File, "r");
 
	if (fp == NULL)
	{
		printf("Open file error!!!\n");
		exit(0);
	}
 
	point temp;
	double num;
 
	while (fscanf(fp, "%lf", &num) != EOF)
	{
		if (i % 2 == 0)
		{
			temp.y = num;
			dst.push_back(temp);
		}
		else
			temp.x = num;
		i++;
	}
	fclose(fp);
	return dst;
}

改成C 语言:
代码出处

#include <stdio.h>
#include "stdlib.h"
#include "math.h"
//#include <vector>
//using namespace std;

#define MAX_EXP 4 /* x最高次幂 */
#define MATRIX_DIM (MAX_EXP + 1)   /* 矩阵阶数 */
#define SMPNUM 5    /* 采样个数 */

struct point
{
    double x;
    double y;
};

/* 采样点想, y */
float sampleX[SMPNUM] = {0.0};
float sampleY[SMPNUM] = {0.0};

void getFile(char *File);  //获取文件数据
void getCoeff(float sampleX[SMPNUM], float sampleY[SMPNUM], float coeff[MATRIX_DIM]);   //获取系数

int main()
{
    int i;
    char *File = "XY.txt";
    //vector<point> sample;
    //doubleVector  coefficient;
    //sample = getFile(File);
    getFile(File);
    printf("拟合多项式阶数n=");
    //scanf("%d", &n);
    // coefficient = getCoeff(sample, n);
    //n = 3;

    float coeff[MATRIX_DIM] = {0};
    getCoeff(sampleX, sampleY, coeff);
    printf("\n拟合矩阵的系数为:\n");
    for (i = 0; i < MATRIX_DIM; i++)
    {
        printf("a%d = %lf\n", i, coeff[i]);
    }

    return 0;
}
//矩阵方程
void getCoeff(float sampleX[SMPNUM], float sampleY[SMPNUM], float coeff[MATRIX_DIM])
{
    double sum;
    int i, j, k;

    float matX[MATRIX_DIM][MATRIX_DIM];  //公式3左矩阵
    float matY[MATRIX_DIM][MATRIX_DIM];  //公式3右矩阵
    float temp2[MATRIX_DIM];
    //公式3左矩阵
    for (i = 0; i < MATRIX_DIM; i++)
    {
        for (j = 0; j < MATRIX_DIM; j++)
        {
            sum = 0.0;
            for (k = 0; k < SMPNUM; k++)
            {
                sum += pow(sampleX[k], j + i);
            }
            matX[i][j] = sum;
        }
    }

    //打印matFunX矩阵
    printf("matFunX矩阵:\n");
    for (i = 0; i < MATRIX_DIM; i++)
    {
        for (j = 0; j < MATRIX_DIM; j++)
        {
            printf("%f\t", matX[i][j]);
        }
        printf("\n");
    }

    //公式3右矩阵
    for (i = 0; i < MATRIX_DIM; i++)
    {
        //temp.clear();
        sum = 0;
        for (k = 0; k < SMPNUM; k++)
        {
            sum += sampleY[k] * pow(sampleX[k], i);
        }
        matY[i][0] = sum;
    }
    //printf("matFunY.size=%d\n", matFunY.size());
    //打印matFunY的矩阵
    printf("matFunY的矩阵:\n");
    for (i = 0; i < MATRIX_DIM; i++)
    {
        printf("%f\n", matY[i][0]);
    }
    //矩阵行列式变换,将matFunX矩阵变为下三角矩阵,将matFunY矩阵做怎样的变换呢?
    //AX=Y在将X变换为下三角矩阵X'时,是左右两边同乘ratio
    double num1, num2, ratio;
    for (i = 0; i < MATRIX_DIM; i++)
    {
        num1 = matX[i][i];
        for (j = i + 1; j < MATRIX_DIM; j++)
        {
            num2 = matX[j][i];
            ratio = num2 / num1;
            for (k = 0; k < MATRIX_DIM; k++)
            {
                matX[j][k] = matX[j][k] - matX[i][k] * ratio;
            }
            matY[j][0] = matY[j][0] - matY[i][0] * ratio;
        }
    }
    //打印matFunX行列变化之后的矩阵
    printf("matFunX行列变换之后的矩阵:\n");
    for (i = 0; i < MATRIX_DIM; i++)
    {
        for (j = 0; j < MATRIX_DIM; j++)
        {
            printf("%f\t", matX[i][j]);
        }
        printf("\n");
    }
    //打印matFunY行列变换之后的矩阵
    printf("matFunY行列变换之后的矩阵:\n");
    for (i = 0; i < MATRIX_DIM; i++)
    {
        printf("%f\n", matY[i][0]);
    }
    //计算拟合曲线的系数
    //doubleVector coeff(n + 1, 0);
    for (i = MATRIX_DIM - 1; i >= 0; i--)
    {
        if (i == MATRIX_DIM - 1)
        {
            coeff[i] = matY[i][0] / matX[i][i];
        }
        else
        {
            for (j = i + 1; j < MATRIX_DIM; j++)
            {
                matY[i][0] = matY[i][0] - coeff[j] * matX[i][j];
            }
            coeff[i] = matY[i][0] / matX[i][i];
        }
    }
    return;
}

//获取文件数据
void getFile(char *File)
{
    int i = 0, j = 0, k = 0;
    //vector<point> dst;

    FILE *fp = fopen(File, "r");

    if (fp == NULL)
    {
        printf("Open file error!!!\n");
        exit(0);
    }

    point temp;
    double num;

    while (fscanf(fp, "%lf", &num) != EOF)
    {
        if (i % 2 == 0)
        {
            temp.x = num;
            sampleX[j++] = num;


        }
        else
        {
            temp.y = num;
            sampleY[k++] = num;
        }
        i++;
    }
    fclose(fp);
    return;
    //return dst;
}

C语言消元法求解代码实现:
代码出处

#define RANK_  	3  		多项式次数
/*
*********************************************************************************************************
*   函 数 名: polyfit
*   功能说明: 多项式曲线拟合(与matlab效果一致)
*   形    参: d_X	输入的数据的x值
			  d_Y	输入的数据的y值
			  d_N	输入的数据的个数
			  rank  多项式的次数
			  coeff 输出的系数
*   返 回 值: 无
*********************************************************************************************************
*/
//原理:At * A * C = At * Y	,其中 At 为 A 转置矩阵,C 为系数矩阵
void polyfit(double *d_X, double *d_Y, int d_N, int rank, double *coeff)
{
	if(RANK_ != rank)	//判断次数是否合法
		return;

	int i,j,k;	
	double aT_A[RANK_ + 1][RANK_ + 1] = {0};
	double aT_Y[RANK_ + 1] = {0};
	
	
	for(i = 0; i < rank + 1; i++)	//行
	{
		for(j = 0; j < rank + 1; j++)	//列
		{
			for(k = 0; k < d_N; k++)	
			{
				aT_A[i][j] +=  pow(d_X[k], i+j);		//At * A 线性矩阵
			}
		}
	}
	
	for(i = 0; i < rank + 1; i++)
	{
		for(k = 0; k < d_N; k++)
		{
			aT_Y[i] += pow(d_X[k], i) * d_Y[k];		//At * Y 线性矩阵
		}
	}
	
	//以下为高斯列主元素消去法解线性方程组
	for(k = 0; k < rank + 1 - 1; k++)
	{
		int row = k;
		double mainElement = fabs(aT_A[k][k]);
		double temp = 0.0;
		
		//找主元素
		for(i = k + 1; i < rank + 1 - 1; i++)
		{
			if( fabs(aT_A[i][i]) > mainElement )
			{
				mainElement = fabs(aT_A[i][i]);
				row = i;
			}
		}
		
		//交换两行
		if(row != k)
		{
			for(i = 0; i < rank + 1; i++)
			{
				temp = aT_A[k][i];
				aT_A[k][i] = aT_A[row][i];
				aT_A[row][i] = temp;
			}	
			temp = aT_Y[k];
			aT_Y[k] = aT_Y[row];
			aT_Y[row] = temp;
		}
			
		
		//消元过程
		for(i = k + 1; i < rank + 1; i++)
		{
			for(j = k + 1; j < rank + 1; j++)
			{
				aT_A[i][j] -= aT_A[k][j] * aT_A[i][k] / aT_A[k][k];
			}
			aT_Y[i] -= aT_Y[k] * aT_A[i][k] / aT_A[k][k];
		}
	}	
		
	//回代过程
	for(i = rank + 1 - 1; i >= 0; coeff[i] /= aT_A[i][i], i--)
	{
		for(j = i + 1, coeff[i] = aT_Y[i]; j < rank + 1; j++)
		{
			coeff[i] -= aT_A[i][j] * coeff[j];
		}
	}

	return;	
}

python 代码实现 多项式曲线拟合:
代码出处

'''
   多项式:yi = w0 + w1*xi^1 + w2*xi^2 + ... + wn*xi^m
   N为数据点个数,M为阶数
   先用数据点(xa、ya)求出未知参数,然后用参数带入后的公式求解给定值(xxa)
'''
import matplotlib.pyplot as plt
import numpy
import random
 
fig = plt.figure()
ax = fig.add_subplot(111)
 
# 在这里给出拟合多项式的阶数
order = 9
 
# 1. 生成曲线上的各个点
x = numpy.arange(-1,1,0.02)
y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy.sin(a*2) for a in x]   
 
# y=[(x^2-1)^3]*sin(2x),阶数为6???
 
# ax.plot(x,y,color='r',linestyle='-',marker='')
# ,label="(a*a-1)*(a*a-1)*(a*a-1)+0.5"
plt.plot(x,y,c='red')
 
# 2. 生成的曲线上的各个点偏移一下,并放入到x_data,y_data中去
i=0
x_data=[]
y_data=[]
for xx in x:
    yy=y[i]
    d=float(random.randint(60,140))/100
    #ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.')
    i+=1
    x_data.append(xx*d)
    y_data.append(yy*d)
 
ax.plot(x_data,y_data,color='m',linestyle='',marker='.')
 
# 3. 计算Ax=b中,矩阵A、b
# 存储从0次到m次的所有冥方和
bigMat=[]
for j in range(0, 2*order+1):
    sum = 0
    for i in range(0,len(xa)):
        sum += (xa[i]**j)
    bigMat.append(sum)
 
# 计算线性方程组系数矩阵:A
matA=[]
for rowNum in range(0,order+1):
    row=bigMat[rowNum:rowNum+order+1]
    matA.append(row)
 
matA=numpy.array(matA)
 
matB=[]
for i in range(0,order+1):
    ty=0.0
    for k in range(0,len(xa)):
        ty+=ya[k]*(xa[k]**i)
    matB.append(ty)
 
matB=numpy.array(matB)
 
matW=numpy.linalg.solve(matA,matB)
# numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量
 
# 画出拟合后的曲线
# print(matW)
x_ = numpy.arange(-1,1.06,0.01)
y_ =[]
for i in range(0,len(xxa)):
    yy=0.0
    for j in range(0,order+1):
        dy = (x_[i]**j)*matW[j]
        # dy*=matW[j]
        yy += dy
    y_.append(yy)
ax.plot(x_,y_,color='g',linestyle='-',marker='')
 
ax.legend()
plt.show()

相关参考:
https://blog.csdn.net/qq_27586341/article/details/90170839
https://blog.csdn.net/MoreAction_/article/details/106443383
https://www.cnblogs.com/nhyq-wyj/p/14898517.html
https://sikasjc.github.io/2018/10/24/curvefitting/

https://blog.csdn.net/piaoxuezhong/article/details/54973750
https://blog.csdn.net/tutu1583/article/details/82111060

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/370377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解

目录 2.6 双端队列1) 概述2) 链表实现3) 数组实现习题E01. 二叉树 Z 字层序遍历-Leetcode 103 2.6 双端队列 1) 概述 双端队列、队列、栈对比 定义特点队列一端删除&#xff08;头&#xff09;另一端添加&#xff08;尾&#xff09;First In First Out栈一端删除和添加&…

网工内推 | 金融业网络安全岗,最高40K*15薪,CISP认证优先

01 国泰产险 招聘岗位&#xff1a;资深信息安全工程师 职责描述&#xff1a; 1、负责公司云平台业务系统的安全规划设计&#xff0c;协助业务系统制定安全解决方案&#xff1b; 2、负责建立公司信息安全标准&#xff0c;制定平台安全策略&#xff0c;安全加固&#xff0c;防范…

数据可视化 pycharts实现中国各省市地图数据可视化

自用版 数据格式如下&#xff1a; 运行效果如下&#xff1a; import pandas as pd from pyecharts.charts import Map, TreeMap, Timeline, Page, WordCloud from pyecharts import options as opts from pyecharts.commons.utils import JsCode from pyecharts.globals im…

js逆向-某验3代滑块验证码分析

声明 本文仅供学习参考&#xff0c;如有侵权可私信本人删除&#xff0c;请勿用于其他途径&#xff0c;违者后果自负&#xff01; 如果觉得文章对你有所帮助&#xff0c;可以给博主点击关注和收藏哦&#xff01; 插句个人内容&#xff1a;本人最近正在找工作&#xff0c;工作城…

alibabacloud学习笔记05(小滴课堂)

高并发下的微服务存在的问题 高并发下的微服务容错方案 介绍什么是分布式系统的流量防卫兵Sentinel 微服务引入Sentinel和控制台搭建 每个服务都加上这个依赖。 启动方式&#xff1a; 讲解AliababCloud微服务整合Sentinel限流配置实操 我们在order和video模块都加上。 分别启动…

第三百零六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享三个使用TextField的细节"沉浸式状态样相关的内容&#xff0c;本章回中将介绍如何创建单例模式.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现POA-CNN-LSTM-Attention鹈鹕算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

超时引发的牛角尖二(hystrix中的超时)

至今我都清楚记得自己负责的系统请求云上关联系统时所报的异常信息。为了解决这个异常&#xff0c;我坚持让这个关联系统的负责人查看&#xff0c;并且毫不顾忌他的嘲讽和鄙视&#xff0c;甚至无视他烦躁的情绪。不过我还是高估了自己的脸皮&#xff0c;最终在其恶狠狠地抛下“…

智能决策的艺术:探索商业分析的最佳工具和方法

文章目录 一、引言二、商业分析思维概述三、数据分析在商业实践中的应用四、如何培养商业分析思维与实践能力五、结论《商业分析思维与实践&#xff1a;用数据分析解决商业问题》亮点内容简介作者简介目录获取方式 一、引言 随着大数据时代的来临&#xff0c;商业分析思维与实…

前端小案例——滚动文本区域(HTML+CSS, 附源码)

一、前言 实现功能: 这个案例实现了一个具有滚动功能的文本区域&#xff0c;用于显示长文本内容&#xff0c;并且可以通过滚动条来查看完整的文本内容。 实现逻辑&#xff1a; 内容布局&#xff1a;在<body>中&#xff0c;使用<div>容器创建了一个类名为listen_t…

vue3 之 组合式API—watch函数

watch函数 作用&#xff1a;侦听一个或者多个数据的变化&#xff0c;数据变化时执行回调函数 两个额外参数&#xff1a; 1.immediate&#xff08;立即执行&#xff09;2.deep&#xff08;深度侦听&#xff09; 场景&#xff1a;比如选择不同的内容请求后端不同数据时 如下图 …

【算法与数据结构】300、674、LeetCode最长递增子序列 最长连续递增序列

文章目录 一、300、最长递增子序列二、674、最长连续递增序列三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、300、最长递增子序列 思路分析&#xff1a; 第一步&#xff0c;动态数组的含义。 d p [ i ] dp[i] dp[i…

IDEA 配置以及一些技巧

1. IDEA设置 1.1 设置主题 1.2 设置字体和字体大小 1.3 编辑区的字体用ctrl鼠标滚轮可以控制大小 1.4 自动导包和优化多余的包 1.5 设置编码方式 1.6 配置 maven 1.7 设置方法形参参数提示 1.8 设置控制台的字体和大小 注意&#xff1a;设置控制台字体和大小后需要重启IDEA才会…

异步解耦之RabbitMQ(二)_RabbitMQ架构及交换机

异步解耦之RabbitMQ(一)-CSDN博客 RabbitMQ架构 RabbitMQ是一个基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议的消息代理中间件&#xff0c;它通过交换机和队列实现消息的路由和分发。以下是RabbitMQ的架构图&#xff1a; Producer&#xff08;生产…

LabVIEW风力发电机在线监测

LabVIEW风力发电机在线监测 随着可再生能源的发展&#xff0c;风力发电成为越来越重要的能源形式。设计了一个基于控制器局域网&#xff08;CAN&#xff09;总线和LabVIEW的风力发电机在线监测系统&#xff0c;实现风力发电机的实时监控和故障诊断&#xff0c;以提高风力发电的…

ArrayList在添加元素时报错java.lang.ArrayIndexOutOfBoundException

一、添加单个元素数组越界分析 add源码如下 public boolean add(E e) {ensureCapacityInternal(size 1); // Increments modCount!!elementData[size] e;return true; } size字段的定义 The size of the ArrayList (the number of elements it contains). ArrayList的大…

【面试官问】Redis 持久化

目录 【面试官问】Redis 持久化 Redis 持久化的方式RDB(Redis DataBase)AOF(Append Only File)混合持久化:RDB + AOF 混合方式的持久化持久化最佳方式控制持久化开关主从部署使用混合持久化使用配置更高的机器参考文章所属专区

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话。 HTTP协议是无状态的&#xff0c;导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

机器学习系列——(六)数据降维

引言 在机器学习领域&#xff0c;数据降维是一种常用的技术&#xff0c;旨在减少数据集的维度&#xff0c;同时保留尽可能多的有用信息。数据降维可以帮助我们解决高维数据带来的问题&#xff0c;提高模型的效率和准确性。本文将详细介绍机器学习中的数据降维方法和技术&#…

【Linux取经路】进程控制——程序替换

文章目录 一、单进程版程序替换看现象二、程序替换的基本原理三、程序替换接口学习3.1 替换自己写的可执行程序3.2 第三个参数 envp 验证四、结语一、单进程版程序替换看现象 #include <stdio.h> #
最新文章