如何实现连续回归?Matlab下ln(x)回归问题排查求助
解决Matlab中ln(x)在子空间<1,x,x²>上连续与离散回归的问题
我帮你排查了代码里的几个关键问题,咱们一步步梳理并修正:
一、连续回归的核心问题
你直接用V\f做符号除法,这并不是连续最小二乘回归的正确实现方式。连续回归需要基于**内积(积分)**计算Gram矩阵和右端向量,再求解线性方程组得到拟合系数——毕竟连续空间的最小二乘是要最小化积分误差,不是直接做符号运算。
二、离散回归的几个错误点
- 基函数矩阵
V构造错误:应该把三个基函数作为列向量拼接成n×3的矩阵(n是采样点数量),而不是行向量堆叠; - 连续回归得到的
coeffs是符号变量,直接用于数值计算前必须转成数值类型; - 多余的重复
linspace语句完全没用,得删掉; - 前一段的
ezplot没有执行hold off,会导致后续plot的坐标系冲突,引发报错。
修正后的完整代码
clear all close all clc syms x %% 1. 连续回归部分 f = log(x); V = [1, x, x^2]; % 定义基函数 n = length(V); % 计算Gram矩阵G:存储基函数两两的内积(积分) G = sym(zeros(n,n)); for i = 1:n for j = 1:n G(i,j) = int(V(i)*V(j), x, 1, exp(1)); end end % 计算右端向量b:存储基函数与f(x)的内积(积分) b = sym(zeros(n,1)); for i = 1:n b(i) = int(V(i)*f, x, 1, exp(1)); end % 求解拟合系数并转成数值类型 coeffs = double(G\b); a0 = coeffs(1); a1 = coeffs(2); a2 = coeffs(3); fitting_continuous = a0 + a1*x + a2*x^2; % 绘制连续回归结果 figure('Name','连续回归') ezplot(f,[1,exp(1)]) hold on ezplot(fitting_continuous,[1,exp(1)]) legend('f(x)=ln(x)','连续拟合曲线') grid on hold off %% 2. 离散回归部分 % 2.1 生成1000个均匀采样点 xs = linspace(1,exp(1),1000); % 2.2 计算f(x)和基函数的数值 f_values = double(subs(f, x, xs)); % 符号转数值数组 basis_1 = ones(length(xs),1); % 转成列向量 basis_x = xs(:); % 转成列向量 basis_x2 = xs(:).^2; % 转成列向量 % 2.3 构造基函数矩阵,执行离散最小二乘回归 V_discrete = [basis_1, basis_x, basis_x2]; % n×3的矩阵格式 coeffs_discrete = V_discrete \ f_values; % 离散最小二乘求解 % 计算拟合结果 fitting_discrete_values = V_discrete * coeffs_discrete; % 2.4 绘制离散回归结果 figure('Name','离散回归') plot(xs, f_values, 'b-', 'LineWidth',1) hold on plot(xs, fitting_discrete_values, 'r--', 'LineWidth',1.5) legend('f(x)=ln(x)','离散拟合曲线') grid on hold off
代码关键说明
- 连续回归:通过积分计算Gram矩阵和右端向量,严格遵循连续空间最小二乘的数学定义;
- 离散回归:统一用列向量构造基矩阵,完全适配Matlab的最小二乘求解逻辑;
- 所有符号变量转数值后再绘图,彻底避免类型不匹配的报错;
- 分开绘制两个独立窗口,避免坐标系冲突,同时添加网格让结果更直观。
内容的提问来源于stack exchange,提问作者Jorge Carriles
相关产品推荐
相关产品推荐

