【学习笔记】灰色预测 GM(1,1) 模型 —— Matlab

news2024/11/25 0:53:03

文章目录

  • 前言
  • 一、灰色预测模型
    • 灰色预测
    • 适用情况
    • GM (1,1)模型
  • 二、示例
    • 指数规律检验(原始数据级比检验)
      • 级比检验的定义
      • GM(1,1) 模型的级比检验
    • 模型求解
      • 求解微分方程
    • 模型评价(检验模型对原始数据的拟合程度)
      • 残差检验
      • 级比偏差检验
  • 三、代码实现----Matlab
    • 级比检验代码
    • 模型求解代码
    • 调用模型求解代码进行预测


前言

通过模型算法,熟练对Matlab的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF?p=48&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、灰色预测模型

灰色系统理论在另一篇博客中已经阐述过了,此处不作赘述。

参考链接:【学习笔记】Matlab和python双语言的学习(灰色关联分析法)

灰色预测

  • 所谓灰色预测,就是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。

适用情况

  1. 数据是以年份度量非负数据(如果是月份或者季度数据一般要用时间序列模型),比如定时求量的题目,即已知一些年份数据,预测下一年的数据,常见有GDP、人口数量、耕地面积、粮食产量等;或者定量求时,已知一些年份数据和某灾变的阈值,预测下次灾变时间。
  2. 数据能经过准指数规律的检验(除了前两期外,后面至少90%的期数的光滑比要低于0.5)。
  3. 数据的期数较短且和其他数据之间的关联性不强(小于等于10,也不能太短了,比如只有3期数据),要是数据期数较长,一般用传统的时间序列模型比较合适。

GM (1,1)模型

  • G M : G r e y m o d e l GM:Greymodel GM:Greymodel 灰色模型,
  • ( 1 , 1 ) : (1,1){:} (1,1): 只含有一个变量的一阶微分方程模型
  • 如何用 G M ( 1 , 1 ) GM(1,1) GM(1,1) 进行灰色预测?
    • 根据原始的离散非负数据列,通过累加等方式削弱随机性、获得有规律的离散数据列
    • 建立相应的微分方程模型,得到离散点处的解
    • 再通过累减求得的原始数据的估计值,从而对原始数据预测

二、示例

  • 长江在 1995-2004 年废水排放总量如下,如果不采取保护措施,请对今后水质污染发展趋势做出预测。
    在这里插入图片描述

指数规律检验(原始数据级比检验)

级比检验的定义

  • 为了确定原始数据是否可使用灰色预测模型,需要对原始数据进行级比检验
  • 要使用灰色预测数据首先应具有准指数规律:
    累加 r r r 次的序列为: x ( r ) = ( x ( r ) ( 1 ) , x ( r ) ( 2 ) , . . . , x ( r ) ( n ) ) x^{(r)}=\left(x^{(r)}(1),x^{(r)}(2),...,x^{(r)}(n)\right) x(r)=(x(r)(1),x(r)(2),...,x(r)(n)),定义级比 σ ( k ) = x ( r ) ( k ) x ( r ) ( k − 1 ) , k = 2 , 3 , . . . , n \sigma(k)=\frac{x^{(r)}(k)}{x^{(r)}(k-1)},k=2,3,...,n σ(k)=x(r)(k1)x(r)(k),k=2,3,...,n
    对于 ∀ k , σ ( k ) ∈ [ a , b ] \forall k,\sigma(k)\in[a,b] k,σ(k)[a,b],且区间长度 δ = b − a < 0.5 \delta=b-a<0.5 δ=ba<0.5,则称累加 r r r 次后的序列具有准指数规律

