24小时热门版块排行榜    

CyRhmU.jpeg
查看: 2409  |  回复: 22

xzczd

木虫 (小有名气)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
loujing: 金币+20, ★★★★★最佳答案 2016-01-11 09:34:03
引用回帖:
20楼: Originally posted by loujing at 2016-01-08 18:15:38
追问一下,在得到这里的联立方程组后,符号推导的工作是不是就可以算结束了?

如果接下来,我给出具体的一组(x_i,y_i),如何再利用这里的推导,计算出具体的w_j?...

说结束也算结束了,说没结束也没结束,4楼的推导在这之后又多了一步,是把之前的结果写成了矩阵乘法的形式,这个其实是矩阵点乘规则的直接应用,,但是如果你想把这步也交给软件推导的话,我可以告诉你这个规则又是没在Mathematica里内置的。用上面提及的模式匹配当然可以进一步变形……不过,硬变过去真没啥意思(两者在编程实现上的区别也不算很大,而且如果对线代熟悉的话这步变形实际上靠目视即可确认)所以这里就不弄了。

其实,如果一开始的目标就是数值解,或者点数和多项式阶数都是具体的数的解析解的话,整个问题的求解会简单很多……不过既然你非要利用这里的推导的话:
CODE:
(*之前的代码我就不复制了*)
n = 3; m = 2;
points = RandomReal[1, {n, 2}];

{x[i_], y[i_]} := {points[[i, 1]], points[[i, 2]]};

var = w /@ Range[0, m];
Solve[Table[eqn, {j, 0, m}], var][[1]]
(var /. %).x^Range[0, m]
Show[Plot[%, {x, Min[points[[All, 1]]], Max[points[[All, 1]]]}], ListPlot[points],
PlotRange -> All]
Clear[x, y]

如果要用矩阵形式的那个公式的话:
CODE:
{xlist, ylist} = points\[Transpose];
With[{xm = #^Range[0, m] & /@ xlist}, Solve[ylist.xm == var.xm\[Transpose].xm, var]]

最后,如果一开始就定了阶数的话:
CODE:
f[i_, m_, x_] := Sum[w@j*x[[i]]^j, {j, 0, m}]
l[m_, n_, x_, y_] := 1/2 Sum[(f[i, m, x] - y[[i]])^2, {i, n}];
n = 4; m = 2;
var = w /@ Range[0, m];
{xlist, ylist} = Transpose@RandomReal[1, {n, 2}];
NSolve[D[l[m, n, xlist, ylist], {var}], var]
Show[ListPlot[Transpose[{xlist, ylist}]],
Plot[Evaluate[var.x^Range[0, m] /. %], {x, 0, 1}], PlotRange -> All]

最后的最后,虽然知道你是在学习这种方法所以大概对此不太关心,但是,线性拟合在Mathematica里是内置的,你可以看看Fit和LinearModelFit的帮助。
小木虫Mathematica版块已毁(当然原本也不咋的),建议大家前往百度贴吧或Stackexchange。
21楼2016-01-08 21:36:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xzczd

木虫 (小有名气)

【答案】应助回帖

引用回帖:
21楼: Originally posted by xzczd at 2016-01-08 21:36:58
说结束也算结束了,说没结束也没结束,4楼的推导在这之后又多了一步,是把之前的结果写成了矩阵乘法的形式,这个其实是矩阵点乘规则的直接应用,,但是如果你想把这步也交给软件推导的话,我可以告诉你这个规则又是 ...

啊,第一段代码漏贴了eqn的定义:
CODE:
eqn = (D[l /. rulej1[w@j], w[j]] /. {rulej2, rulej3} //. {ruleExpand, ruleDistribute,
      ruleExtract} // Expand) == 0

小木虫Mathematica版块已毁(当然原本也不咋的),建议大家前往百度贴吧或Stackexchange。
22楼2016-01-08 21:45:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zhuxm888

铁虫 (初入文坛)

引用回帖:
18楼: Originally posted by xzczd at 2016-01-08 17:59:09
……刚发现我为了凑出和你的顶楼相似的结果犯了个错误。盯着四楼的图看了半天(真伤眼),现在我基本确定,正确的推导是:

f := Sum
l = 1/2 Sum;

rulej1 := Sum /; ! FreeQ :> sum
rulej2 = sum' :> ...

ruleDistribute =
  Sum[expr1_ + expr2_, i_] :> Sum[expr1, i] + Sum[expr2, i];
运行这句的时候,为什么我用的mathematica 7.0 显示
Rule::rhs: Pattern i_ appears on the right-hand side of rule i_->1+i_. >>
一个坚强的小虫
23楼2017-03-20 15:23:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 loujing 的主题更新
信息提示
请填处理意见