使用Maxima求解线性回归方程组时无法处理含求和的方程求助
解决Maxima中线性回归方程组求解问题
看起来你在Maxima里计算线性回归时卡在了求解正规方程组这一步,我来一步步帮你搞定这个问题。
首先,你已经定义了误差平方和:
(%i1) e: sum((y[i] - (a*x[i]+b))^2, i, 1, n);
接下来我们需要对a和b分别求偏导,令导数为0得到线性回归的正规方程组,再让Maxima求解这个方程组。
步骤1:完成偏导数计算
先把对a的偏导计算完整:
(%i2) dea: diff(e, a);
Maxima会输出:
(%o2) -2*sum((y[i] - a*x[i] - b)*x[i], i, 1, n)
接着计算对b的偏导:
(%i3) deb: diff(e, b);
对应的输出是:
(%o3) -2*sum(y[i] - a*x[i] - b, i, 1, n)
步骤2:构造并整理正规方程组
令两个偏导数等于0(可以直接约掉系数-2,不影响解的结果):
(%i4) eq1: sum((y[i] - a*x[i] - b)*x[i], i, 1, n) = 0; (%i5) eq2: sum(y[i] - a*x[i] - b, i, 1, n) = 0;
然后展开这两个方程,让Maxima把它们整理成标准的线性形式:
(%i6) expand(eq1); (%i7) expand(eq2);
展开后会得到清晰的线性方程组:
(%o6) sum(x[i]*y[i], i, 1, n) - a*sum(x[i]^2, i, 1, n) - b*sum(x[i], i, 1, n) = 0 (%o7) sum(y[i], i, 1, n) - a*sum(x[i], i, 1, n) - b*n = 0
步骤3:求解方程组
现在用solve命令直接求解关于a和b的线性方程组:
(%i8) solve([eq1, eq2], [a, b]);
Maxima会给出a和b的解析解(用求和符号表示)。如果你的数据是具体数值(比如n是确定的数,x[i]和y[i]有实际值),可以先给这些变量赋值再执行上述步骤,就能得到具体的数值结果。
常见问题排查
如果还是无法求解,可能是这几个原因:
- 未定义具体变量:如果是数值计算,要先给n赋值(比如
n:5;),再给x[1]到x[n]、y[1]到y[n]设置具体数值。 - 未展开表达式:一定要先执行
expand命令把方程组整理成标准线性形式,再用solve。 - 版本兼容性:你的Maxima版本是5.38.1,虽然这个功能旧版本也支持,但如果有条件升级到新版本,稳定性会更好。
举个数值示例,假设n=3,x=[1,2,3],y=[2,4,5],操作如下:
(%i1) n:3; (%i2) x[1]:1; x[2]:2; x[3]:3; (%i3) y[1]:2; y[2]:4; y[3]:5; (%i4) e: sum((y[i] - (a*x[i]+b))^2, i, 1, n); (%i5) dea: diff(e, a); (%i6) deb: diff(e, b); (%i7) eq1: dea=0; (%i8) eq2: deb=0; (%i9) solve([eq1, eq2], [a, b]);
执行后会得到具体解:[[a = 3/2, b = 1/2]],对应回归方程为y = 1.5x + 0.5。
内容的提问来源于stack exchange,提问作者Thomas Sablik
相关产品推荐
相关产品推荐