GM(1,1) 模型的级比检验

  • 对于 G M ( 1 , 1 ) GM(1,1) GM(1,1) 模型中,我们只需要判断累加一次后的序列 x ( 1 ) = ( x ( 1 ) ( 1 ) , x ( 1 ) ( 2 ) , … , x ( 1 ) ( n ) ) x^{(1)}=\left(x^{(1)}(1),x^{(1)}(2),\ldots,x^{(1)}(n)\right) x(1)=(x(1)(1),x(1)(2),,x(1)(n)) 是否具有准指数规律
  • 根据上述公式:序 列 x ( 1 ) x^{( 1) } x(1) 的级比 σ ( k ) = x ( 1 ) ( k ) x ( 1 ) ( k − 1 ) = x ( 0 ) ( k ) + x ( 1 ) ( k − 1 ) x ( 1 ) ( k − 1 ) = x ( 0 ) ( k ) x ( 1 ) ( k − 1 ) + 1 \sigma ( k) = \frac {x^{( 1) }( k) }{x^{( 1) }( k- 1) }= \frac {x^{( 0) }( k) + x^{( 1) }( k- 1) }{x^{( 1) }( k- 1) }= \frac {x^{( 0) }( k) }{x^{( 1) }( k- 1) }+ 1 σ(k)=x(1)(k1)x(1)(k)=x(1)(k1)x(0)(k)+x(1)(k1)=x(1)(k1)x(0)(k)+1
  • 定义 ρ ( k ) = x ( 0 ) ( k ) x ( 1 ) ( k − 1 ) \rho(k)=\frac{x^{(0)}(k)}{x^{(1)}(k-1)} ρ(k)=x(1)(k1)x(0)(k) 为原始序列 x ( 0 ) x^{(0)} x(0) 的光滑比,注意到 ρ ( k ) = x ( 0 ) ( k ) x ( 0 ) ( 1 ) + x ( 0 ) ( 2 ) + ⋯ + x ( 0 ) ( k − 1 ) \rho(k)=\frac{x^{(0)}(k)}{x^{(0)}(1)+x^{(0)}(2)+\cdots+x^{(0)}(k-1)} ρ(k)=x(0)(1)+x(0)(2)++x(0)(k1)x(0)(k),假设 x ( 0 ) x^{(0)} x(0) 为非负序列(生活中常见的时间序列几乎都满足非负性),那么随着 k k k 增加,最终 ρ ( k ) \rho(k) ρ(k) 会逐渐接近0,因此要使得具有 x ( 1 ) x^{(1)} x(1) 具有准指数规律,即 ∀ k \forall k k,区间长度 δ < 0.5 \delta<0.5 δ<0.5,只需要保证 ρ ( k ) ∈ ( 0 , 0.5 ) \rho(k)\in(0,0.5) ρ(k)(0,0.5) 即可,此时序列 x ( 1 ) x^{(1)} x(1) 的级比 σ ( k ) ∈ ( 1 , 1.5 ) \sigma(k)\in(1,1.5) σ(k)(1,1.5)
  • 实际建模中,我们要计算出 ρ ( k ) ∈ ( 0 , 0.5 ) \rho(k)\in(0,0.5) ρ(k)(0,0.5) 的占比,占比越高越好(一般 ρ ( 2 ) \rho(2) ρ(2) ρ ( 3 ) \rho(3) ρ(3)可能不符合,重点关注后面的数据)

模型求解

在这里插入图片描述

  • 观察发现,没有明显规律,数据也比较少, 而且是以年份度量的,可以考虑用灰色预测
  • 那看不出规律怎么办,可以制造规律:

x ( 0 ) = ( x ( 0 ) ( 1 ) , x ( 0 ) ( 2 ) , . . . , x ( 0 ) ( n ) ) x^{(0)}=(x^{(0)}(1),x^{(0)}(2),...,x^{(0)}(n)) x(0)=(x(0)(1),x(0)(2),...,x(0)(n))是最初的非负数据列,我们可以对其累加,得到新的数据列 x ( 1 ) x^{(1)} x(1)
x ( 1 ) = ( x ( 1 ) ( 1 ) , x ( 1 ) ( 2 ) , … , x ( 1 ) ( n ) ) x^{(1)}=\left(x^{(1)}(1),x^{(1)}(2),\ldots,x^{(1)}(n)\right) x(1)=(x(1)(1),x(1)(2),,x(1)(n))
其中: x ( 1 ) ( m ) = ∑ i = 1 m x ( 0 ) ( i ) , m = 1 , 2 , . . . , n x^{(1)}(m)=\sum_{\mathrm{i}=1}^{\mathrm{m}}x^{(0)}(i),m=1,2,...,n x(1)(m)=i=1mx(0)(i),m=1,2,...,n
在这里插入图片描述

  • 观察可知,新序列 x ( 1 ) x^{(1)} x(1) 曲线像一个指数曲线(直线)
  • 我们可以用指数曲线的表达式来逼近序列 x ( 1 ) x^{(1)} x(1),相应可以构建一阶常微分方程来求解拟合指数曲线的函数表达式
  • 一阶常微分方程
    d x ( 1 ) d t + a x ( 1 ) = u \frac{dx^{(1)}}{dt}+ax^{(1)}=u dtdx(1)+ax(1)=u
    要求出 x ( 1 ) x^{(1)} x(1) 的表达式,就需要解出常微分方程,所以要先知道参数 a a a u u u

求解微分方程

  • 一阶常微分方程
    d x ( 1 ) d t + a x ( 1 ) = u \frac{dx^{(1)}}{dt}+ax^{(1)}=u dtdx(1)+ax(1)=u
  • 已知,我们的数据是离散的,所以 d x ( 1 ) d t \frac {dx^{(1)}}{dt} dtdx(1) 等同于 Δ x ( 1 ) Δ t = Δ x ( 1 ) t − ( t − 1 ) = Δ x ( 1 ) = x ( 1 ) ( t ) − x ( 1 ) ( t − 1 ) = x ( 0 ) ( t ) \frac {\Delta x^{( 1) }}{\Delta t}= \frac {\Delta x^{(1)}}{t-(t-1)}= \Delta x^{(1)}= x^{(1)}(t) - x^{(1)}(t-1) = x^{(0)}(t) ΔtΔx(1)=t(t1)Δx(1)=Δx(1)=x(1)(t)x(1)(t1)=x(0)(t)
    则微分方程变为 x ( 0 ) ( t ) + a x ( 1 ) ( t ) = u x^{(0)}(t)+ax^{(1)}(t)=u x(0)(t)+ax(1)(t)=u
  • 上式为常见的一元线性方程,为了消除数据随机性,定义 z ( 1 ) = ( z ( 1 ) ( 1 ) , z ( 1 ) ( 2 ) , . . . , z ( 1 ) ( n ) ) z^{(1)}=(z^{(1)}(1),z^{(1)}(2),...,z^{(1)}(n)) z(1)=(z(1)(1),z(1)(2),...,z(1)(n))
    其中: z ( 1 ) ( m ) = δ x ( 1 ) ( m ) + ( 1 − δ ) x ( 1 ) ( m − 1 ) , m = 2 , 3 , . . . , n z^{(1)}(m)=\delta x^{(1)}(m)+(1-\delta)x^{(1)}(m-1),m=2,3,...,n z(1)(m)=δx(1)(m)+(1δ)x(1)(m1),m=2,3,...,n δ = 0.5 \delta=0.5 δ=0.5,即为前后时刻的均值
  • 则微分方程改为 x ( 0 ) ( t ) = − a z ( 1 ) ( t ) + u x^{(0)}(t)=-az^{(1)}(t)+u x(0)(t)=az(1)(t)+u
  • 我们已知 x ( 0 ) ( t ) , z ( 1 ) ( t ) x^{(0)}(t),z^{(1)}(t) x(0)(t),z(1)(t)的数据,结合线性回归的知识,可利用线性回归或者用最小二乘法求解参数
  • a ^ \hat{a} a^ u ^ \hat{u} u^ 代入微分方程 d x ( 1 ) d t + a x ( 1 ) = u \frac{dx^{(1)}}{dt}+ax^{(1)}=u dtdx(1)+ax(1)=u,并求解可得
    x ^ ( 1 ) ( m + 1 ) = [ x ( 0 ) ( 1 ) − u ^ a ^ ] e − a ^ m + u ^ a ^ , m = 1 , 2 , . . . , n − 1 \hat{x}^{(1)}(m+1)=\left[x^{(0)}(1)-\frac{\hat{u}}{\hat{a}}\right] e^{-\hat{a}m}+\frac{\hat{u}}{\hat{a}},m=1,2,...,n-1 x^(1)(m+1)=[x(0)(1)a^u^]ea^m+a^u^,m=1,2,...,n1
  • 由于 x ( 1 ) ( m ) = ∑ i = 1 m x ( 0 ) ( i ) , m = 1 , 2 , . . . , n x^{(1)}(m)=\sum_{\mathrm{i}=1}^{\mathrm{m}}x^{(0)}(i),m=1,2,...,n x(1)(m)=i=1mx(0)(i),m=1,2,...,n,所以我们可以得到:
    x ^ ( 0 ) ( m + 1 ) = x ^ ( 1 ) ( m + 1 ) − x ^ ( 1 ) ( m ) = ( 1 − e a ^ ) [ x ( 0 ) ( 1 ) − u ^ a ^ ] e − a ^ m , m = 1 , 2 , . . . , n − 1 \hat{x}^{(0)}(m+1)=\hat{x}^{(1)}(m+1)-\hat{x}^{(1)}(m)=\left(1-e^{\hat{a}}\right)\left[x^{(0)}(1)-\frac{\hat{u}}{\hat{a}}\right]e^{-\hat{a}m},m=1,2,...,n-1 x^(0)(m+1)=x^(1)(m+1)x^(1)(m)=(1ea^)[x(0)(1)a^u^]ea^m,m=1,2,...,n1
  • m m m 取 0,1,…,9 时,得到的 x ^ ( 0 ) \hat{x}^{(0)} x^(0) 为拟合值,大于 9 时,得到的为预测值

模型评价(检验模型对原始数据的拟合程度)

残差检验

  • 绝对残差: ϵ ( k ) = x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) , k = 2 , 3 , . . . , n \epsilon(k)=x^{(0)}(k)-\hat{x}^{(0)}(k),k=2,3,...,n ϵ(k)=x(0)(k)x^(0)(k),k=2,3,...,n
  • 相 对 残 差: ϵ r ( k ) = ∣ x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) ∣ x ( 0 ) ( k ) × 100 % , k = 2 , 3 , . . . , n \epsilon _r( k) = \frac {\left | x^{( 0) }( k) - \hat{x} ^{( 0) }( k) \right | }{x^{( 0) }( k) }\times 100\% , k= 2, 3, . . . , n ϵr(k)=x(0)(k)x(0)(k)x^(0)(k)×100%,k=2,3,...,n
  • 平均相对残差: ϵ ˉ r = 1 n − 1 ∑ k = 2 n ∣ ϵ r ( k ) ∣ \bar{\epsilon}_r=\frac1{n-1}\sum_{k=2}^n|\epsilon_r(k)| ϵˉr=n11k=2nϵr(k)
    • 如果 ϵ ˉ r < 20 % \bar{\epsilon}_r<20\% ϵˉr<20%,则认为 G M ( 1 , 1 ) GM(1,1) GM(1,1) 对原数据的拟合达到一般要求
    • 如果 ϵ ˉ r < 10 % \bar{\epsilon}_r<10\% ϵˉr<10%,则认为 G M ( 1 , 1 ) GM(1,1) GM(1,1) 对原数据的拟合效果非常不错

级比偏差检验

首先计算原始数据级比 σ ( k ) = x ( 0 ) ( k ) x ( 0 ) ( k − 1 ) ( k = 2 , 3 , … , n ) \sigma(k)=\frac{x^{(0)}(k)}{x^{(0)}(k-1)}\left(k=2,3,\ldots,n\right) σ(k)=x(0)(k1)x(0)(k)(k=2,3,,n)

再根据预测发展系数 ( − a ^ ) (-\hat{a}) (a^) 计算级比偏差和平均级比偏差
η ( k ) = ∣ 1 − 1 − 0.5 a ^ 1 + 0.5 a ^ 1 σ ( k ) ∣ ,   η ‾ = ∑ k = 2 n η ( k ) / ( n − 1 ) \eta(k)=\left|1-\frac{1-0.5\hat{a}}{1+0.5\hat{a}}\frac{1}{\sigma(k)}\right|,\:\overline{\eta}=\sum_{k=2}^{n}\eta(k)/(n-1) η(k)= 11+0.5a^10.5a^σ(k)1 ,η=k=2nη(k)/(n1)
如果 η ˉ < 0.2 \bar{\eta}<0.2 ηˉ<0.2,则认为模型对原数据拟合达到一般要求; η ˉ < 0.1 \bar{\eta}<0.1 ηˉ<0.1,则认为模型对原数据拟合效果非常不错

三、代码实现----Matlab

级比检验代码

clear;clc
year =[1995:1:2004]';  % 横坐标表示年份,写成列向量的形式
x0 = [174,179,183,189,207,234,220.5,256,270,285]';  %原始数据序列,写成列向量的形式

n = size(x0,1);
x1 = zeros(n,1);
for i = 1:n
    x1(i) = sum(x0(1:i,1));
end

% 级比检验
rho = zeros(n,1);
for i = 2:n
    rho(i) = x0(i) / x1(i-1);
end
figure(2)
plot(year(2:n,1),rho(2:n,1),'o-',[year(2),year(n)],[0.5,0.5],'-'); grid on;
text(year(end-1)+0.2,0.55,'临界线')   % 在坐标(year(end-1)+0.2,0.55)上添加文本
set(gca,'xtick',year(2:1:end))  % 设置x轴横坐标的间隔为1
xlabel('年份');  ylabel('原始数据的光滑度');  % 给坐标轴加上标签
% 指标1:光滑比小于0.5的数据占比
num1 = sum(rho<0.5)/(n-1)
% 指标2:除去前两个时期外,光滑比小于0.5的数据占比
num2 = sum(rho(3:end)<0.5)/(n-3)

运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
参考标准:指标1一般要大于60%, 指标2要大于90%,所以通过了级比检验。

模型求解代码

function [result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num)
    n = size(x0,1);
    x1 = cumsum(x0);
    z1 = 0.5 * x1(2:end) + 0.5 * x1(1:n-1,1)
    y = x0;
    x = z1;
    [b,bint,r,rint,stats]=regress(y, x);  % 调用一元线性回归函数求解a和u
    a = -b(1);
    u = b(2);
    x0_hat = zeros(n,1);
    x0_hat(1) = x0(1);
    for m = 1: n-1
        x0_hat(m+1) = (1-exp(a))*(x0(1)-u/a)*exp(-a*m);
    end
    result = zeros(predict_num,1);  % 初始化用来保存预测值的向量
    for i = 1: predict_num
        result(i) = (1-exp(a))*(x0(1)-u/a)*exp(-a*(n+i-1)); % 带入公式直接计算
    end
    % 计算绝对残差和相对残差
    absolute_residuals = x0(2:end) - x0_hat(2:end);   % 从第二项开始计算绝对残差,因为第一项是相同的
    relative_residuals = abs(absolute_residuals) ./ x0(2:end);  % 计算相对残差
    % 计算级比和级比偏差
    class_ratio = x0(2:end) ./ x0(1:end-1) ;  % 计算级比
    eta = abs(1-(1-0.5*a)/(1+0.5*a)*(1./class_ratio));  % 计算级比偏差
end
% 函数作用:使用传统的GM(1,1)模型对数据进行预测
%     x0:要预测的原始数据
%     predict_num: 向后预测的期数

% 输出变量
%     result:预测值
%     x0_hat:对原始数据的拟合值
%     relative_residuals: 对模型进行评价时计算得到的相对残差
%     eta: 对模型进行评价时计算得到的级比偏差

调用模型求解代码进行预测

if num1 > 0.6 && num2 > 0.9
    if n > 7    % 将数据分为训练组和试验组(根据原数据量大小n来取,n小于7则取最后两年为试验组,n大于7则取最后三年为试验组)
        test_num = 3;
    else
        test_num = 2;
    end
    train_x0 = x0(1:end-test_num);  % 训练数据
    disp('训练数据是: ')
    disp(mat2str(train_x0'))  % mat2str可以将矩阵或者向量转换为字符串显示
    test_x0 =  x0(end-test_num+1:end); % 试验数据
    disp('试验数据是: ')
    disp(mat2str(test_x0'))
    
    % 使用GM(1,1)模型对训练数据进行训练
    disp('GM(1,1)模型预测')
    result1 = gm11(train_x0, test_num); %预测后test_num期的结果
    % 绘制对试验数据进行预测的图形
    test_year = year(end-test_num+1:end);  % 试验组对应的年份
    figure(3)
    plot(test_year,test_x0,'o-',test_year,result1,'*-'); grid on;
    set(gca,'xtick',year(end-test_num+1): 1 :year(end))
    legend('试验组的真实数据','GM(1,1)预测结果') 
    xlabel('年份');  ylabel('排污总量');  % 给坐标轴加上标签
 
    predict_num = input('请输入你要往后面预测的期数: ');
    % 计算使用传统GM模型的结果
    [result, x0_hat, relative_residuals, eta] = gm11(x0, predict_num);
    
    %% 绘制相对残差和级比偏差的图形
    figure(4)
    subplot(2,1,1)  % 绘制子图(将图分块)
    plot(year(2:end), relative_residuals,'*-'); grid on;   % 原数据中的各时期和相对残差
    legend('相对残差'); xlabel('年份');
    set(gca,'xtick',year(2:1:end))  % 设置x轴横坐标的间隔为1
    subplot(2,1,2)
    plot(year(2:end), eta,'o-'); grid on;   % 原数据中的各时期和级比偏差
    legend('级比偏差'); xlabel('年份');
    set(gca,'xtick',year(2:1:end))
    
    %% 残差检验
    average_relative_residuals = mean(relative_residuals);  % 计算平均相对残差 mean函数用来均值
    disp(strcat('平均相对残差为',num2str(average_relative_residuals)))
    
    %% 级比偏差检验
    average_eta = mean(eta);   % 计算平均级比偏差
    disp(strcat('平均级比偏差为',num2str(average_eta)))
    
    %% 绘制最终的预测效果图
    figure(5) 
    plot(year,x0,'-o',  year,x0_hat,'-*m',  year(end)+1:year(end)+predict_num,result,'-*b' );   grid on;
    hold on;
    plot([year(end),year(end)+1],[x0(end),result(1)],'-*b')
    legend('原始数据','拟合数据','预测数据')  
    set(gca,'xtick',[year(1):1:year(end)+predict_num])  
    xlabel('年份');  ylabel('排污总量');  
end

运行结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以看出:平均相对残差为:0.025999 < 10 %
级比偏差为 0.047041 < 0.1 拟合效果非常不错

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jmeter中添加断言,使用包括匹配模式显示失败

1、在jmeter中为某个接口添加断言&#xff0c;测试模式中检查文本内容比较长时且模式匹配规则选择包括时则在运行时会提示失败&#xff0c;实际接口已经正确返回数据了。 2、这种情况下失败是因为测试模块中的检查文本内容过长&#xff0c;不应该在模式匹配规则中选择包括&…

“由于找不到msvcr110.dll无法继续执行”错误提示?msvcr110.dll在电脑中处于什么位置?

“由于找不到msvcr110.dll无法继续执行”的错误提示&#xff0c;是许多用户在使用基于Microsoft Visual C开发的应用程序时可能遇到的一个典型问题。这条错误消息指出系统缺少一个关键的动态链接库文件&#xff08;DLL&#xff09;&#xff0c;即 msvcr110.dll&#xff0c;这是…

融资管理系统项目

系列文章目录 第一章 基础知识、数据类型学习 第二章 万年历项目 第三章 代码逻辑训练习题 第四章 方法、数组学习 第五章 图书管理系统项目 第六章 面向对象编程&#xff1a;封装、继承、多态学习 第七章 封装继承多态习题 第八章 常用类、包装类、异常处理机制学习 第九章 集…

SpringBoot框架如何实现上传与下载查看文件

基于SpringBoot框架&#xff0c;如何实现文件的上传与下载查看 提要 本项目借鉴于spring-guides/gs-uploading-files: Uploading Files :: Learn how to build a Spring application that accepts multi-part file uploads. (github.com)SpringBoot官网学习文档关于如何下载文…

Git基础学习(一)

文章目录 一. Git1. 定义2. SVN与Git的的区别 一. Git 1. 定义 Git 是一种分布式版本控制系统&#xff0c;用于管理软件项目的源代码。它是由 Linux 之父 Linus Torvalds 开发的&#xff0c;并已经成为了现代软件开发领域中最流行的版本控制系统之一。 使用 Git 可以追踪代码…

旅游管理系统

TOC springboot0748旅游管理系统 第1章 绪论 1.1课题背景 计算机的普及和互联网时代的到来使信息的发布和传播更加方便快捷。用户可以通过计算机上的浏览器访问多个应用系统&#xff0c;从中获取一些可以满足用户需求的管理系统。网站系统有时更像是一个大型“展示平台”&a…

基于SpringBoot的家电销售展示平台--论文pf

TOC springboot514基于SpringBoot的家电销售展示平台--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着…

HTML+JS谁是卧底游戏

先说一句&#xff1a;一段时间没发文章&#xff0c;好多僵尸粉关注我&#xff0c;这CSDN&#x1f620; 主要功能 玩家设置&#xff1a;在游戏开始前&#xff0c;输入总人数、卧底人数和白板人数。系统会自动计算出剩下的平民人数&#xff0c;并随机分配身份。 身份查看&#…

html+css+js实现登录界面设计

在现代网页设计中&#xff0c;创建一个功能齐全且用户友好的登录页面是至关重要的。本文将介绍如何使用 HTML 和 CSS 创建一个简单而有效的登录页面&#xff0c;包括验证码、记住密码选项及忘记密码链接。 1. HTML 结构 我们将从 HTML 代码开始&#xff0c;构建一个包含登录表…

【Google SEO】搜索引擎索引综合SEO指南

有没有想过网站是如何在搜索引擎上列出的&#xff0c;以及 Google、Bing 和其他公司如何在几秒钟内为我们提供大量信息&#xff1f; 这种闪电般快速性能的秘诀在于搜索索引。它可以与所有页面的庞大且完美有序的目录档案进行比较。进入索引意味着搜索引擎已经看到了你的页面&a…

机器学习——lightGBM(学习整理)

目录 一、认识lightGBM 1. 简单介绍 2. 主要特点 LightGBM 的缺点 3. 模型训练方式 &#xff08;1&#xff09;Training API &#xff08;2&#xff09;Scikit-learn API 二、相关函数参数 1. Training API 2. Scikit-learn API&#xff08;重复只做补充&#xff09;…

python requests 被屏蔽(已设置header和代理IP,解决浏览器指纹问题)

情况说明&#xff1a; 已设置 User-Agent已使用代理IP之前请求没问题&#xff0c;突然无法请求了。我用浏览器打开网站可以正常访问。 我遇到的原因&#xff1a; 目标网站/接口&#xff0c;能够通过JA3或者其他浏览器指纹信息&#xff0c;识别到你不是通过浏览器进行访问的。…

【解决】JS Uncaught RangeError: Invalid array length

【解决】JS Uncaught RangeError: Invalid array length 在JavaScript编程中&#xff0c;Uncaught RangeError: Invalid array length 是一个相对常见的错误&#xff0c;通常发生在处理数组时提供了无效的长度值。这个错误可能由多种原因引起&#xff0c;本文将深入探讨此错误的…

LCP167 两数之和II--输入有序数组[leetcode-5]

LCP167 两数之和II–输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 <…

Redis(day 2)

一、常用指令 哈希Hash kv模式不变&#xff0c;但v是一个键值对 &#xff08;1&#xff09;hset、hget命令用于为哈希表中的字段赋值 。 &#xff08;2&#xff09;hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。 &#xff08;3&…

AI在医学领域:通过声纹特征来预测血糖水平

糖尿病代谢紊乱&#xff08;DM&#xff09;是一种以血糖水平异常为特征的代谢性疾病&#xff0c;其表现为高血糖&#xff08;≥230 mg/dL&#xff09;或低血糖&#xff08;<65 mg/dL&#xff09;。该病导致胰岛素产生或作用受损&#xff0c;胰岛素作为调节葡萄糖稳态的关键激…

20 动态内存管理

目录 一、为什么要有动态内存管理 二、malloc 和 free &#xff08;一&#xff09;malloc &#xff08;二&#xff09;free 三、calloc 和 realloc &#xff08;一&#xff09;calloc &#xff08;二&#xff09;realloc 四、常见的动态内存错误 &#xff08;一&#…

【初阶数据结构】顺序表与链表的比较(附题)

目录 一、顺序表和链表的区别&#xff08;其他链表存在缺陷&#xff0c;比较意义不大&#xff0c;这里用带头双向循环链表与顺序表进行比较&#xff09; 1.1插入、扩容与随机访问 二、缓存利用率的比较 2.1前置知识 详解及补充知识&#xff08;本文仅为比较顺序表及链表&am…

照片怎么转jpg格式?这些照片格式转换方法简单又高效

图片已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;面对多种多样的图片格式&#xff0c;如何高效地将它们转换为最常用的JPG格式&#xff0c;成为了许多人面临的难题。下面给大家分享常用的几种照片格式转换方法&#xff0c;一起来了解下吧。 方法一&#xff1…

数据结构之树体系:二叉树、平衡二叉树、红黑树、AVL树、B树、B+树、最小生成树、哈夫曼树、决策树、LSM树、后缀树、R树

概述 数据结构与算法 二叉树 其中每个结点都不能有多于两个子结点&#xff1a; 满二叉树&#xff1a;若设二叉树的高度为 h h h&#xff0c;除第 h h h层外&#xff0c;其它各层(1&#xff5e;h-1) 的结点数都达到最大个数&#xff0c;最后一层都是叶子结点&#xff0c;且叶…